爬蟲的基礎知識到這裏,已經能夠暫時告一段落,接下來就是學會使用框架來寫爬蟲,用框架會使爬蟲代碼更加簡潔。在這以前,我也瞭解了一下關於Python爬蟲都有哪些框架html
Python經常使用爬蟲框架python
1.scrapy (推薦)
地址:https://scrapy.org/
Scrapy,Python開發的一個快速、高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化的數據。Scrapy用途普遍,能夠用於數據挖掘、監測和自動化測試。另外,Scrap,是碎片的意思,這個Python的爬蟲框架叫Scrapyweb
2.Crawley
地址:http://project.crawley-cloud.com/
高速爬取對應網站的內容,支持關係和非關係數據庫,數據能夠導出爲JSON、XML等sql
3.Portia
地址:https://scrapinghub.com/portia數據庫
Portia 是 scrapyhub 開源的一款可視化爬蟲規則編寫工具。Portia 提供了可視化的 Web 頁面,只需經過簡單點擊,標註頁面上需提取的相應數據,無需任何編程知識便可完成爬取規則的開發。這些規則還可在 Scrapy 中使用,用於抓取頁面編程
4.PySpider
地址:http://www.pyspider.cn/
PySpider:一個國人編寫的強大的網絡爬蟲系統並帶有強大的WebUI。採用Python語言編寫,分佈式架構,支持多種數據庫後端,強大的WebUI支持腳本編輯器,任務監視器,項目管理器以及結果查看器後端
5.grab
地址:http://www.imscraping.ninja/posts/introducing-grab-framework-python-webscraping/
網絡爬蟲框架(基於pycurl/multicur)
接下來我首先選擇了pyspider框架的使用來了解爬蟲框架,第一次使用該框架,發現媽媽不再用擔憂我學不會爬蟲了api
PySpdier的前期準備瀏覽器
1.安裝pyspiderbash
pip3 install pyspider
2.安裝Phantomjs:在官網下載解壓後,並將pathtomjs mv到usr/bin路徑下
下載地址:https://phantomjs.org/dowmload.html
官方API地址:http://www.pyspider.cn/book/pyspider/self.crawl-16.html
3.PySpider
①多進程處理
②去重處理
③錯誤嘗試
④PyQuery提取
⑤結果監控
⑥WebUI管理
⑦代碼簡潔
⑧JavaScript渲染
使用流程
1.首先啓動pyspider
pyspider all
2.而後就會出現以下圖所示,提醒咱們在瀏覽器輸入localhost:5000便可進入控制檯頁面
3.在web控制檯點create按鈕新建任務,項目名自定義,本例項目名爲Web
4.點擊進入建立的項目,能夠看到以下所示的一些函數
#!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2015-10-08 12:45:44 # Project: test from pyspider.libs.base_handler import * class Handler(BaseHandler): crawl_config = { } @every(minutes=24 * 60) def on_start(self): self.crawl('http://scrapy.org/', callback=self.index_page) @config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc('a[href^="http"]').items(): self.crawl(each.attr.href, callback=self.detail_page) @config(priority=2) def detail_page(self, response): return { "url": response.url, "title": response.doc('title').text(), }
代碼簡單分析:
①def on_start(self) 方法是入口代碼。當在web控制檯點擊run按鈕時會執行此方法
②self.crawl(url, callback=self.index_page)這個方法是調用API生成一個新的爬取任務,這個任務被添加到待抓取隊列
③def index_page(self, response) 這個方法獲取一個Response對象。 response.doc是pyquery對象的一個擴展方法。pyquery是一個相似於jQuery的對象選擇器。
④def detail_page(self, response)返回一個結果集對象。這個結果默認會被添加到resultdb數據庫(若是啓動時沒有指定數據庫默認調用sqlite數據庫)。你也能夠重寫
⑤on_result(self,result)方法來指定保存位置
更多知識:
①@every(minutes=24*60, seconds=0) 這個設置是告訴scheduler(調度器)on_start方法天天執行一次
②@config(age=10 * 24 * 60 * 60) 這個設置告訴scheduler(調度器)這個request(請求)過時時間是10天,10天內再遇到這個請求直接忽略。這個參數也能夠在self.crawl(url, age=10*24*60*60) 和 crawl_config中設置
③@config(priority=2) 這個是優先級設置。數字越大越先執行
5.上面已經編寫的代碼使用了response.doc,不難發現其用的是PyQuery的解析庫,以訪問個人我的網站爲例,將http://scrapy.org/改成:http://www.jzfblog.com/,並將文章信息存儲到MongoDB數據庫中
#!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2018-08-10 08:25:51 # Project: MyWeb from pyspider.libs.base_handler import * import pymongo class Handler(BaseHandler): crawl_config = { } client = pymongo.MongoClient('localhost') db = client['myWeb'] @every(minutes=24 * 60) def on_start(self): self.crawl('http://www.jzfblog.com/blog', callback=self.index_page) @config(age=10 * 24 * 60 * 60) def index_page(self, response): for each in response.doc('.blog-title > a').items(): self.crawl(each.attr.href, callback=self.detail_page) next = response.doc('div.paginator > ul > li:last-child > a').attr.href print(next) self.crawl(next,callback=self.index_page) @config(priority=2) def detail_page(self, response): name = response.doc('.blog-name').text() detail = response.doc('.blog-info-description > li').text() return { "name": name, "detail": detail, } def on_result(self,result): # 有結果就執行 if result: self.save_to_mongo(result) def save_to_mongo(self,result): if self.db['blog'].insert(result): print('Saved to Mongo', result)
6.點擊run運行調試一下,便可看到
7.返回到所有項目首頁,將status修改成debug或running,而後點擊run便可將代碼一鍵回調執行
①TODO- 當一個腳本剛剛被建立時的狀態
②STOP- 你能夠設置項目狀態爲STOP讓項目中止運行
③CHECKING- 當一個運行中的項目被編輯時項目狀態會被自動設置成此狀態並中止運行.
④DEBUG/RUNNING- 這兩狀態都會運行爬蟲,可是他們之間是有區別的.通常來講調試階段用DEBUG狀態,線上用RUNNING狀態.
⑤rate- 每秒執行多少個請求.
⑥burst- 設置併發數,如:rate/burst = 0.1/3,這個的意思是爬蟲10秒爬一個頁面.可是開始時前三個任務會同時時行,不會等10秒,第四個任務爬取前會等10秒.
⑦項目刪除:把group設置成delete並把項目狀態設置成STOP,24小時後系統會自動刪除此項目.
8.查看MongoDB數據庫
原文出處:https://www.jzfblog.com/detail/73,文章的更新編輯以此連接爲準。歡迎關注源站文章!