Python_爬虫心得2_Cookie

网站爬取思路总结2
1、Cookie介绍
  • (1)cookie的类型:会话cookie和持久cookie;其唯一的区别在于过期时间,如果设置了Discard参数,或者没有设置Expires或Max-Age参数来说明扩展的过期时间,这个cookie就是一个会话cookie.
    • a.会话cookie:是一种临时的cookie,它记录了用户访问站点时的设置和偏好,用户退出浏览器时,会话cookie就被删除了。
    • b.持久cookie的生存时间更长一些,它们存储在硬盘上,浏览器退出,计算机重启时它们仍然存在。通常用持久cookie维护某个用户会周期性访问的配置文件或登录名。
  • (2)cookie是如何工作的:cookie就像服务器给用户贴的“(。・∀・)ノ゙嗨,我叫”的贴纸一样,cookie中包含了一个由名字=值这样的信息构成的任意列表,并通过set-Cookie或set-cookie2HTTP响应首部将其贴到用户身上去。浏览器会记住从服务器返回的set-cookie或set-cookie2首部中的cookie内容,并将cookie集存储在浏览器的cookie数据库中。
  • (3)cookie罐:客户端的状态,cookie的基本思想就是让浏览器积累一组服务器特有的信息,每次访问服务器时都将这些信息提供给它。因为浏览器要负责存储cookie信息,所以此系统被称为客户端侧状态,cookie规范的正式名称为HTTP状态管理机制。
