Scrapy框架與原始爬蟲的區別
原始爬蟲
效率低、同步、阻塞
Scrapy框架
效率高、異步、非阻塞
Scrapy的概念
- 爬蟲框架
- 開發速度快
- 穩定性高
- 性能優越
scrapy的流程
- 爬蟲模塊(Spiders) --> 准備起始URL(Request) --> 爬蟲中間件 --> 引擎 --> 調度器(Scheduler):請求去重, 緩存請求(隊列)
- 調度器 --> 請求(Request) --> 引擎 --> 下載器中間件 --> 下載器:發送請求, 獲取響應, 把響應封裝為Response對象
- 下載器 -Response --> 下載器中間件 --> 引擎 --> 爬蟲中間件 --> 爬蟲模塊:解析響應數據, 提取數據, 提取請求
- 爬蟲模塊 --> 數據 --> 引擎 --> 管道(Pipeline):保存數據
- 爬蟲模塊 --> 請求 --> 爬蟲中間件 --> 引擎 --> 調度器
scrapy各個組件作用
- 引擎模塊:調度各個模塊, 以及模塊間數據傳遞.
- 調度器模塊:請求去重, 緩存請求(隊列)
- 下載器: 發送請求, 獲取響應數據
- 爬蟲模塊:解析響應數據, 提取數據, 提取請求
- 管道模塊:處理數據, 比如:保存數據
- 下載器中間件: 在引擎和下載器之間, 把請求交給下載器之前, 可以對請求進行處理, 比如設置代理, 設置隨機請求頭.
- 爬蟲中間件: 在引擎和爬蟲之間, 可以請求和響應數據進行過濾.
ScrapyShell
使用格式:scrapy shell URL
作用
- 可以用於測試response常見屬性和方法
- 可用於用於測試/調試XPATH
response中重要屬性
- response.body:響應的二進制數據
- response.text: 響應的文本字符串數據
- response.url: 響應的URL
- response.request.headers: 響應對應的請求的請求頭
settings.py中的設置信息
- ROBOTSTXT_OBEY 是否遵守robots協議,默認是遵守
- DOWNLOAD_DELAY 下載延遲,默認0.5~1.5的隨機延遲
- COOKIES_ENABLED 是否開啟cookie,即每次請求帶上前一次的cookie,默認是開啟的
- DEFAULT_REQUEST_HEADERS 設置默認請求頭
- DOWNLOADER_MIDDLEWARES 下載中間件
- LOG_LEVEL 控制日志輸出的級別
- 日志等級: DEBUG,INFO,WARNING,ERROR,CRITICAL
- LOG_FILE 設置log日志文件的保存路徑, 如果設置該參數,終端將不再顯示日志信息
回調函數之間數據的傳遞
yield scrapy.Requst(url,[callback,method,headers,body,cookies,meta,dont_filter])
- callback:表示當前的url的響應交給哪個函數去處理
- meta:實現數據在不同的解析函數中傳遞,設置代理IP
- meta={'xx':yy}:在callback函數中使用response.meta['xx']獲取傳遞過來的yy的數據
- dont_filter:默認為False,會過濾請求的url地址,即請求過的url地址不會繼續被請求,對需要重復請求的url地址可以把它設置為True
- method:指定POST或GET請求
- headers:接收一個字典,其中不包括cookies
- cookies:接收一個字典,專門放置cookies
- body:接收字符串格式:name=aa&age=bb
scrapy中間件
- 先書寫middlewares文件內部的process_request方法
- 再在setting文件中打開配置信息
DOWNLOADER_MIDDLEWARES = { 'middle.middlewares.MiddleDownloaderMiddleware': 543, }
USER_AGENT_LIST = [ '1111111111', '222222222', '...',] PROXY_LIST = [ '14.106.27.137:8118', '27.193.49.150:8118', '12.86.54.194:8118', '115.218.132.203:8118', '182.96.203.11:49225', '114.249.112.65:9000', '43.248.122.251:8123', ]
Downloader Middlewares默認的方法
process_request(self, request, spider)
- 當每個request通過下載中間件時,該方法被調用。
- 返回None值:繼續請求
- 返回Response對象:不再請求,把response返回給引擎
- 返回Request對象:把request對象交給引擎 -> 調度器進行后續的請求
process_response(self, request, response, spider)
- 當下載器完成http請求,傳遞響應給引擎的時候調用
- 返回Resposne:交給process_response來處理
- 返回Request對象:交給調取器繼續請求
def process_request(self, request, spider): # 處理請求的下載器中間件 # Called for each request that goes through the downloader # 每當有一個request經過下載中間件的時候,那么此方法就會被調用 # 隨機獲取一個user_agent # USER_AGENT_LIST/PROXY_LIST:setting中配置 """ 隨機User-Agent下載器中間件 1.在settings.py中准備USER_AGENT_LIST列表 2.實現 process_request`方法 3.隨機中USER_AGENT_LIST, 選出一個UserAgent設置給request request.headers['User-Agent'] 在settings.py中配置中間件 """ ua = random.choice(USER_AGENT_LIST) request.headers['User-Agent'] = ua """ 代理IP下載器中間件 request.meta['proxy'] """ p = random.choice(PROXY_LIST) request.meta['proxy'] = p # return None 這個請求繼續執行 # return request 換了一個新的請求,把request對象交給引擎 -> 調度器進行后續的請求 # return response 根本不會再發送請求,把response返回給引擎 return None