【问题标题】:Web Crawler with multiprocessing in Python 3Python 3 中具有多处理功能的 Web 爬虫
【发布时间】:2014-02-13 00:35:06
【问题描述】:

我基本上试图获得与下面的代码相同的结果,但使用的是多处理。下面的代码是一个基本的网络爬虫,它打印给定网站中的所有 URL。我希望能够使用多个进程一次检查来自多个站点的新 URL。我有一个单独的网络抓取脚本,它使用池和 apply_async 一次抓取多个站点,但我从一个静态的 URL 列表开始。然后我有这个脚本,它一次遍历一个站点以获取完整的非重复 URL 列表。我不知道如何获得两全其美。因为我的 URL 列表不是静态的(它会在找到新 URL 时添加),所以我不知道如何遍历它并使用 apply_async 返回结果。

我已经阅读过,我觉得队列可能是解决方案的关键,但我已经尝试了所有方法,但无法让它发挥作用。对不起,糟糕的解释。我对python还是很陌生。有人可以帮忙吗?

import lxml.html
import requests

url = "http://www.frontiercouriers.com"
url_check = "frontiercouriers.com"
urls = [url]
visited = [url]

while len (urls) >0:
    try:
        site_open = requests.get(urls[0])
        soup = lxml.html.fromstring(site_open.text)

        urls.pop(0)

        for href in soup.xpath('//a/@href'):
            if 'http' in href:
                site = href
            elif href.startswith('/'):
                site = str(url+href)
            else:
                site = str(url+'/'+href)

            if url_check in site and site not in visited:
                urls.append(site)
                visited.append(site)
                print (site)

    except Exception as e:
          print ("\n"+str(e))
          print (urls[0])
          urls.pop(0)

【问题讨论】:

    标签: python python-3.x queue multiprocessing web-crawler


    【解决方案1】:

    似乎scrapy 可以完美地满足您的需求,它并行调用 url,内部有一个用于累积请求的队列,甚至内置了 xpath 功能,最好的部分是它可以做到这一切没有 使用扭曲库异步编程进行多处理

    【讨论】:

    • 感谢您的回复。但是 Scrapy 不是只适用于 Python 2 吗?我希望在 Python 3 中找到解决方案。
    • 你说得对,scrapy 还不支持 python 3,如果你不能选择 python 2,我想你必须自己实现一个多进程解决方案......这不是一件容易的事跨度>
    【解决方案2】:

    最好使用 Asyncio Python3/aiohttp。它是非阻塞的,可以同时获取多个 url,而不需要产生线程或使用扭曲(scrapy)框架。 Check this link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      相关资源
      最近更新 更多