第一种方法 在scrapy的spider中添加请求头:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36'
}
def start_requests(self):
return [Request(url=self.start_urls[0], callback=self.parse, headers=self.headers)]
这种方法的好处是可以比较灵活,可以随意的添加,任意个请求头
第二种方法是在scrapy的settings 里添加:
USER_AGENT_LIST=[
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
USER_AGENT = random.choice(USER_AGENT_LIST)
第三种方法是在scrapy 的middware中添加请求头,这个就需要注意一下scrapy的整个框架了。
image.png
附上官网图:
1.在spider将需要爬去的网页url 发送给 Scrapy Engine2
2.Scrapy Engine本身不做任何处理,直接发送给Scheduler
3.Scheduler生成Requests发送给Engine
4.Engine 拿到Requests, 通过middware发送给DOWNLOADER
而我们的请求头也是在这一步添加,因为需要提前添加请求头,才能下载网页。进行下一步的网页再提取,和数据的初步提取。
代码如下:
#首先在scrapy的middware中定义一个middware类
class RandomUserAgentMiddleware(object):
#重定义他的process_request方法:
def process_request(self, request, spider):
rand_use = random.choice(USER_AGENT_LIST)#这个USER_AGENT_LIST是从settings里面导入的
if rand_use:
request.headers.setdefault('User-Agent', rand_use)
需要注意的是,这里还没结束,还需要在settings里面启动这个middware
DOWNLOADER_MIDDLEWARES = {
'govbuy_spider.middlewares.RandomUserAgentMiddleware': 400,
'govbuy_spider.middlewares.IngoreHttpRequestMiddleware': None,
}
数字为优先级,越小,越先执行。 None为不启动,就算没有这个中间件,也不会报错。
到这里,就结束了。
PS:
第二种和第三种我目前没有感到太大的区别
网友评论