2014-02-13 105 views
0

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

我读过左右,我觉得自己像队列可能对解决方案的关键,但我已经竭尽所能,并无法得到它的工作。对不起,蹩脚的解释。我对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) 

回答

1

好像scrapy可以完美地满足您的需求,它调用并行的网址,有一个队列内的累积请求,甚至有内置的XPath能力,和最好的部分是,它是做这一切多用双绞线库异步编程

+0

欣赏响应。但是Scrapy不只适用于Python 2?我希望能找出解决的办法在Python 3 – rhhrock

+0

你是对的,scrapy不支持Python 3的是,如果蟒蛇2不适合你,我想你必须自己实现多进程的解决方案的选项...不一个简单的任务 –

1

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