欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

scrapy框架中间件,请求头,IP代理

程序员文章站 2022-05-09 13:02:26
...

什么下载器中间件?

    引擎与下载器之间的一个组件,一个爬虫可以有很多下载器中间件

为什么要使用下载器中间件,功能

    全局修改Scrapy request和response

scrapy 下载器中间件:

编辑文件middleware.py文件

编写处理方法

    处理请求        process_request(self, request, spider)
    添加:用户头   添加IP代理等功能

配置settings

    在settings文件中配置DOWNLOADER_MIDDLEWARES参数

为什么模拟用户头、IP代理?

    一句话:为了反反爬

(一)随机请求自己构建请求ua池

from Douban.settings import USER_AGENT_LIST
import random

class RandomUserAgent(object):
    # 定义一个中间键类
    # 用户代理
    def process_request(self, request, spider):
        # 检验一下请求头
        # print(request.headers['User-Agent'])
        # 获取一个请求头
        ua = random.choice(USER_AGENT_LIST)
        # 设置请求头代理
        request.headers['User-Agent'] = ua

setting配置

DOWNLOADER_MIDDLEWARES = {
   # 'Douban.middlewares.MyCustomDownloaderMiddleware': 543,
   #注册请求头用户代理
   'Douban.middlewares.RandomUserAgent': 543,
}
#自定义请求头,用户代理(自定)
USER_AGENT_LIST =[
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HCI0449; .NET CLR 1.0.3705) ",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; i-NavFourF; .NET CLR 1.1.4322) ",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Maxthon; "
]

解释

请求头(用户)代理 随机)
定一个中间键类,重写process_request(self,request, spider)方法,
对request的处理进行相应的配置,并把配置好以后,
并把响应的类注册到setting文件中。

参数[request,spider],并检验请求头。Print(request.headers[‘User-Agent’])。
需要在setting中DOWNLOADER_MIDDLEWARES(自定义中间键)配置

`查看用户是用哪个代理请求头,在爬虫中parse_item方法下这里`
print(response.request.headers[‘User-Agent’]

(二)随机切换User-Agent的库

安装:pip install fake-useragent

class RandomUserAgentMiddleware(object):

    def __init__(self,crawler):
        super(RandomUserAgentMiddleware, self).__init__()
        self.ua = UserAgent()
        self.ua_type = crawler.settings.get('RANDOM_UA_TYPE','random')

    @classmethod
    def from_crawler(cls,crawler):
        return cls(crawler)

    def process_request(self,request,spider):

        def get_ua():
            return getattr(self.ua,self.ua_type)
        request.headers.setdefault('User-Agent',get_ua()

setting配置

DOWNLOADER_MIDDLEWARES = {
   'liebiao.middlewares.MyCustomDownloaderMiddleware': 543,
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
}

RANDOM_UA_TYPE= 'random'
  1. 通过crawler.settings.get来获取配置文件中的配置,如果没有配置则默认是random,如果配置了ie或者chrome等就会获取到相应的配置
  2. 在process_request方法中我们嵌套了一个get_ua方法,get_ua其实就是为了执行ua.ua_type
  3. 但是这里无法使用self.ua.self.us_type,所以利用了getattr方法来直接获取,最后通过request.heasers.setdefault来设置User-Agent
  4. 通过上面的配置我们就实现了每次请求随机更换User-Agent
    https://blog.csdn.net/javakklam/article/details/79984126

(三)随机切换IP代理

from scrapy import signals
import random
import base64
from Douban.settings import PROXY_LIST

class RandomProxy(object):
    def process_request(self, request, spider):
        # 随机取出一个代理ip
        proxy = random.choice(PROXY_LIST)

        # 判断是否为人民币玩家
        if 'user_passwd' in proxy:
            #把账号密码转换为b64编码格式(字符串先变成bytes类型)必须字符串转为bytes
            b64_data = base64.b64encode(proxy['user_passwd'].encode())
            # 设置账号密码认证                     认证方式   编码之后的账号密码
            request.headers['Proxy-Authorization'] = 'Basic ' + b64_data.decode()
            # 设置代理

        else:
            # 免费代理不用认证
            request.meta['proxy'] = proxy['ip_port']

settings中设置

DOWNLOADER_MIDDLEWARES = {
   # 'Douban.middlewares.MyCustomDownloaderMiddleware': 543,
   #注册ip代理
    # 'Douban.middlewares.RandomProxy': 544,
}
ip代理(自定)
 PROXY_LIST = [
     {'ip_port': '121.232.148.85:9000'},
     {'ip_port': '115.223.235.157:9000'},
        #收费的ip, 端口    用户名   密码
     {"ip_port": "ip:port", "user_passwd": "user:passwd"}
]
在setting中定义代理,
并将其导入到middlewares中
随机获取一个随机用户代理random.choice(),
设置一个用户头代理request.headers[‘User-Agent’] = 随机获取的代理,
相关标签: 爬虫