处理不被信任证书的网站

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'))

返回的就是正常的网页源代码。

​cookie

cookie :通过在客户端记录的信息确定用户身份。
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日北京到长沙的商务座。

图片中可以看到筛选出来16个车次,以G421次车,商务座为例。车次,座位的交叉点就是所需要的值。人可以用肉眼看到车次信息,座位有无,如何让程序自动去判断车次有无票,车次所对应的座位有无票,如果出现“有”,数字是有票的,出现空,候补等是无票的。
爬取数据之前,要先知道数据在哪。点右键,查看网页源代码,可以看到想要的车次数据并不在里。右键,检查,在Elements里可以找到G421,Elements是网页最终渲染的结果,跟网页源码有区别的,会跟我们看到的数据进行实时的同步处理。
在Network–>ALL–>name里找到query开头的文件。12306是由Ajax加载出来的,Ajax技术网页应用能够快速的将增量更新呈现在用户界面上,不需要重新加载(刷新)整个页面,使得程序能够快速的回应用户的操作。我们在没有刷新整个页面的基础上,刷新出了部分数据,这就是用到了Ajax的技术。Response里存放的响应数据,Preview里把数据按照格式进行排列,方便查找。

在Preview里点开data,result,可以看到检索出来16条数据,跟筛选出来的车次数目是一致的,拖动下面的滑块向右滑动,可以看到预定,车次,时间,有,无等信息。这样的话,在Headers,Geneal里的Requesr URL就是我们需要爬取的,而不是页面的url(不包含车次数据)。

以上步骤是页面分析的过程,找到了数据所在的位置,可以看一下,找到的数据是用“|”分割的字符串,可以用字符串的切割方法split("|")把数据分开,返回的是列表,再用列表的下标去取值
实现步骤

import requests
url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2021-08-19&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT'
# url 里带有日期信息的,这里查找的是8月19日的车票,如果在20号以后就查不到车票
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': 'JSESSIONID=E61FD1D6BF81E1300242A33B90CB2818; _jc_save_wfdc_flag=dc; BIGipServerotn=1039139338.24610.0000; RAIL_EXPIRATION=1628869251229; RAIL_DEVICEID=apZj5B3AqiMmFqWmx3mULLeMBaeV9Crr0ezPDCGTxoh-GhQ5k0I_PBZaqCF_wnp4LJZWNBPKlxk5vEaCM7n8hqT86B8oB3GA8tBl8_iBWg8CaEX59Oq2QCPV35TH_I300vwR-Hj3iFjlMcSj7-c_Nd1V6WEqMlWG; BIGipServerpool_passport=233046538.50215.0000; route=9036359bb8a8a461c164a04f8f50b252; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u957F%u6C99%2CCSQ; _jc_save_fromDate=2021-08-19; _jc_save_toDate=2021-08-10'
}# 如果不加cookie,得到数据没有日期和车次信息
# 登录QQ空间的cookie是携带用户信息的用于模拟登录,而此时的cookie是没有登录的是用于反反爬
# 获取网页源码
res = requests.get(url, headers=headers)
# html = res.content.decode('utf-8')# 返回的是字符串,不好对里面的内容进行提取
# print(html)# 如果我们获取的数据不在网页源代码里,而是通过数据包的形式获取的,是json格式的,可以转化为#json格式的字典,可以通过Key,取出Value值
html_d = res.json() # 这里直接调用res对象的方法,不需要导入json库,跟urllib.request一样,不需要导入requests库
# print(type(html), type(html_d)) # <class 'str'> <class 'dict'>,通过数据包得到的数据都可以直接转为json
# print(html_d)
# 解析数据
results = html_d['data']['result'] #我们需要的数据是result的value值,result整体又是data的value值
# print(results)
for result in results:# # print(result)# # print("*"*100) #遍历出每一个车次的信息,用*分割开data_list = result.split('|') #返回的是一个列表# flag = 0# for d in data_list:#     print(flag, d)#     flag += 1 # 把列表每一个数据前面都增加一个序号,列表下标从0开始,这里也是从0开始,每次循环都增加1# print("*"*50) # 每一个车次用*分开,对每一个车次信息进行遍历,取出每一个车次的每一个值,要找到特等座的信息比较麻烦,可以在每一个数据前面加上数值,然后按数值取出车次和座位的值。# 通过上面的代码运行后我们可以看到,车次是在下标为3的位置,特等座是在下标为32的位置,下面进行一下判断t_name = data_list[3] # 列车名t_number = data_list[32] # 特等座位信息# print(t_name, t_number)# 进行判断if t_number != '' and t_number != '无':print(t_name, '有票')else:print(t_name, '无票')

返回的结果是

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里记录了客户端和服务器交互的记录。
两种方式的示意图如下:

