useragent(用户代理)的随机更换功能

了解scrapy 爬虫的用户代理功能

要完成用户代理的随机更换,首先必须要了解中间件(middlewares.py)
看过scarpy 框架简介图应该就知道,中间件位于引擎和download之间(下载中间件)
它的重要作用主要是拦截所有的请求和响应
(1)为什么拦截请求:
——篡改请求头(UA伪装:目的是模仿人在用浏览器登陆网站),因为网站都有些反爬机制,不允许机器人才获取数据,UA伪装这个也是我们接下来会用到的。
简单的ua伪装可以在settings中的# Crawl responsibly by identifying yourself (and your website) on the user-agent下添加请求头,或者在中间件的class +(你的爬虫名字(第一个字母大写))+loaderMiddleware(object):下面添加request.headers[‘User-Agent’]=‘这里的内容在浏览器下(按F12在network里找到请求头)’,网课上很清楚。

——修改请求对应的ip(代理)
因为我们是爬虫,爬虫其实是不合法的,所以当我们爬取数据时,被反爬机制发现了,就会对我们的行为进行禁止(封ip)
(2)为什么拦截响应:我目前所知道的,当我们爬取数据时,有些时候得到的响应是错误的,或者爬取的是动态的,我们就需要进行修改(具体方法以后补充)

进入正题

实现用户代理的随机更换
有两个方法
——(1)网上几乎都是copy的好像一个版本参考的https://www.jianshu.com/p/7911f90ec693
第一步 命令行pip install fake-useragent(安装可以随机切换访问头的插件)
——(2) 在这里插入图片描述这个方法其实是封装好了的,涉及python模块的知识,可以去学习,这里会用就行
——(3)具体使用方法在middlewares.py文件中写入

from fake_useragent import UserAgent
class RandomUserAgentMiddlware(object):
   
    def __init__(self, crawler):
        super(RandomUserAgentMiddlware, self).__init__()
        self.ua = UserAgent()
        #读取在settings文件中的配置,来决定ua采用哪个方法,默认是random,也可是ie、Firefox等等,参考前面的使用方法。
        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)

        print  get_ua()
        request.headers.setdefault('User-Agent', get_ua())

这个方法照着抄就行 ,最后别忘了在setting里面打开DOWNLOADER_MIDDLEWARES = { '你的爬虫名字.middlewares.RandomUserAgentMiddlware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, }并且关掉自带的用户代理中间件(有些可能没有,我就没发现),对了 如果前面写了在# Crawl responsibly by identifying yourself (and your website) on the user-agent那个位置写了user——agent也需要注释掉,对了你的DOWNLOADER_MIDDLEWARES = {
‘douluodalu.middlewares.DouluodaluDownloaderMiddleware’: 543,
‘douluodalu.middlewares.RandomUserAgentMiddlware’: 542,#优先级比原来小
}可能是这样,你那个代理切换的优先级一定要比原来的小,具体去看看scrapy的文档,里面讲的很清楚。
————————————————————————————————————————————————————
————方法(2)简单也容易理解
(1)先百度找个UA用户代理池,然后写入中间件中,然后呢就用到我们上面说的,中间件的的作用可以拦截请求class DouluodaluDownloaderMiddleware(object):

def process_request(self, request, spider):
    return None
def process_response(self, request, response, spider):
    return response
def process_exception(self, request, exception, spider):

    pass

这个就是啦 ,第一是拦截正常请求 我们的可以在那力进行用户代理随机跟换(后面两个先不管),代码如下`
class DouluodaluDownloaderMiddleware(object):

def process_request(self, request, spider):
    request.headers['User-Agent']=random.choices(MY_USER_AGENT )
    return None
def process_response(self, request, response, spider):
    return response
def process_exception(self, request, exception, spider):
    pass`
    MY_USER_AGENT是我的用户代理池的名字 `MY_USER_AGENT = [

‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36’
]里面可以写很多这里节省空间,最后要import random,就可以使用了,把别忘了打开设置里面的管道

发布了3 篇原创文章 · 获赞 2 · 访问量 77

猜你喜欢

转载自blog.csdn.net/MYLOVEis77/article/details/104083132