繼續上一篇文章的內容,上一篇文章中,將爬蟲調度器已經寫好了,調度器是整個爬蟲程序的“大腦”,也可以稱之為指揮中心。而現在,我們要做的就是去將調度器中用到的其他元件寫好。首先是url管理器,它既然作為管理器,那麼它一定要區分待爬取的url和已經爬取的url,否則會重複爬取。這裡教學用的是set集合,將兩個url暫時存放到集合中,也就是記憶體中,畢竟比較爬取的資料比較少,當然也可以存放到別的地方,例如快取或關係型資料庫。
第一次是調度器初始化函數中,建立這個urlmanager對象,
第二次是呼叫了add_new_url方法將最初始的url加入到帶爬取的集合中,帶爬取的集合中,
第三次是在爬取過程中來判斷是否有待爬取的url,
第四次是將要爬取的url從集合中取出來,
# 第五次是將頁面解析出來的新的一組url再次添加到帶爬去集合中
那麼我們接下來就要做的是用程式碼來實現這些功能:
1 class UrlManager(object): 2 """docstring for UrlManager""" 3 def __init__(self): 4 self.new_urls = set() 5 self.old_urls = set() 6 #向管理器中添加一个新的url 7 def add_new_url(self,url): 8 if url is None: 9 return10 if url not in self.new_urls and url not in self.old_urls:11 self.new_urls.add(url)12 #从爬取数据中向管理器中批量添加url13 def add_new_urls(self,urls):14 if urls is None or len(urls) == 0:15 return16 for url in urls:17 self.add_new_url(url)18 #判断是否有新的url19 def has_new_url(self):20 return (len(self.new_urls) != 0)21 #从管理器中取出一个新的url22 def get_new_url(self):23 new_url = self.new_urls.pop()24 self.old_urls.add(new_url)25 return new_url
好,到這,url管理器就搞定了!
接下來就是url下載器了,很簡單一個功能,將程式存取的頁面儲存下來。
下載器只在調度器中出現過兩次:
第一次是初始化的時候創建
第二次是緊接著是初始化的時候創建
第二次是緊接著是url之後,馬上取到url之後,馬上取到呼叫它來下載頁面
在url下載器中,原教程使用的是urllib庫,我覺得有點繁瑣。所以我換了一個更好用的函式庫:requests。這個函式庫可以幫助我封鎖許多技術難題,直接去抓取我們想要存取的頁面,而且使用起來非常簡單。
1 import requests 2 3 class HtmlDownloader(object): 4 """docstring for HtmlDownloader""" 5 def download(self,url): 6 if url is None: 7 return 8 response = requests.get(url, timeout = 0.1) 9 response.encoding = 'utf-8'10 if response.status_code == requests.codes.ok:11 return response.text12 else:13 return
簡單講一下這段程式碼:
a.首先要導入requests函式庫,這個因為是第三方函式庫,所以需要你自己下載,在命令列輸入:pip install requests
b.然後開始寫下載器這個類,這個類別只有一個方法,就是download。這個方法首先會接受你給定的url,然後對其進行判斷是否存在。
c.然後呼叫requests的get方法,它裡面接受兩個參數,一個是url,還有一個是timeout
timeout是我自己加進去的,就是超訪問時。如果不加timeout,程式會假死,也就是說會一直在那裡等待頁面的回應,也不拋出異常。
d.然後對返回的response進行編碼設置,因為爬取的百度百科頁面是utf-8,所以這裡最好還是設置一下,雖然requests會智能判斷,但是還是手動改一下為宜。
e.然後在判斷頁面是否回應,這裡的codes.ok其實就是200,表示網頁正常回應,你這裡直接寫 response.status_code == 200 也沒問題。
f.最後,將頁面的所有內容都返回,這裡的text就是一個字串,它包含了一個頁面的所有程式碼(html,css,js)。
### ###以上是python之調度器的用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!