python之調度器的用法

零下一度
發布: 2017-06-25 10:15:33
原創
1776 人瀏覽過

  繼續上一篇文章的內容,上一篇文章中,將爬蟲調度器已經寫好了,調度器是整個爬蟲程序的“大腦”,也可以稱之為指揮中心。而現在,我們要做的就是去將調度器中用到的其他元件寫好。首先是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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板