第一次是調度器初始化函數中,創建這個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下載器中,原教程使用的是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)。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com