python爬虫(四)cookie模拟登录和反反爬案例相关推荐

  1. python爬虫(四)——模拟登录丁香园

    实战 实战小项目:模拟登录丁香园,抓取论坛页面人员基本信息与回复帖子.丁香园论坛:http://www.dxy.cn/bbs/thread/626626#626626 思路 首先把登陆方式由扫码切换为 ...

  2. 利用python爬虫(part15)--cookie模拟登陆

    学习笔记 文章目录 cookie模拟登陆 获取cookie 爬取我的简介 cookie模拟登陆 有的时候,我们想要抓取一个网站,但是需要先登录才能访问它,如果不输入用户名和密码,我们就会一直停留在登录 ...

  3. python爬虫4.1模拟登录古诗词网并通过Cookie处理获取个人信息

    1.前言 好久没有写过笔记了....本来这节内容是模拟登录人人网,但是人人网现在无法注册了...就换了家网站.这个代码是可以模拟登录古诗词网,进入登录成功后跳转的页面后,再进入个人收藏界面,获取个人收 ...

  4. Python 爬虫实战5 模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 python模拟登录淘宝网页 获取登录用户的所有订单详情 ...

  5. python爬虫实现豆瓣模拟登录

    这是豆瓣登录界面URL https://www.douban.com/accounts/login 用pychrm编写爬虫代码 import requests url = 'https://www.d ...

  6. Python爬虫实战:模拟登录淘宝网站

    前言 在完成爬虫任务的时候,我们总是会遇到用户账号登陆的问题,如果自己手动登陆的话,那么工作量就很大了,如何解决登陆问题呢? 今天老师带领大家使用selenium完成淘宝账号登陆 本篇文章知识点: s ...

  7. python爬虫学习之模拟登录淘宝

    使用教程 下载chrome浏览器 查看chrome浏览器的版本号,对应版本号的chromedriver驱动 pip安装下列包 pip install selenium 登录微博,并通过微博绑定淘宝账号 ...

  8. 【Python爬虫】:模拟登录QQ空间

    观察了下QQ空间实在是太好登录了!只需要首先点击账号密码登录,然后输入你的账号和密码就可以了! 其中需要注意的是; 1.进行第一次点击的时候,点击"账号密码"的时候,需要首先切换到 ...

  9. Python爬虫——Cookie模拟登录

    文章目录 Python爬虫--Cookie模拟登录 1.Cookie模拟登录 2.Handler处理器 Python爬虫--Cookie模拟登录 1.Cookie模拟登录 现在很多网站需要用户成功登录 ...

  10. Python 利用 cookie 模拟登录,爬取指定关键词的淘宝商品信息

    Python 利用 cookie 模拟登录,爬取指定关键词的淘宝商品信息-Selenium 1. 本文目标 由于淘宝网站的不断更新,以前的爬取方法都无法重现,必须需要登录淘宝网站才可以进行搜索商品.所 ...

最新文章

  1. 为什么 Python 会成为程序员害怕的编程语言?
  2. Android 探究 LayoutInflater setFactory
  3. hdu 4753 Fishhead’s Little Game
  4. 控件UI性能调优 -- SizeChanged不是万能的
  5. 我的梦幻动画实习工作总结
  6. 有道云笔记Android app离线缓存,有道云笔记Android版升级 增加笔记离线阅读与收藏...
  7. js 操作vuex数据_请教个有关 Vue.js 使用 Nuxt.js 服务端渲染,使用 Vuex 取数据的时候报错...
  8. Lesson6 how to use HTML QT Widgets
  9. ubuntu系统没有声音解决方法
  10. 使用ping方法,依据TTL值,探测对方主机操作系统
  11. 两款JAVA大型OA自动化办公系统源码
  12. 数学建模论文写作方法
  13. 智能客服搭建(4) - 语音流的分贝计算
  14. Failed to load project configuration: cannot parse file xxx Message: 前言中不允许有内容。
  15. OC - @preperty的一些修饰词
  16. 来TDengine 开发者大会,探索数据架构的迭代升级
  17. rls最小二乘法 c语言,RLS递归最小二乘(最新整理)
  18. 谷歌扩展工具下载网址---最新
  19. irc 开源软件_前4个开源IRC客户端
  20. mysql空间数据类型的使用_MySQL空间数据类型

热门文章

  1. 我的MBTI 职业性格分析报告——ISFP型
  2. JS逆向寻找生成bid变量的加密算法,一顿操作猛如虎,结果发现原来是混淆代码
  3. 抖音国庆小游戏是如何实现的?带你走近 Cocos
  4. 苹果为小学生推出编程指南
  5. Visual Assist 10.9.2248 破解版(支持VS2017)
  6. Linux删除Nginx有残留怎么办?
  7. laravel集成谷歌验证_如何将Google的两因素身份验证添加到Laravel
  8. 20-《电子入门趣谈》第四章_自己制作电路板-4.1面包板的介绍和经典案例使用教程
  9. Python批量处理表格有用吗_python批量读入图片、处理并批量输出(可用于深度学习训练集的制作)...
  10. 太赞了!图解SQL基础知识,菜鸟也能看懂的SQL文章!