scrapy 添加请求头

第一种方法 在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:

第二种和第三种我目前没有感到太大的区别

你可能感兴趣的:(scrapy 添加请求头)