scrapy爬蟲這個東西我就很少作介紹了,總之是一個很好用的Python爬蟲庫,且關於scrapy也有較多的教程。這篇文章記錄一下我我的的項目規劃和天坑心得。javascript
一般來講,咱們執行了scrapy startproject example
後就會建立這樣的一個文件結構,大體以下:java
├── example │ ├── __init__.py │ ├── __pycache__ │ ├── items.py │ ├── middlewares.py │ ├── pipelines.py │ ├── settings.py │ └── spiders │ ├── __init__.py │ └── __pycache__ └── scrapy.cfg
咱們一般寫爬蟲都是在spiders裏寫爬蟲解析規則,以及編寫數據存儲程序。python
咱們首先來看爬蟲程序,最基本是如下這個樣子:web
import scrapy from sqlalchemy import distinct class ExampleSpider(scrapy.Spider): name = 'example_spider' allowed_domains = [] start_urls = [ 'https://www.example.com' ] def parse(self,response): pass
這樣的一個基本爬蟲,只要配置好start_urls,在這裏寫上咱們想要去爬的URL,能夠編寫不少個,start_urls是一個數組。而後執行scrapy crawl example_spider
就會自動去爬數據了。這裏的parse
方法是繼承父類scrapy.Spider的解析方法,此處沒有作任何結果解析以及存儲。sql
在這個地方,其實咱們要注意一點是,ExampleSpider這個類名咱們能夠瞎姬霸命名,咱們在調用scrapy crawl [爬蟲名]
的時候,這個爬蟲名是根據這個類裏的name
屬性來的,此處的name
爲example_spider
,因此咱們在執行的時候就是:scrapy crawl example_spider
。固然在具體的編寫過程當中我我的建議是不要瞎姬霸命名,按照業務邏輯來。chrome
再回頭看我上面所展現的文件夾結構,隨着業務的增加,咱們極可能編寫個成百上千的爬蟲,那麼每一個爬蟲都放到spiders
一個文件夾裏的話,要理清的話就要花大力氣了,而實際上,在spiders
其實能夠建立任意的子文件夾進行邏輯上的分類,執行crawl
的時候,會自動去遍歷路徑找到咱們制定的爬蟲,至於你編寫了哪些爬蟲,一樣能夠經過crapy list
列出來。segmentfault
分頁爬蟲技巧,其實在搜索引擎上都能找到,並且在segmentfault上都能搜到相應的解答,主要就在parse
方法中判斷條件或者說找到下一頁的URL,而後用協程yield
一下scrapy.Request
就能夠了,也就是用協程方式手動執行一下scrapy的Request
方法,對於Request具體的返回,我沒有深刻看源代碼研究,大概是在scrapy的底層再次作了必定的處理,實際的請求並非Request
類發起的。數組
這裏要結合一些緣由來進行說明。瀏覽器
因此從上面兩方面來講,咱們在本身寫的爬蟲類中加上一個類屬性download_delay
,如dom
import scrapy from sqlalchemy import distinct class ExampleSpider(scrapy.Spider): download_delay = 1 # 1s鍾發起一次請求,當前爬蟲執行過程當中,對任何位置的Reqeust都有效 name = 'example_spider' allowed_domains = [] start_urls = [ 'https://www.example.com' ] def parse(self,response): pass
另外就是在settings.py
設置
DEFAULT_REQUEST_HEADERS = { 'user-agent' : 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3423.2 Mobile Safari/537.36' }
一個這樣的header頭,模擬手機瀏覽器。
在作爬蟲的時候,很是重要的一點就是錯誤日誌的記錄,一般來講咱們在settings.py
中配置如下兩個參數:
LOG_LEVEL = 'DEBUG' LOG_FILE = './log.log' # 錯誤日誌記錄文件及路徑
一般來講,咱們最好是把LOG_LEVEL
設置爲DEBUG
,也就是說,咱們把全部的調試信息都輸入到錯誤日誌中進行記錄,方便檢查編寫爬蟲過程當中可能出現的任何問題,儘量的確保每一個環節不出錯。
若是沒有意識到錯誤日誌的重要性,在寫爬蟲的過程當中只能抓瞎了,我是踩了好幾回大坑纔有過這種覺悟。
數據存儲,我我的用的是sqlalchemy
,是一個很強大的庫,我我的也作了些基礎的封裝,使用起來更方便。
數據存儲一方面多是在parse
方法中進行解析後處理,另外的話,parse能夠進行統一解析,而後在close
進行所有批量存儲,主要看具體的業務邏輯狀況。
最坑爹的問題就是要千萬保證數據來源性的可靠,必定要反覆對比其來源數據是否有問題,否則出現咱們所醫療以外的數據狀況,極可能找不到緣由。
舉個例子,咱們在作分頁處理的時候,已經到末尾頁了,一般就能夠斷定結束爬蟲了,但假設在某一個數據分類下,這個末尾頁其實有個連接指向了其餘分類頁,然而在web瀏覽器中經過javascript
程序禁止了跳轉,而後就陷入了不斷循環的取數據的過程當中或者重複取了數據。固然這個是一個不太可能存在的可能狀況,不過我在編寫的過程當中就遇到過相似的問題,在處理的時候千萬要保證數據解析和來源數據的可靠性,切記切記!