0
点赞
收藏
分享

微信扫一扫

Python爬虫:关于scrapy模块的请求头


内容简介

使用scrapy写爬虫的时候,会莫名其妙的被目标网站拒绝,很大部分是浏览器请求头的原因。

现在一起来看看scrapy的请求头,并探究设置方式

工具准备


开发环境python2.7 + scrapy 1.1.2 测试请求头网站:​​https://httpbin.org/get?show_env=1​​ json在线解析:​​https://www.json.cn/​​ 浏览器请求头大全: ​​http://www.useragentstring.com/​​

默认请求头

命令行执行,新建爬虫

scrapy startproject myspider
cd myspider
scrapy genspider scrapy_spider httpbin.org

我们通过对 ​​https://httpbin.org/get?show_env=1​​ 的请求,查看本次请求的浏览器信息,可以打开看一看是否是自己的浏览器信息

改写生成的​​scrapy_spider.py​​文件

import scrapy


class ScrapySpider(scrapy.Spider):
name = "scrapy_spider"
allowed_domains = ["httpbin.org"]
start_urls = (
# 请求的链接
"https://httpbin.org/get?show_env=1",
)

def parse(self, response):
# 打印出相应结果
print response.text


if __name__ == '__main__':
from scrapy import cmdline
cmdline.execute("scrapy crawl scrapy_spider".split())

如果是你正好使用mac本,正好使用pycharm可以按快捷键启动爬虫

​shift + control + r​

当然,如果是windows那就右键启动吧

将返回的文本复制到 ​​https://www.json.cn/​​ 格式化成便于查看的json格式,下面操作亦然,不再赘述。

{
"args":{
"show_env":"1"
},
"headers":{
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding":"gzip,deflate",
"Accept-Language":"en",
"Connect-Time":"1",
"Connection":"close",
"Host":"httpbin.org",
"Total-Route-Time":"0",
"User-Agent":"Scrapy/1.1.2 (+http://scrapy.org)",
"Via":"1.1 vegur",
"X-Forwarded-For":"39.155.188.22",
"X-Forwarded-Port":"443",
"X-Forwarded-Proto":"https",
"X-Request-Id":"9dcf91a6-0bed-4d9e-b2bd-b7c88b832d81",
"X-Request-Start":"1529654403617"
},
"origin":"39.155.188.22",
"url":"https://httpbin.org/get?show_env=1"
}

看到了吧,默认的请求头是

"User-Agent":"Scrapy/1.1.2 (+http://scrapy.org)"

修改请求头

既然这样的话,那我们修改下请求头,达到伪造的效果

打开下面的链接,选一个自己喜欢的请求头

​​​http://www.useragentstring.com/pages/useragentstring.php?name=Chrome​​​

这里使用chrome浏览器请求头

方式一:全局设置

此方式设置后,覆盖掉scrapy默认的请求头,全局生效,即​​所有爬虫​​都可以享受

​settings.py​​文件中找到如下代码

# Crawl responsibly by identifying yourself (and your website) on the user-agent
# USER_AGENT = 'myspider (+http://www.yourdomain.com)'

解除注释,修改为自己的请求头

# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"

运行爬虫,验证效果

"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

方式二:爬虫设置

此方式设置后,​​单个爬虫​​生效,此爬虫的所有连接都享受

class ScrapySpider(scrapy.Spider):
name = "scrapy_spider"
allowed_domains = ["httpbin.org"]
# 新添加的代码
custom_settings = {
"USER_AGENT": "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
}
# -----------
start_urls = (
"https://httpbin.org/get?show_env=1",
)

再次访问,发现我们的请求头已经成功更换

"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

方式三:链接设置

此方法对​​单个链接​生效, 只是此次请求的这个链接享受

在​​Request​​方法中设置​​headers​​参数

import scrapy

# 请求头
USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"

class ScrapySpider(scrapy.Spider):
name = "scrapy_spider"
allowed_domains = ["httpbin.org"]

start_urls = (
"https://httpbin.org/get?show_env=1",
)
# 新加的代码
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url, headers={"User-Agent": USER_AGENT})
# ------------

def parse(self, response):
print response.text

测试效果

"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

方法四:中间件设置

此方法可以从整个项目中去修改请求头的设置规则,变化多端,不同的写法,可以配置出不同的设置方式,下面是一个比较简单的示例

我们参考scrapy默认处理请求头的中间件

from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware

编写中间件

# middlewares.py

class RandomUserAgentMiddleware(object):
def process_request(self, request, spider):
request.headers['User-Agent']= "" # 绝对设置,其他设置都不生效

我们可以从下面找到默认设置

from scrapy.settings import default_settings

找到项目中对请求头起作用的中间件

'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,

在​​settings.py​​​ 或者​​custom_settings​​替换原有的中间件

"DOWNLOADER_MIDDLEWARES": {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,
"myspider.middlewares.RandomUserAgentMiddleware": 400,
}

这样可以从全局,或者局部替换掉请求头规则

作用优先级

如果作如下设置

# settings.py

USER_AGENT = "settings"
# scrapy_spider.py
custom_settings = {
"USER_AGENT": "custom_settings",
}
headers={"User-Agent": "header"}

运行效果为:

"User-Agent":"header"

注释掉headers

"User-Agent":"custom_settings"

注释掉custom_settings

"User-Agent":"settings"

注释掉settings

"User-Agent":"Scrapy/1.1.2 (+http://scrapy.org)"

可见优先级为:

​headers​​ > ​​custom_settings​​ > ​​settings.py​​ > ​​Scrapy默认​

注意

注意​​User-Agent​​参数的写法

headers={"User-Agent": USER_AGENT})

如果写错了,很可能发生奇怪的事情

headers={"User_Agent": USER_AGENT}

请求头中多了Scrapy…

"User-Agent":"Scrapy/1.1.2 (+http://scrapy.org),Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

其实,很好区分:

​User-Agent​​: 浏览器请求头参数,html代码中经常用​​-​

​USER_AGENT​​: python变量

建议:

每次写浏览器参数,如果怕写错就打开自己的浏览器,随便测试一个页面,从里边复制

总结

设置方式

作用效果

Scrapy默认

所用爬虫所有请求

settings.py / ​​USER_AGENT=""​

所用爬虫所有请求

​custom_settings = {"USER_AGENT": "",}​

单个爬虫所有请求

​headers={"User-Agent": ""}​

单个请求

中间件方式downloadermiddleware

视编写规则而定

表格从上至下,优先级逐渐增加,中间件除外,一般掌握三种方式就够用了:


  • settings.py
  • custom_settings
  • headers

作为从入门到实战的我,踩过不少坑,此文做了简单的总结,也分享了几个比较实用的网站。希望此文的分享能给大家提供一个少走弯路的捷径,那么此文的价值也就体现了。

顺便打个广告

最近想写一个开源库,chinesename中文取名,已经实现基本的取名,不过名字需要优化,如果有想一起搞事情的同学,可以一起

github地址:​​https://github.com/mouday/chinesename​​



举报

相关推荐

0 条评论