中間件的使用
- 1.scrapyl中間件的分類和作用
- 1.1 scrapy中間件的分類
- 1.2 scrapy中間的作用:預處理request和response對象
- 2.下載中間件的使用方法:
- 3.定義實現隨機User-Agent的下載中間件
- 3.1 實戰:爬取豆瓣Top250電影信息
- 3.2 中間件使用實現隨機User-Agent
- 4. 代理ip的使用
- 4.1思路分析
- 4.2 代碼實現
- 代碼:base64.b64encode(auth.encode()).decode()
- 5. 在中間件中使用selenium - 未實現 了解即可
- 5.1分析網頁數據格式
- 5.2 selenium中間件的使用 ?
- 目標
1.應用scrapy中使用間件使用隨機UA的方法
2.應用scrapy中使用代理ip的的方法
3.應用scrapy.與selenium配合使用
1.scrapyl中間件的分類和作用
1.1 scrapy中間件的分類
根據scrapyi運行流程中所在位置不同分為:
1.下載中間件
2.爬蟲中間件
1.2 scrapy中間的作用:預處理request和response對象
1.對header以及cookie進行更換和處理
2.使用代理ip等
3.對請求進行定制化操作,
但在scrapy默認的情況下兩種中間件都在middlewares.py一個文件中
爬蟲中間件使用方法和下載中間件相同,且功能重復,通常使用下載中間件
2.下載中間件的使用方法:
接下來我們對騰訊招聘爬蟲進行修改完善,通過下載中間件來學習如何使用中間件編寫一個 Downloader Middlewares和我們編寫一個pipeline一樣,定義一個類,然后在setting中開啟
1.在middlerware.py中定義中間件類
2.在中間件類中,重寫處理清求或者響應的方法
3.在settings文件中開啟中間件的使用
Downloader Middlewares默認的方法:process_request(self,request,spider):1.當每個requesti通過下載中間件時,該方法被調用。2.返回None值:沒有return也是返回None,該request對象傳遞給下載器,或通過引擎傳遞給其他權重低的process,_request方法3.返回Response對象:不再請求,把response返回給引繁4.返回Request對象:把request對象通過引擎交給調度器,此時將不通過其他權重低的process_request方法protess_response(self,request,response,spider):1.當下載器完成http請求,傳遞響應給引擎的時候調用2.返回Resposne:通過引擎交給爬蟲處理或交給權重更低的其他下載中間件的process_response方法3.返回Request對象:通過引擎交給調取器繼續請求,此時將不通過其他權重低的process_request方法在settings.py中配置開啟中間件,權重值越小越優先執行
3.定義實現隨機User-Agent的下載中間件
3.1 實戰:爬取豆瓣Top250電影信息
- 網頁分析
- 代碼
記得在settings.py設置User-Agent和ROBOTSTXT_OBEY,否則會報403錯誤
# items.py
# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass DoubanItem(scrapy.Item):# define the fields for your item here like:name = scrapy.Field()info = scrapy.Field()score = scrapy.Field()desc = scrapy.Field()pass
import scrapy
from douban.items import DoubanItemclass MovieSpider(scrapy.Spider):name = 'movie'allowed_domains = ['douban.com']start_urls = ['https://movie.douban.com/top250']def parse(self, response):node_list = response.xpath('//div[@class="info"]')# print(len(node_list))for node in node_list:item = DoubanItem()item['name'] = node.xpath('./div[1]/a/span[1]/text()').get()item['info'] = node.xpath('./div[@class="bd"]/p[1]/text()')