中间件的使用
- 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()')