- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 BeautifulSoup 从一堆维基百科页面中抓取一些基本信息。程序运行,但速度很慢(650 页大约需要 20 分钟)。我正在尝试使用多处理来加快速度,但它没有按预期工作。它要么似乎被阻止而不执行任何操作,要么只抓取每个页面名称的第一个字母。
我使用的抓取代码是:
#dict where key is person's name and value is proper wikipedia url formatting
all_wikis = { 'Adam Ferrara': 'Adam_Ferrara',
'Adam Hartle': 'Adam_Hartle',
'Adam Ray': 'Adam_Ray_(comedian)',
'Adam Sandler': 'Adam_Sandler',
'Adele Givens': 'Adele_Givens'}
bios = {}
def scrape(dictionary):
for key in dictionary:
#search each page
page = requests.get(("https://en.wikipedia.org/wiki/" + str(key)))
data = page.text
soup = BeautifulSoup(data, "html.parser")
#get data
try:
bday = soup.find('span', attrs={'class' : 'bday'}).text
except:
bday = 'Birthday Unknown'
try:
birthplace = soup.find('div', attrs={'class' : 'birthplace'}).text
except:
birthplace = 'Birthplace Unknown'
try:
death_date = (soup.find('span', attrs={'style' : "display:none"}).text
.replace("(", "")
.replace(")", ""))
living_status = 'Deceased'
except:
living_status = 'Alive'
try:
summary = wikipedia.summary(dictionary[key].replace("_", " "))
except:
summary = "No Summary"
bios[key] = {}
bios[key]['birthday'] = bday
bios[key]['home_town'] = birthplace
bios[key]['summary'] = summary
bios[key]['living_status'] = living_status
bios[key]['passed_away'] = death_date
我尝试使用下面的代码将处理添加到脚本的末尾,但它不起作用或仅提取每个页面的第一个字母(例如,如果我正在搜索的页面是 Bruce Lee ,它会调出字母 B 的维基百科页面,然后抛出一堆错误)。
from multiprocessing import Pool, cpu_count
if __name__ == '__main__':
pool = Pool(cpu_count())
results = pool.map(func=scrape, iterable=all_wiki)
pool.close()
pool.join()
是否有更好的方法来构建我的脚本以允许多重处理?
最佳答案
这里有几个问题:
dictionary
是 all_wikis
字典中的每个字符串键。然后,当您使用 for key indictionary:
迭代此字符串时,将访问字符串中的每个字符。您的第一个请求是 https://en.wikipedia.org/wiki/A
,这不是所需的结果。dictionary
是一个名称,
str(key)
也没有真正的帮助。我们需要使用 all_wikis[name]
查找正确的 URL。顺便说一句,避免使用诸如字典之类的通用变量。bios
之类的数据才能进行操作。最简单的方法是仅使用 map
函数的返回值,它是所有工作函数返回值的聚合。wikipedia.summary
未定义。在不确定您确切想要的结果的情况下,它报告亚当·桑德勒已死亡。我将把这个问题作为练习留给读者,因为这个问题主要是关于多处理的。这里有一些代码可以帮助您入门。我坚持按照您的示例进行多重处理,并且没有调整网络抓取逻辑。
import requests
from bs4 import BeautifulSoup
from multiprocessing import Pool, cpu_count
all_wikis = {'Adam Ferrara': 'Adam_Ferrara',
'Adam Hartle': 'Adam_Hartle',
'Adam Ray': 'Adam_Ray_(comedian)',
'Adam Sandler': 'Adam_Sandler',
'Adele Givens': 'Adele_Givens'}
def scrape(name):
data = requests.get("https://en.wikipedia.org/wiki/" + all_wikis[name]).text
soup = BeautifulSoup(data, "html.parser")
bio = {}
try:
bio['birthday'] = soup.find('span', attrs={'class': 'bday'}).text
except:
bio['birthday'] = 'Birthday Unknown'
try:
bio['home_town'] = soup.find('div', attrs={'class': 'birthplace'}).text
except:
bio['home_town'] = 'Birthplace Unknown'
try:
bio['passed_away'] = (soup.find('span', attrs={'style': "display:none"}).text
.replace("(", "")
.replace(")", ""))
bio['living_status'] = 'Deceased'
except:
bio['living_status'] = 'Alive'
bio['summary'] = "No Summary"
return name, bio
if __name__ == '__main__':
pool = Pool(cpu_count())
bios = dict(pool.map(func=scrape, iterable=all_wikis))
pool.close()
pool.join()
print(bios)
关于python - 使用 BeautifulSoup 进行多处理来改进 Wikipedia 抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58761498/
我正在尝试在维基百科上找到所有图像的完整列表,然后我可以将其过滤到公共(public)领域的图像。我已经从这里下载了 SQL 转储: http://dumps.wikimedia.org/enwiki
我正在学习使用 rasa 语言。为了使目标的答案多样化,我决定使用 Wikipedia api。为了创建我的工作环境,我使用带有以下命令的 anaconda: conda create --name
本页:http://wikidata.dbpedia.org/downloads/20160111/ 有一个名为 wikidatawiki-20160111-page-ids.ttl.bz2 的转储
这个问题已经有答案了: How to get the Infobox data from Wikipedia? (8 个回答) 已关闭 3 年前。 维基百科文章可能有信息框模板。通过以下调用,我可以获
我正在使用 Wikipedia API,在其中获取我输入的某些字符串的图像。 它总是返回 10 个结果,但我想要超过大约 50 个。 https://en.wikipedia.org/w/api.ph
我需要从 jquery(首选)或 php 数组中的特定维基百科文章获取“外部链接”链接。我已经浏览了维基百科 api,但似乎没有办法做到这一点。看起来 dbpedia 有一种方法可以做到这一点(dbp
我想在 python 程序中访问给定文章标题的维基百科信息框图像。有人可以告诉我如何获得吗? 以下截图提供了页面中所有图像的列表。我只想访问信息框图像。我该怎么做? import wikipedia
给定维基百科上的任何页面,例如 Coffee 的页面,我试图弄清楚如何提取页面上所有引用(包括任何元数据)的列表。乍一看,这似乎很容易,因为大多数页面都将它们全部列在称为“引用”的部分下。但是,当您检
我想计算特定语言的 wiki 转储中的实体/类别,比如英语。对于初学者来说,很难找到/遵循官方文档。到目前为止我所了解的是我可以下载一个 XML 转储(我从所有可用的不同文件中下载什么),并解析它(?
是否有任何 API 可以使用该页面的标题或页面 ID 或 url 获取页面的所有类别?我尝试在网上搜索,但我能找到的只是获取特定类别的转储。任何形式的帮助将不胜感激。 谢谢 最佳答案 您正在寻找的 A
Closed. This question is off-topic。它当前不接受答案。 想要改善这个问题吗? Update the question,所以它是用于堆栈溢出的on-topic。 9年前
我正在尝试构建维基百科文章及其类别的树形图。我需要做什么? 从这个站点(http://dumps.wikimedia.org/enwiki/latest/),我下载了: enwiki-latest-p
我使用 Wikipedia API 检索给定类别的页面列表。然而,页面由它们的 page_id 表示。如何使用 Wikipedia API 通过 page_id 获取页面的实际文本内容 最佳答案 AF
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
以这个Freebase查询为例,如何使用Wikidata API运行相同的查询? [{ "id": null, "name": null, "type": "/film/film",
有没有一种方法可以使用 MediaWiki API 或任何其他工具自动检索使用大概日期的维基百科文章的先前版本(不知道 'oldid' 值)? 例如,我如何检索 history version of
从Wikipedia获取有关人员的所有文章的最简单方法是什么?我知道我可以下载所有页面的转储,但是然后如何过滤这些页面并仅获取有关人员的页面?我需要尽可能多的东西(最好超过一百万),因此使用任何一种A
有这个花哨的infobox在 中。如何获得 的值? 最佳答案 错误的方法:尝试解析 HTML Use (cURL/jQuery/file_get_contents/requests/wget/mor
我需要检索某个 wiki 项目的所有现有语言的列表。例如,所有 Wikivoyage或全部Wikipedia语言,就像他们的登陆页面一样。 如果可能的话,我更喜欢通过 MediaWiki API 来完
我需要访问非常旧的法语维基百科转储(维基百科的备份)。我成功地从 archive.org 找到了 2010 年的备份,现在我正在搜索 2006 年甚至更早的版本。我知道在最新的转储中包含以前的所有数据
我是一名优秀的程序员,十分优秀!