php伪造请求头-请求头referer伪造
使用scrapy写爬虫的时候,会莫名其妙的被目标网站拒绝,很大部分是浏览器请求头的原因。
现在一起来看看scrapy的请求头,并探究设置方式
工具准备开发环境python2.7 + scrapy 1.1.2测试请求头网站:https://httpbin.org/get?show_env=1json在线解析:https://www.json.cn/浏览器请求头大全: http://www.useragentstring.com/默认请求头命令行执行,新建爬虫
scrapy startproject myspidercd myspider scrapy genspider scrapy_spider httpbin.orgphp伪造请求头我们通过对 https://httpbin.org/get?show_env=1 的请求,查看本次请求的浏览器信息,可以打开看一看是否是自己的浏览器信息
改写生成的scrapy_spider.py文件
import scrapyclass 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.textif __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-agentUSER_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",*** 四:中间件设置
此 *** 可以从整个项目中去修改请求头的设置规则,变化多端,不同的写法,可以配置出不同的设置方式,下面是一个比较简单的示例
私信小编007即可获取数十套PDF的获取方式哦!
我们参考scrapy默认处理请求头的中间件
from scrapy.downloadermiddlewares.useragent import UserAgentMiddleware编写中间件
# middlewares.pyclass RandomUserAgentMiddleware(object): def process_request(self, request, spider): request.headers['User-Agent']= "" # 绝对设置,其php伪造请求头他设置都不生效我们可以从下面找到默认设置
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.pyUSER_AGENT = "settings"# scrapy_spider.pycustom_settings = { "USER_AGENT": "custom_settings", }headers={"User-Agent": "header"}运行效果为:
"User-Agent":"header"注释掉headers
"User-Agent":"custom_settings"注释掉custom_settings
"User-Agent":"custom_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.pycustom_settingsheaders作为从入门到实战的我,踩过不少坑,此 *** 了简单的总结,也分享了几个比较实用的网站。希望此文的分享能给大家提供一个少走弯路的捷径,那么此文的价值也就体现了。
顺便打个广告
最近想写一个开源库,chinesename中文取名,已经实现基本的取名,不过名字需要优化,如果有想一起搞事情的同学,可以一起
github地址:https://github.com/mouday/chinesename