python爬虫 - headers请求头和cookies的原理和使用方法

        主要内容:request中的headers和cookies的作用、如何设置headers或者cookies、什么时候可以不加cookies。

目录

前提带入

李明借钱记

网络请求

headers & cookies

实例

找到headers

找到cookies

GET请求添加headers & cookies

headers

cookies

POST请求添加headers & cookies

headers

cookies


前提带入

        首先通过一个小故事,理解一下网络请求过程中headers和cookies的作用吧

李明借钱记

        村子里有一个懒汉李明,今天突然想借点钱出去下馆子,于是他想到了隔壁的大地主,写了一封信从窗户递到了地主家,村落布局如下:

        地主收到信一看,虽然没有署名,但从这个方向来只能是李明了,李明这个人好吃懒做,不一定能还上自己的钱,不行,不借!

         李明收到了回复,不借给自己钱,也明白了问题所在,自己信誉不好,地主不愿意借钱给自己,于是李明想借用一下法官的信誉:

         地主一看,我这边是法官呀,这消息是法官发来的,法官在村子里口碑不错,人也仗义,这个钱,我借!我还从这个窗户给他:

         李明借用法官的名头,拿到了钱,时间久了,藏不住呀,终于被地主和法官发现了,于是他们约定,如果法官要向地主借钱,还要加上署名,我是法官,我在什么时间之前跟你借过钱,我们的暗号是巴拉巴拉,这样下一次就尴尬了:

         这时候李明想要借钱,除了自己说自己是法官,还要拿出一定的凭据来证明,比如我们上一次见面时什么时候,我们上一次借钱还钱是什么时候,而这些,李明是不知道的。就这样,村子的安全体系得到加强,效率也高了起来,只是李明再也不能通过歪心思借到钱了。

        除非。。。

网络请求

        除非法官是自己人,怎么说呢,网站是欢迎真人访问的,这会提高网站的流量和热度等等,但是网站不欢迎机器人,机器人做的事情对于网站来说是无利可图的。大家应该已经猜到了,这个机器人就是我们的爬虫,而这个借用法官的名声就是headers;后面的那些法官凭证就是网站为了安全设置的cookies。

        那么法官是谁呢?当然就是我们自己啦,我自己访问一次网站,我作为真人我的headers和cookies我自愿告诉我的爬虫系统,他比李明就要幸运多了吧。

headers & cookies

实例

每一个页面访问,实际上都是我们在请求(resquest)对方给我们返回一个整体,上代码看示范:

url = 'https://bilibili.com/'

res = requests.get(url)
print(res.request)
print(res)
print(res.cookies)
print(res.headers)

我向目标网址发出了请求,想要从收到的返回值看我的请求,整体对象,cookies和headers

结果如下图:

找到headers

这时我们随便点击一个网页,找到开发者工具:

 在开发者工具里,我们可以查看到请求头的信息:


 

找到cookies

还是在同样的开发者工具中,找到cookies:

GET请求添加headers & cookies

headers

我们可以把它用字典(dist)类型,存在我们的代码里:

headers = {
        "referer": "https://www.baidu.com.com/",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
    }

在下一次请求时,我们的代码增加headers:

headers = {
        "referer": "https://www.baidu.com.com/",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
    }

url = 'https://bilibili.com/'

res = requests.get(url, headers=headers) #伪装请求头
print(res.request)
print(res)
print(res.cookies)
print(res.headers)

返回结果:

cookies

对于get请求的cookies,通常可以直接包含在headers中:

headers = {
        "referer": "https://www.baidu.com.com/",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
        "cookie" : '在这里放上cookie' #----加在这里----#
    }

url = 'https://bilibili.com/'

res = requests.get(url, headers=headers) #headers中包括了cookie信息
print(res.request)
print(res)
print(res.cookies)
print(res.headers)

POST请求添加headers & cookies

headers

 我们同样也是把它用字典(dist)类型,存在我们的代码里:

headers = {
        "referer": "https://www.baidu.com.com/",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
    }

在下一次请求时,我们的代码增加headers,同时get变为post:

headers = {
        "referer": "https://www.baidu.com.com/",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"
    }

url = 'https://bilibili.com/'

res = requests.post(url, headers=headers) #伪装请求头,现在是post方法了!request.post()
print(res.request)
print(res)
print(res.cookies)
print(res.headers)

cookies

对于post请求来说,cookies是一个和headers同等地位的参数,所以单独存储使用:

headers = {
        "referer": "https://www.baidu.com.com/",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
    }

cookie = '在这里放上cookie'

url = 'https://bilibili.com/'

res = requests.get(url, headers=headers, cookies=cookie) #headers和cookies分别传入
print(res.request)
print(res)
print(res.cookies)
print(res.headers)

快去尝试一下你的爬虫,如果有问题,欢迎前往:

python爬虫 - GET和POST分别对爬取的网页状态的影响以及常见网页状态码(200、401、402、404等等)_昊昊该干饭了的博客-CSDN博客主要内容:GET和POST分别对爬取的网页状态的影响以及常见的网页状态码https://blog.csdn.net/qq_52213943/article/details/125571882配合我的文章,尝试自己解决问题吧。

原创不易,转载标明出处。

  • 38
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
Python入门网络爬虫之精华版 Python学习网络爬虫主要分3个大的版块:抓取,分析,存储 另外,比较常用的爬虫框架Scrapy,这里最后也详细介绍一下。 首先列举一下本人总结的相关文章,这些覆盖了入门网络爬虫需要的基本概念和技巧:宁哥的小站-网络爬虫 当我们在浏览器中输入一个url后回车,后台会发生什么?比如说你输入http://www.lining0806.com/,你就会看到宁哥的小站首页。 简单来说这段过程发生了以下四个步骤: 查找域名对应的IP地址。 向IP对应的服务器发送请求。 服务器响应请求,发回网页内容。 浏览器解析网页内容。 网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据,而不需要一步步人工去操纵浏览器获取。 抓取 这一步,你要明确要得到的内容是什么?是HTML源码,还是Json格式的字符串等。 1. 最基本的抓取 抓取大多数情况属于get请求,即直接从对方服务器上获取数据。 首先,Python中自带urllib及urllib2这两个模块,基本上能满足一般的页面抓取。另外,requests也是非常有用的包,与此类似的,还有httplib2等等。 Requests: import requests response = requests.get(url) content = requests.get(url).content print "response headers:", response.headers print "content:", content Urllib2: import urllib2 response = urllib2.urlopen(url) content = urllib2.urlopen(url).read() print "response headers:", response.headers print "content:", content Httplib2: import httplib2 http = httplib2.Http() response_headers, content = http.request(url, 'GET') print "response headers:", response_headers print "content:", content 此外,对于带有查询字段的url,get请求一般会将来请求的数据附在url之后,以?分割url和传输数据,多个参数用&连接。 data = {'data1':'XXXXX', 'data2':'XXXXX'} Requests:data为dict,json import requests response = requests.get(url=url, params=data) Urllib2:data为string import urllib, urllib2 data = urllib.urlencode(data) full_url = url+'?'+data response = urllib2.urlopen(full_url) 相关参考:网易新闻排行榜抓取回顾 参考项目:网络爬虫之最基本的爬虫:爬取网易新闻排行榜 2. 对于登陆情况的处理 2.1 使用表单登陆 这种情况属于post请求,即先向服务器发送表单数据,服务器再将返回的cookie存入本地。 data = {'data1':'XXXXX', 'data2':'XXXXX'} Requests:data为dict,json import requests response = requests.post(url=url, data=data) Urllib2:data为string import urllib, urllib2 data = urllib.urlencode(data) req = urllib2.Request(url=url, data=data) response = urllib2.urlopen(req) 2.2 使用cookie登陆 使用cookie登陆,服务器会认为你是一个已登陆的用户,所以就会返回给你一个已登陆的内容。因此,需要验证码的情况可以使用带验证码登陆的cookie解决。 import requests requests_session = requests.session() response = requests_session.post(url=url_login, data=data) 若存在验证码,此时采用response = requests_session.post(url=url_login, data=data)是不行的,做法应该如下: response_captcha = requests_session.get(url=url_login, cookies=cookies) response1 = requests.get(url_login) # 未登陆 response2 = requests_session.get(url_login) # 已登陆,因为之前拿到了Response Cookie! response3 = requests_session.get(url_results) # 已登陆,因为之前拿到了Response Cookie! 相关参考:网络爬虫-验证码登陆 参考项目:网络爬虫之用户名密码及验证码登陆:爬取知乎网站 3. 对于反爬虫机制的处理 3.1 使用代理 适用情况:限制IP地址情况,也可解决由于“频繁点击”而需要输入验证码登陆的情况。 这种情况最好的办法就是维护一个代理IP池,网上有很多免费的代理IP,良莠不齐,可以通过筛选找到能用的。对于“频繁点击”的情况,我们还可以通过限制爬虫访问网站的频率来避免被网站禁掉。 proxies = {'http':'http://XX.XX.XX.XX:XXXX'} Requests: import requests response = requests.get(url=url, proxies=proxies) Urllib2: import urllib2 proxy_support = urllib2.ProxyHandler(proxies) opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler) urllib2.install_opener(opener) # 安装opener,此后调用urlopen()时都会使用安装过的opener对象 response = urllib2.urlopen(url) 3.2 时间设置 适用情况:限制频率情况。 Requests,Urllib2都可以使用time库的sleep()函数: import time time.sleep(1) 3.3 伪装成浏览器,或者反“反盗链” 有些网站会检查你是不是真的浏览器访问,还是机器自动访问的。这种情况,加上User-Agent,表明你是浏览器访问即可。有时还会检查是否带Referer信息还会检查你的Referer是否合法,一般再加上Referer。 headers = {'User-Agent':'XXXXX'} # 伪装成浏览器访问,适用于拒绝爬虫的网站 headers = {'Referer':'XXXXX'} headers = {'User-Agent':'XXXXX', 'Referer':'XXXXX'} Requests: response = requests.get(url=url, headers=headers) Urllib2: import urllib, urllib2 req = urllib2.Request(url=url, headers=headers) response = urllib2.urlopen(req) 4. 对于断线重连 不多说。 def multi_session(session, *arg): retryTimes = 20 while retryTimes>0: try: return session.post(*arg) except: print '.', retryTimes -= 1 或者 def multi_open(opener, *arg): retryTimes = 20 while retryTimes>0: try: return opener.open(*arg) except: print '.', retryTimes -= 1 这样我们就可以使用multi_session或multi_open对爬虫抓取的session或opener进行保持。 5. 多进程抓取 这里针对华尔街见闻进行并行抓取的实验对比:Python多进程抓取 与 Java单线程和多线程抓取 相关参考:关于Python和Java的多进程多线程计算方法对比 6. 对于Ajax请求的处理 对于“加载更多”情况,使用Ajax来传输很多数据。 它的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行JavaScript程序。这些程序会加载更多的内容,“填充”到网页里。这就是为什么如果你直接去爬网页本身的url,你会找不到页面的实际内容。 这里,若使用Google Chrome分析”请求“对应的链接(方法:右键→审查元素→Network→清空,点击”加载更多“,出现对应的GET链接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。 如果“请求”之前有页面,依据上一步的网址进行分析推导第1页。以此类推,抓取抓Ajax地址的数据。 对返回的json格式数据(str)进行正则匹配。json格式数据中,需从'\uxxxx'形式的unicode_escape编码转换成u'\uxxxx'的unicode编码。 7. 自动化测试工具Selenium Selenium是一款自动化测试工具。它能实现操纵浏览器,包括字符填充、鼠标点击、获取元素、页面切换等一系列操作。总之,凡是浏览器能做的事,Selenium都能够做到。 这里列出在给定城市列表后,使用selenium来动态抓取去哪儿网的票价信息的代码。 参考项目:网络爬虫之Selenium使用代理登陆:爬取去哪儿网站 8. 验证码识别 对于网站有验证码的情况,我们有三种办法: 使用代理,更新IP。 使用cookie登陆。 验证码识别。 使用代理和使用cookie登陆之前已经讲过,下面讲一下验证码识别。 可以利用开源的Tesseract-OCR系统进行验证码图片的下载及识别,将识别的字符传到爬虫系统进行模拟登陆。当然也可以将验证码图片上传到打码平台上进行识别。如果不成功,可以再次更新验证码识别,直到成功为止。 参考项目:Captcha1 爬取有两个需要注意的问题: 如何监控一系列网站的更新情况,也就是说,如何进行增量式爬取? 对于海量数据,如何实现分布式爬取? 分析 抓取之后就是对抓取的内容进行分析,你需要什么内容,就从中提炼出相关的内容来。 常见的分析工具有正则表达式,BeautifulSoup,lxml等等。 存储 分析出我们需要的内容之后,接下来就是存储了。 我们可以选择存入文本文件,也可以选择存入MySQL或MongoDB数据库等。 存储有两个需要注意的问题: 如何进行网页去重? 内容以什么形式存储? Scrapy Scrapy是一个基于Twisted的开源的Python爬虫框架,在工业中应用非常广泛。 相关内容可以参考基于Scrapy网络爬虫的搭建,同时给出这篇文章介绍的微信搜索爬取的项目代码,给大家作为学习参考。 参考项目:使用Scrapy或Requests递归抓取微信搜索结果
基于Python Scrapy实现的蜂鸟数据采集爬虫系统 含代理、日志处理和全部源代码等 import scrapy from fengniao.items import FengniaoItem from scrapy.spidermiddlewares.httperror import HttpError from twisted.internet.error import TimeoutError, TCPTimedOutError, DNSLookupError, ConnectionRefusedError class FengniaoclawerSpider(scrapy.Spider): name = 'fengniaoClawer' allowed_domains = ['fengniao.com'] # 爬虫自定义设置,会覆盖 settings.py 文件中的设置 custom_settings = { 'LOG_LEVEL': 'DEBUG', # 定义log等级 'DOWNLOAD_DELAY': 0, # 下载延时 'COOKIES_ENABLED': False, # enabled by default 'DEFAULT_REQUEST_HEADERS': { # 'Host': 'www.fengniao.com', 'Referer': 'https://www.fengniao.com', }, # 管道文件,优先级按照由小到大依次进入 'ITEM_PIPELINES': { 'fengniao.pipelines.ImagePipeline': 100, 'fengniao.pipelines.FengniaoPipeline': 300, }, # 关于下载图片部分 'IMAGES_STORE': 'fengniaoPhoto', # 没有则新建 'IMAGES_EXPIRES': 90, # 图片有效期,已经存在的图片在这个时间段内不会再下载 'IMAGES_MIN_HEIGHT': 100, # 图片最小尺寸(高度),低于这个高度的图片不会下载 'IMAGES_MIN_WIDTH': 100, # 图片最小尺寸(宽度),低于这个宽度的图片不会下载 # 下载中间件,优先级按照由小到大依次进入 'DOWNLOADER_MIDDLEWARES': { 'fengniao.middlewares.ProxiesMiddleware': 400, 'fengniao.middlewares.HeadersMiddleware': 543, 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None, }, 'DEPTH_PRIORITY': 1, # BFS,是以starts_url为准,局部BFS,受CONCURRENT_REQUESTS影响 'SCHEDULER_DISK_QUEUE': 'scrapy.squeues.PickleFifoDiskQueue', 'SCHEDULER_MEMORY_QUEUE': 'scrapy.squeues.FifoMemoryQueue', 'REDIRECT_PRIORITY_ADJUST': 2, # Default: +2 'RETRY_PRIORITY_ADJUST': -1, # Default: -1 'RETRY_TIMES': 8, # 重试次数 # Default: 2, can also be specified per-request using max_retry_times attribute of Request.meta 'DOWNLOAD_TIMEOUT': 30, # This timeout can be set per spider using download_timeout spider attribute and per-request using download_timeout Request.meta key # 'DUPEFILTER_CLASS': "scrapy_redis.dupefilter.RFPDupeFilter", # 'SCHEDULER': "scrapy_redis.scheduler.Scheduler", # 'SCHEDULER_PERSIST': False, # Don't cleanup red

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昊昊该干饭了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值