这几天心血来潮想学习 Python,但是我是那种不喜欢从头学起的人,我比较喜欢在一个项目中学习一样东西。正好阿里云大学里面有 Python 爬虫的课程,我就开始学习了。

今天学到 Scrapy 爬虫项目编写实战这一讲时,遇到了一点小问题,在网上找了几个大神的帖子看了看,解决了。这里写个笔记记录一下,以后要用到的时候方便些。

下面进入正题:在 scrapy 里,设置随机的 User-Agent 有两种方式

  1. 在 middlewares 中添加
  2. 在 spider 的 request 中添加

第一种,在 middleware 中添加

  1. 安装 fake-useragent
    pip install fake-useragent
    这个包里面内置了许多浏览器的 User-Agent,这样就不用我们自己再建了
  2. 在 scrapy 项目的 middlewares.py 导入 fake-useragent 包
    from fake_useragent import UserAgent
    然后讲下面的RandomUserAgentMiddleware复制进去
1
2
3
4
5
6
7
8
9
10
11
12
class RandomUserAgentMiddleware(object):
#随机更换user-agent
def __init__(self,crawler):
super(RandomUserAgentMiddleware,self).__init__()
self.ua = UserAgent()

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

def process_request(self,request,spider):
request.headers.setdefault("User-Agent",self.ua.random)

最后在 setting.py 中的DOWNLOADER_MIDDLEWARES里将其添加进去,这里的ProjectName改为你的项目名

1
2
3
4
DOWNLOADER_MIDDLEWARES = {
# 'ali_fst.middlewares.AliFstDownloaderMiddleware': 543,
'ProjectName.middlewares.RandomUserAgentMiddleware':333,
}

这样就设置好了,之后爬虫启动后,每一个 request 请求的 User-Agent 都是一个随机的值。

第二种,在 spider 中添加

我们以 baidu 首页为例

  1. 同样时先导入 fake-useragent 包,然后在 parse 方法里面,我们请求十次
  2. 添加一个second_parse作为 parse 函数的回调函数,处理 parse 函数里面请求的响应值
  3. second_parse里添加print(response.request.heasers['User-Agent'])用来观察我们设置的 User-Agent 是否生效。具体代码如下:
1
2
3
4
5
6
7
def parse(self, response):
ua = UserAgent()
for i in range(10):
header = {'User-Agent':ua.random}
yield scrapy.Request(url='https://www.baidu.com',headers=header,callback=self.second_parse,dont_filter=True)
def second_parse(self,response):
print(response.request.headers['User-Agent'])

这样就设置好了

结束语

以上两种方法都可以用来设置 User-Agent,只要我们根据要爬的网站的特性,任选一种即可。

[原文链接]:https://juejin.im/post/5b9fe92ce51d450e8d7651ee