如何在scrapy中添加随机的userAgent

在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的设定,纯手打!

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值