2021/6/5爬虫第二十一次课(下载中间件的编辑、Scrapy下载图片案例)

一、下载中间件(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配置项的常见修改
  • 反反爬
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笔记本IT

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值