一、下载中间件(DownloaderMiddleware类)
1.1引入
需求:我们要设置随机ua
下载器中间件是引擎和下载器之间通信的中间件 我们可以设置代理 达到反反爬的目的
需要实现2个方法
1.2介绍
process_request(self,request,spider)
当每个request通过下载中间件的时候,该方法调用
参数
- request request就是拦截的请求
- spider 爬虫类实例化的对象
返回值
1 返回None ,它正常的操作 scrapy正常的去处理request对象 执行对应的方法
2 返回response对象, 就是中间件直接把返回的response对象给引擎
3 返回request对象, Scrapy则停止调用 process_request方法并重新调度返回的request。当新返回的request被执行后, 相应地中间件链将会根据下载的response被调用。
(一般返回None)
process_response(self,request,spider)
当下载器完成http请求的时候,该方法调用
1.3使用
D:\python_spider\基于Scrapy\DownloaderMiddleware
1.middlewares.py
class UserAgentDownloaderMiddleware:
USER_AGENTS = [
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
"Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)"]
# 第一种方式
def process_request(self, request, spider):
user_agent = random.choice(self.USER_AGENTS)
request.headers['User-Agent'] = user_agent
# 第二种方式
# def process_request(self, request, spider):
# ua = UserAgent()
# user_agent = ua.random
# # print(user_agent)
# request.headers['User-Agent'] = user_agent
2.settings.py
DOWNLOADER_MIDDLEWARES = {
'ua.middlewares.UserAgentDownloaderMiddleware': 543,
}
3.trials.py
class TrialSpider(scrapy.Spider):
name = 'trial'
allowed_domains = ['httpbin.org']
start_urls = ['http://httpbin.org/user-agent']
def parse(self, response):
print(response.text)
yield scrapy.Request(
self.start_urls[0],dont_filter=True
)
二、Scrapy下载图片
下载图片案例 爬取汽车之家图片
第一步 页面分析
https://car.autohome.com.cn/photolist/series/48114/6381346.html#pvareaid=3454450
https://car.autohome.com.cn/photolist/series/18/p2/ 第二页
https://car.autohome.com.cn/photolist/series/18/p3/ 第三页
每一个图片地址在//ul[@id=“imgList”]/li ./a/img/@src中
第二步 实现步骤
- 所有的图片在’//ul[@id=“imgList”]/li’中,一个在 './a/img/@src’中 可能会编辑items.py
- piplines.py保存(两种方式)
- 根据以上操作,记得编辑settings.py文件
- middlewares.py编辑
代码 D:\python_spider\基于Scrapy\pic1\audi
第一种方式(指保存方式的不同)
1.audi_spider.py
lass AudiSpiderSpider(scrapy.Spider):
name = 'audi_spider'
allowed_domains = ['car.autohome.com.cn']
start_urls = ['https://car.autohome.com.cn/photolist/series/18/p2/']
def parse(self, response):
lis = response.xpath('//ul[@id="imgList"]/li')
for li in lis:
# item = {}
item = AudiItem()
# 方式一
# item['src'] = 'https:' + li.xpath('./a/img/@src').extract_first()
# yield item
2.piplines.py
import os
from urllib import request
class AudiPipeline:
def process_item(self, item, spider):
# 获取图片的url
src = item['src']
# 获取图片的名字
img_name = item['src'].split("__")[-1]
# 动态的添加这个路径(目录)
file_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'images')
print(img_name)
# request.urlretrieve专门用来保存二进制文件
request.urlretrieve(src, file_path + '/' + img_name)
return item
3.settings.py
ITEM_PIPELINES = {
'audi.pipelines.AudiPipeline': 300,
# 'scrapy.pipelines.images.ImagesPipeline':1 #固定写法
}
第二种方式
(选择使用scrapy内置的下载文件的方法----下载图片的 Images Pipeline)
1.audi_spider.py
item['image_urls']=['https:' + li.xpath('./a/img/@src').extract_first()]
yield item
2.items.py
image_urls=scrapy.Field() #image_urls不能改
3.piplines.py不需编辑
4.settings.py
ITEM_PIPELINES = {
# 'audi.pipelines.AudiPipeline': 300,
'scrapy.pipelines.images.ImagesPipeline':1 #固定写法
}
import os
IMAGES_STORE = os.path.join(os.path.dirname(os.path.dirname(__file__)),'images') #IMAGES_STORE不能改
补充:hashlib用法,加密方式
import hashlib
h = hashlib.sha1()
print(h) #<sha1 HASH object @ 0x0000014F2AB744E0>
h.update('hello'.encode('utf-8'))
print(h.hexdigest()) # hexdigest() 返回的是十六进制的字符串
#aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
三、总结
- 千万不能忘了改settings.py配置项
- settings.py配置项的常见修改
- 反反爬