了解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,就可以使用了,把别忘了打开设置里面的管道