python爬虫(四)cookie模拟登录和反反爬案例 | 您所在的位置:网站首页 › 怎么使用python进行爬虫 › python爬虫(四)cookie模拟登录和反反爬案例 |
处理不被信任证书的网站
SSL证书:数字证书的一种,配置在服务器上面的,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。 SSL证书的特点:遵循了SSL协议,由收信任的数字证书颁发机构CA,验证身份之后颁发的证书,同时具有服务器身份验证和数据传输加密功能。 SSL证书的发展历程: 为啥网站会出现SSL证书? 具有服务器身份验证和数据传输加密的功能,https是http的安全版本,是在http的基础上添加的安全阶层(ssl层),https在传输的时候,就有ssl加密和解密的过程,能够保证数据传送的安全性,大多数网站用的都是https,http用的就比较少了,打开http开头的网站会提示不安全。https = http + ssl http升级成https时,需要ssl证书,一旦有了ssl证书后,数据传输的安全有了保证,就成了https。ssl证书得到有两种方法:一是自己做,大型的公司有专门的团队去做;二是找专业的第三方平台去做。自己做的话需要找专门的机构去认证,否则不会被信任。 有些网站不被信任可能就访问不了,但是像税务网站,一般没有需求的人也不会去访问,某种程度上数据更安全了。 测试网站: https://inv-veri.chinatax.gov.cn/ 打开后左侧显示“不安全”三个字,但是也是https开头的,是因为所做的证书没有去认证。 需求:向一个不被SSl信任的网站发起请求 爬取数据 目标url:https://inv-veri.chinatax.gov.cn/ 如果单纯的用以前的requests模块就爬取不了该种网站,requests模块在向网站发起请求的时候会自动的检测数字证书,发现数字证书是不被信任的,就会抛出异常。代码如下: import requests # 目标url url = 'https://inv-veri.chinatax.gov.cn/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62' } res = requests.get(url, headers=headers) print(res.text)返回的结果 raise SSLError(e, request=request) requests.exceptions.SSLError: HTTPSConnectionPool(host='inv-veri.chinatax.gov.cn', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),))可以看到返回的是SSLError,证书错误。 如果想正常爬取,那就不让requests去检测证书,绕开检测的过程。 把模块里面的参数更改一下 requests verify:True(默认) 改为False,代码如下: import requests url = 'https://inv-veri.chinatax.gov.cn/' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.62' } res = requests.get(url, headers=headers, verify=False) print(res.content.decode('utf-8'))返回的就是正常的网页源代码。 cookiecookie :通过在客户端记录的信息确定用户身份。 http 是一种无连接的协议,客户端与服务端交互仅限于请求/响应的过程,结束断开之后,下次再发送请求的时候,服务器会认为是一个新的客户端,需要重新登录。 cookie是用来记录用户的相关信息的,为了维护客户端与服务器之间的连接,让服务器知道这是前一个用户发起的请求,须在cookie保存客户端信息,服务器能根据cookie识别用户。 在爬虫里的作用: 1、反反爬,添加在请求头里面 2、模拟登录,cookie里保存了用户的信息,根据这些信息可以模拟登录 模拟登录模拟登录QQ空间,两种方式,一种是发送post请求,携带账号和密码;另一种是携带上cookie,放到请求头里面,利用cookie里的用户相关信息进行模拟登录。 cookie是有短时间时效的,有时间限制的。 先用账号密码登录QQ空间,获得到cookie值,查找方法:右键–>检查–>Network–>ALL–>name里找到账号的文件–>Headers–>cookie 代码实现步骤 import requests # 目标url url = 'https://user.qzone.qq.com/2857223830' headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'cookie': 'RK=qwqpfQMzZJ; ptcz=6e5a140ff2dca613f294ab87a0f98971ad65c71de8dc526bf2c63a616abc0742; pgv_pvid=5338039365; pgv_pvi=5044524032; eas_sid=U136f0K3G1c9u3w2I6M8m3t4A9; QZ_FE_WEBP_SUPPORT=1; iip=0; o_cookie=2848065047; pac_uid=1_2848065047; ptui_loginuin=2848065047; LW_uid=41q6W217O900S4t1O0L7x9c2g6; LW_sid=E1Y6c2z8S0Z7E9M8U7u586g241; Qs_lvt_323937=1627904101%2C1628143469%2C1628143499%2C1628143668; Qs_pv_323937=1368371168209609500%2C114634090121099730%2C1710645776964985000%2C1313584778008226600%2C3130810977975156700; _qpsvr_localtk=0.9617017507896697; pgv_info=ssid=s4848159419; uin=o2857223830; skey=@ZXFRKI3IN; p_uin=o2857223830; pt4_token=jxfBCr9DPIvx-UPPwEJ4C3vBg6li1kLw393G8Fp1Q-c_; p_skey=g3sxv8VzLDMT*wXdf0UuV4WceQo3kVzqk*N*84GFPfg_; Loading=Yes; qz_screen=1920x1080; 2857223830_todaycount=0; 2857223830_totalcount=3; x-stgw-ssl-info=d7bed04d465422226f28bc44d2d9e6f6|0.194|-|27|.|I|TLSv1.2|ECDHE-RSA-AES128-GCM-SHA256|26500|h2|0; cpu_performance_v8=8' } res = requests.get(url, headers=headers) html = res.content.decode('utf-8') # print(html) # 保存成网页的形式 with open('qzone.html','w',encoding='utf-8') as f: f.write(html)这里是用的已经登录进去的QQ的cookie,可以模拟登录到相应的QQ空间,页面比着直接登录的稍微有一点不同,图片没有渲染出来。 反反爬在请求头里添加user-agent是反反爬的第一步,有些网站会检查cookie的。 页面分析 以12306为例。查询8月19日北京到长沙的商务座。 返回的结果是 K599 无票 G403 无票 Z149 无票 G421 有票 G79 有票 G401 无票 Z35 无票 Z161 无票 G533 有票 G67 有票 G505 有票 Z5 无票 Z201 无票 K157 无票 T289 无票 Z53 无票整个代码实现过程就是 先获取网页源码,在获取网页源码前先找一下真正请求的url,如果说请求的数据没有在对应的url源码里面,我们就要去Network里面去找,Ajax加载的数据包接口很大一部分数据是在XHR中,找到Headers里面真正的请求url,我们向url发送请求,如果不携带cookie会请求不到数据,12306对cookie做了反爬的策略,带上之后就可以正常的访问数据了,获取的是str类型的数据,通过json方法转为字典,通过key提取出value值,用for循环遍历出来每一条车次的数据信息,通过“|”对数据进行分割,把分割好的数据放到列表里面,通过列表的下标取值提取出索引的内容,最后通过取出的值判断是否有票。 补充请求与响应爬虫时,有时候会在鼠标右键–>检查页面源代码中找数据,有时候会在点右键–>检查,到Network里面去找数据,抓取的数据来源于服务器渲染和客户端渲染 服务器端渲染: 能够在网页源码中看到数据,在页面源码里可以找到数据。百度搜索关键字,通过浏览器向服务器发送请求,带上请求的URL,百度服务器接到请求之后,就会返回一个响应,得到响应数据,放到html文件里,html文件有固定的格式,里面的数据是根据搜索的内容放进去的,随着搜索内容的不同而发生变化,服务器会把html固定格式的文件和搜索到的结果拼接好之后返回成一个完整的html文件给客户端浏览器,浏览器拿到完整的html文件后直接解析展示就可以了。 特点 :html框架和数据的整合是在服务器端一次性完成的,我们爬数据只需要获取网页源代码就可以了。 客户端渲染: 不能够在网页源码中看到数据。比如12306,搜索车次后在搜索界面的Network–>ALL–>左侧init开头的文件里–>Preview里可以看到,是从浏览器地址发起请求,得到的是html的框架。好看视频也是一样的,打开好看视频首页,点右键–>检查–>Network–>ALL–>左侧name–>?fr=pc_pz的文件,可以看到发起请求得到的是网页框架,里面并没有视频,典型的Ajax加载的网页。 向网页发起请求,返回的只是html框架,再次携带数据发送请求,服务器端才会返回数据的内容,在客户端会把html框架和数据进行整合,之后才有我们所看到的界面,这就是Ajax请求的基本原理 Ajax请求,第一次返回的只是html框架,并没有数据,第二次请求数据的时候,在客户端对html框架和数据进行整合。所以爬虫的时候如果向第一次请求的url发送请求时,得到的只是html框架,没有数据;想要拿到数据,就要在Network里找到对应的数据包,Network里记录了客户端和服务器交互的记录。 两种方式的示意图如下: |
CopyRight 2018-2019 实验室设备网 版权所有 |