繁体   English   中英

在Python 3中使用多处理的Web爬虫

[英]Web Crawler with multiprocessing in Python 3

我基本上试图获得与下面的代码相同的结果,但使用多处理。 下面的代码是一个基本的Web爬网程序,可以打印给定网站中的所有URL。 我希望能够使用多个进程一次检查来自多个站点的新URL。 我有一个单独的Web抓取脚本,它使用pool和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)

似乎scrapy可以完美地满足您的需求,它可以并行调用url,内部有一个队列来累积请求,甚至内置了xpath功能,最好的部分是它通过使用扭曲库异步编程实现所有这些而无需多处理

更好的是使用Asyncio Python3 / aiohttp。 它是非阻塞的,可以同时获取多个URL而无需产生线程或使用扭曲(scrapy)框架。 检查此链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM