2014-02-13 104 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