使用BeautifulSoup进行多处理以改善Wikipedia抓取

卡梅伦

我正在使用BeautifulSoup从一堆Wikipedia页面上抓取一些基本信息。该程序运行,但是运行缓慢(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

我尝试使用下面的代码在脚本末尾添加处理,但是它不起作用或仅拉出每个页面的首字母(例如,如果我要搜索的页面是李小龙,它将而是拉出维基百科页面上的字母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()

有没有更好的方法来构造脚本以进行多处理?

戈戈伦

这里有一些问题:

  • dictionaryall_wikis字典中的每个字符串键当您使用遍历该字符串时for key in dictionary:,它将访问字符串中的每个字符。您的第一个请求是https://en.wikipedia.org/wiki/A,这不是理想的结果。
  • str(key)即使dictionary是名字也不是很有帮助我们需要使用来查找正确的URL all_wikis[name]顺带一提,请避免使用通用变量,例如dictionary
  • 由于您要进行多处理,因此bios需要共享类似的数据才能进行操作。最简单的方法是仅使用map函数的返回值,该返回值是所有辅助函数返回值的总和。
  • 抓取存在逻辑问题。wikipedia.summary未定义。如果不确定您确切想要的结果,则表示亚当·桑德勒(Adam Sandler)已故。我将其留给读者练习,因为这个问题主要是关于多处理的。
  • 我不确定在这里多处理是否像多线程一样可取。由于您的进程将被阻止在99%的时间内发出请求,因此我敢打赌,与您拥有的内核数量相比,使用更多的线程(或进程)可以获得更高的效率。当您需要进行CPU限制的工作时,多处理更为合适,在这种情况下不是这样。实际上,Python过程本身将花费很少的时间。我建议通过增加进程(或线程,如果要重构,则增加线程数)超过核心数量来测试代码,直到您停止看到改进为止。

这是一些入门的代码。我坚持按照您的示例进行多处理,但没有调整网络抓取逻辑。

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)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Wikipedia上使用BeautifulSoup进行Web抓取

来自分类Dev

使用Python进行多处理?

来自分类Dev

使用多处理或多线程来提高Python的抓取速度

来自分类Dev

使用Screen和Bash进行多处理

来自分类Dev

使用wxPython进行多处理无响应

来自分类Dev

使用 Pool() 进行 Python 多处理

来自分类Dev

使用python和BeautifulSoup进行网络抓取

来自分类Dev

使用Python,BeautifulSoup进行Web抓取

来自分类Dev

使用BeautifulSoup到Dataframe进行Web抓取

来自分类Dev

使用 BeautifulSoup FindAll 进行网页抓取

来自分类Dev

如何使用 BeautifulSoup 进行网页抓取

来自分类Dev

使用 BeautifulSoup 进行网页抓取 -- Python

来自分类Dev

使用 Python BeautifulSoup 进行网页抓取

来自分类Dev

Python - 使用 BeautifulSoup 和 Urllib 进行抓取

来自分类Dev

多线程/多处理加快抓取

来自分类Dev

使用python和BaseProcess类进行多处理

来自分类Dev

使用Python进行Popen,多处理和守护程序

来自分类Dev

正确使用多处理程序进行图像下载

来自分类Dev

使用ProcessPoolExcecutor进行多处理会产生意外结果

来自分类Dev

如何使用tensorflow-gpu对子任务进行多处理?

来自分类Dev

使用Python进行Popen,多处理和守护程序

来自分类Dev

如何在 Python 中使用多处理来使用 Scrapy 抓取数百万个 url?

来自分类Dev

使用BeautifulSoup使用python进行网络抓取,发现错误

来自分类Dev

使用python从Wikipedia抓取表格?

来自分类Dev

如何准备使用整个Wikipedia进行自然语言处理?

来自分类Dev

使用Beautifulsoup进行网页抓取,带来了不同的内容

来自分类Dev

使用BeautifulSoup遍历URL列表进行Web抓取

来自分类Dev

使用BeautifulSoup进行Web抓取-无法提取表行

来自分类Dev

在Python标签中使用BeautifulSoup进行网络抓取

Related 相关文章

  1. 1

    在Wikipedia上使用BeautifulSoup进行Web抓取

  2. 2

    使用Python进行多处理?

  3. 3

    使用多处理或多线程来提高Python的抓取速度

  4. 4

    使用Screen和Bash进行多处理

  5. 5

    使用wxPython进行多处理无响应

  6. 6

    使用 Pool() 进行 Python 多处理

  7. 7

    使用python和BeautifulSoup进行网络抓取

  8. 8

    使用Python,BeautifulSoup进行Web抓取

  9. 9

    使用BeautifulSoup到Dataframe进行Web抓取

  10. 10

    使用 BeautifulSoup FindAll 进行网页抓取

  11. 11

    如何使用 BeautifulSoup 进行网页抓取

  12. 12

    使用 BeautifulSoup 进行网页抓取 -- Python

  13. 13

    使用 Python BeautifulSoup 进行网页抓取

  14. 14

    Python - 使用 BeautifulSoup 和 Urllib 进行抓取

  15. 15

    多线程/多处理加快抓取

  16. 16

    使用python和BaseProcess类进行多处理

  17. 17

    使用Python进行Popen,多处理和守护程序

  18. 18

    正确使用多处理程序进行图像下载

  19. 19

    使用ProcessPoolExcecutor进行多处理会产生意外结果

  20. 20

    如何使用tensorflow-gpu对子任务进行多处理?

  21. 21

    使用Python进行Popen,多处理和守护程序

  22. 22

    如何在 Python 中使用多处理来使用 Scrapy 抓取数百万个 url?

  23. 23

    使用BeautifulSoup使用python进行网络抓取,发现错误

  24. 24

    使用python从Wikipedia抓取表格?

  25. 25

    如何准备使用整个Wikipedia进行自然语言处理?

  26. 26

    使用Beautifulsoup进行网页抓取,带来了不同的内容

  27. 27

    使用BeautifulSoup遍历URL列表进行Web抓取

  28. 28

    使用BeautifulSoup进行Web抓取-无法提取表行

  29. 29

    在Python标签中使用BeautifulSoup进行网络抓取

热门标签

归档