在scrapy中运行顺序是这样的(如下图):
由上图我们可以看出我们的request的请求,产生和发送请求之前的位置可以进行处理我们的request请求,也就是在这些地方可以进行userAgent的添加(有如下三个方法):
1.在spider.py文件中进行添加:
第一步:
#这里就举两个例子,可以在百度里搜索大量的user_agent,放到这个列表中,这个变量我们写在setting文件中即可
user_agent_list = [
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like
Gecko) Chrome/70.0.3538.77 Safari/537.36',
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) QQBrowser/6.9.11079.201',
]
第二步:
#在我们的spider.py文件中写上自己的headers
#要导入我们的刚刚设置的user_agent_list
import scrapy
from scrapy.loader import ItemLoader
from settings import user_agent_list
#这里我们就用爬去知乎为例
class ZhihuSpider(scrapy.Spider):
name = 'zhihu'
allowed_domains = ['www.zhihu.com']
start_urls = ['https://www.zhihu.com/']
#question的第一页answer的请求url
start_answer_url = 'https://www.zhihu.com/api/v4/questions/{0}/answer......'
headers = {
'HOST':'www.zhihu.com',
'Referer':'https://www.zhihu.com',
'User-Agent':'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E) QQBrowser/6.9.11079.201',
}
def parse(self, response):
all_urls = response.css('a::attr(href)').extract()
all_urls = [parse.urljoin(response.url.url) for url in all_urls]
all_urls = filter(lambda x:True if x.startswith('https') else False)
for url i all_urls:
match_obj = re.math('(.*zhihu.com/question/(\d+))(/|$).*', url)
if match_obj:
request_url = match_obj.group(1)
#从这里开始添加我们的useragent就可以啦!
import random
self.headers['User-Agent']=random.choice(user_agent_list)
yield scrapy.Request(request_url,headers=self.headers,callback=self.question)
else:
yield
def question(self,response):
pass
这就是第一种方法,是所有所有方法中最简单的,从原头解决问题,但是这种方法有问题的,这个世界本来就是矛盾的,鱼和熊掌不可兼得!由于粒度比较小出现问题如下:
1.当我spider文件中有多个request发送请求时,都要加上这几行代码,会出现代码的冗余,这种问题是可耻的。
2.当我想要爬取微博的时候,那么这里的useragent还要重新写,那么耦合性就比较高。
2.在中间件中添加我们想要UserAgent代码(这种是比较合理,推荐)
从scrapy的运行图片中我们可以看出,有两个地方我们是有中间件的,那么我们可以添加自己的中间件来处理我们的request请求中的useragent,这种方法的粒度较大,是全局的,所有的request请求都会处理,这个就相当与我们在传递request的过程中来改变他!由于spidermiddleware与downloadmiddleware有很多相似的地方,那么我们这里只介绍downloadmiddleware的处理!
其实在我们的scrapy中,他帮我们做了非常多的事情,有很多事情已经帮我们想到了!我们先打开scrapy中的原代码部分!
1:我们要打开这个文件,这个文件是scrapy把我们自动处理的useragent的中间件
2:当我们不去处理我们的useragent的时候,scrapy会帮我们自动添加一个useragent,而这个useragent的默认是‘scrapy’,是不是想哭,只要反爬虫的人看到是这个useragent,会很容易的限制我们的访问。
3:我们可以在settings.py中添加一个变量,变量名字是USER_AGENT,我们可以自由的添加想要的useragent,当我们给这个变量传递一个值得时候,那么会把原来默认的‘scrapy’改为现在的值!
好,现在我们就开始(实践出真知):
我想再之前再和大家介绍一个新的知识点:fake_useragent
fake_useragent:里面有大量的useragent
安装fake-useragent:pip install fake_useragent
可以再github上找到fake_useragent这个库的用法,用法也是相当的简单,这边就不做过多的介绍了
第一步:我们现在settings中设置我们的Downloadmiddleware中间件,添加一个中间件(如下图):
那么这个大框呢?就是我们要在settings索要添加的新内容。
那么,我们要在中间件要进行逻辑的处理
先运行from_crawler 这个静态方法,将这个爬虫打过来,然后再进行__init__方法,我们主要的目的是将settings中的变量RANDOM_UA_TYPE这个变量拿出来,
1.将crawler这个爬虫拿过来,可以提取其中一些变量
2.导入fake_useragent这个useragent库
3.创建一个UserAgent一个对象
4.提取这个RANDOM_UA_TYPE的值,我们可以设定这个爬虫是由哪个浏览器爬取,如果不设定那么就随机提取浏览器,如chrom,firfox,ie
那么就好啦,这些就是一个随机的useragent的设定,纯手打!