2、应对生成的cookie常用解决方法
  • (1)cookie参数一般是通过两种方式生成,一种是服务端返回的cookie,对于通过python当中request请求网页链接,在response.cookies里面即可拿到cookie参数。
  • (2)另一种是网页端有javascript代码生成的cookie,对于这种情况,首先需要借助工具(https://blog.csdn.net/weixin_43411585/article/details/90339557 )去找到生成cookie的javascript代码,如何找到javascript代码?步骤如下:
    • a.首先将打开谷歌开发者工具(一般按F12即可打开),清除掉网页缓存的cookie参数以及其他的参数。
      在这里插入图片描述
    • b.确定生成cookie的javascript代码。打开抓包工具,如mitmproxy,刷新页面,查看左侧的一条条请求,看何时多了cookie参数,以及其response返回的代码;有时候javascript代码在response体里面;有时候网页源代码也有可能隐藏了js代码。
      在这里插入图片描述
  • (3)针对javascript代码生成的cookie参数,一些解决方法:
    • a.用python里面的requests的session请求,可以跨网页维持同一个会话cookie;
    • b.通过selenium可以获得cookie参数
    • c.用execjs解密js代码获得cookie参数
3、通过requests的session会话对象来进行处理cookie参数
  • (1)session会话对象让你能够跨请求保持某些参数,可以在同一个 Session 实例发出的所有请求之间保持 cookie。(ps:期间使用 urllib3 的 connection pooling 功能。所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用, 从而带来显著的性能提升)
  • (2)session维持回话例子解释:
  • (3)session和cookies:在浏览一些网站,比如购物的时候,我们常常需要先登陆,登陆过后我们可以连续访问网站,并且可以将我们需要的购买的东西加入购物车。但是有时候我们中途过了一段时间没有操作就需要重新登陆。还有某些网站,打开网页之后就已经登陆了。这些功能看起来来很神奇,其实都是Session和Cookie在发挥作用。
  • (4)例子:
import requests
url1 = "http://hd.chinatax.gov.cn/fagui/initCredit.jsp"
session = requests.Session()
resp1 = session.get(url1, headers=headers, timeout=50)
url2 = 'http://hd.chinatax.gov.cn/pepp4_lakers'
resp2 = session.post(url2, data=data, headers=headers, timeout=50)
print(resp2.cookies)
4、通过chrome的headless配合selenium获得cookie参数
  • (1) 先用selenium 获取 url的cookies, 这里用selenium + chrome的好处是 获取到的cookies就是加密过后的,无需你执行js代码。
  • (2)再用二次cookies 再次get(url) 这样就能正常访问了 获得到的html.page_source 就可以用beautifulsoup4来解析了。
  • (3)例子:以下代码里,driver.get_cookies()即可获得cookies,(ps绝大多数情况下不会出现__jsluid参数,服务端有时候返回521状态码时,就会有__jsluid参数)
from selenium import webdriver
def driver_chrome_cookie():
    # 谷歌浏览器无头模式
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--headless")
    driver = webdriver.Chrome(options=chrome_options)
    driver.get('http://www.cyicai.com/information/applyForSubscription')
    cookies = driver.get_cookies()
    print(cookies)
    if cookies[0]['name'] == '__jsluid':
        new_cookies = cookies[0]['name'] + '=' + cookies[0]['value'] + ';' + cookies[1]['name'] + '=' + cookies[1]['value']
        print(new_cookies)
if __name__ == '__main__':
    driver_chrome_cookie()
5、用execjs解密js代码获得cookie参数
  • (1)通过chrome浏览器控制台可以创建js脚本并调试执行,详细操作
    在这里插入图片描述
  • (2)chrome浏览器控制台Console选项卡也可以修改代码运行查看结果。以下原js代码里面,会将eval语句替换成return语句,存放到1.js文件里面,然后读出来用execjs执行。
    在这里插入图片描述
  • (3)站长工具 格式化js代码
    在这里插入图片描述
  • (4) 安装execjs库:pip install PyExecjs;并安装运行环境node.js;(ps:windows里面execjs会自动匹配node.js环境)
  • (5)在用execjs之前,需要观察分析你获取的js是代码逻辑,一般情况下降js中的eval更改成return,以及一些replace来替换js代码,即可获取到最终python里面要执行的js代码。(ps如果js中有dom或者window这样的东西,execjs貌似就无法执行了)。
  • (6)python爬虫返回521状态码例子:其中js代码存放在1.js文件里面。
import execjs
with open('1.js', 'r') as f:
    js_text = f.read()
    parse_js = execjs.compile(js_text).call('f')
    print('解密后的js:', parse_js)
    parse_js = parse_js.replace(r"document.createElement('div');_44.innerHTML='<a href=\'/\'>_a</a>';_44=_44.firstChild.href;var _e=_44.match(/https?:\/\//)[0];_44=_44.substr(_e.length).toLowerCase()", '"http://www.cyicai.com/"')
    parse_js = 'var a' + parse_js.split('document.cookie')[1].split("Path=/;'")[0] + "Path=/;';return a;"
    js_final = "function getClearance(){" + parse_js + "};"
    jsl_clearance = execjs.compile(js_final).call('getClearance')
    print(jsl_clearance)
    jsl_cle = jsl_clearance.split(';')[0]
    print(jsl_cle)
# 输出结果
# 解密后的js: var _44=function(){setTimeout('location.href=location.pathname+location.search.replace(/[\?|&]captcha-challenge/,\'\')',1500);document.cookie='__jsl_clearance=1559007716.074|0|'+(function(){var _e=[function(_44){return _44},function(_e){return _e},(function(){var _44=document.createElement('div');_44.innerHTML='<a href=\'/\'>_a</a>';_44=_44.firstChild.href;var _e=_44.match(/https?:\/\//)[0];_44=_44.substr(_e.length).toLowerCase();return function(_e){for(var _a=0;_a<_e.length;_a++){_e[_a]=_44.charAt(_e[_a])};return _e.join('')}})(),function(_44){for(var _e=0;_e<_44.length;_e++){_44[_e]=parseInt(_44[_e]).toString(36)};return _44.join('')}],_44=['%2FK',[(-~[([(-~{}<<-~{})]+~~[]>>(-~{}<<-~{}))]+[]+[[]][0])],'8In',[[(-~{}<<-~{})]+[-~[-~[-~[]-~[]]-~[]-~[]-~[]-~[]]]],'d',[[(-~{}<<-~{})]+[-~[-~[-~[]-~[]]-~[]-~[]-~[]-~[]]]],[(+!+[])/~~''+[]+[[]][0]][0].charAt(~~[]),'xPASrSVQnGK',[(2<<-~{})],'p',(-~!/!/+[]+[[]][0]),'w',[[-~[-~[]-~[]]]+[~~![]]],'Y%3D'];for(var _a=0;_a<_44.length;_a++){_44[_a]=_e[[1,2,1,3,1,3,0,1,0,1,0,1,3,1][_a]](_44[_a])};return _44.join('')})()+';Expires=Tue, 28-May-19 02:41:56 GMT;Path=/;'};if((function(){try{return !!window.addEventListener;}catch(e){return false;}})()){document.addEventListener('DOMContentLoaded',_44,false)}else{document.attachEvent('onreadystatechange',_44)}
# __jsl_clearance=1559007716.074|0|%2FK/8InsdsIxPASrSVQnGK4p1wuY%3D
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值