一木.溪桥学爬虫-04:requests模块
一木.溪桥 在Logic Education跟Jerry学爬虫
07期:Python 爬虫
一木.溪桥学爬虫-04:requests模块、cookie、session
日期:2021年1月31日
学习目标:
requests模块
cookie
session
学习内容:
requests安装
- pip install requests
- pip install requests -i https://pypi.douban.com/simple
requests快速入门(重点)
requests.get(网址)
requests.content
是直接从网站上抓取的数据,没有做任何的处理,也就是没有做任何的编码。返回字节流数据(二进制)
requests.text
requests 模块将response.content 解码后得到的字符串requests模块它会猜一个解码方式 所以你在使用 response.text来查询响应结果的时候就会出现乱码:返回unicode格式的数据(str)
encode 编码
decode 解码
response.content.decode(‘utf-8’) 手动进行解码
response.url 返回url
response.encode() = ‘编码’
import requests
# 添加heasers
# 问题一 数据不对
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}
# 携带参数
kw = {'wd': '中国'}
# 发起请求
response = requests.get('https://www.baidu.com/s?', params=kw, headers=headers)
# 响应对象
print(response.text) # 获取网页源码
print(response.url) # 获取请求的url
import requests# 问题二 数据乱码
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'
}# 发起请求
response = requests.get('https://qq.yh31.com/zjbq/2920180.html', headers=headers)
# print(response.text) 返回的是 str
# print(response.content) # 返回的是 bytes
# print(response.content.decode('utf-8')) # 推荐用这种方式 它返回的也是str类型的数据response.encoding = 'utf-8'
print(response.text)
requests 小技巧
设置代理
解决的是什么问题?
- 解决的是一种封IP的反爬机制。
设置代理
代理服务器的IP
import requests url = 'http://httpbin.org/ip' # 设置代理 proxy = {'http': '124.205.155.154:9090' } res = requests.get(url, proxies=proxy) print(res.text)
代理IP的作用
- 隐藏真实IP
- 反反爬
如何找代理IP
- 免费的IP(几乎用不了)
- 付费的IP
- 快代理
匿名度
- 透明:它知道你真实的IP,也知道你使用了代理
- 匿名:它知道你使用了代理,但是不知道你真实的IP
- 高匿:不知道你使用了代理,也不知道你真实的IP
处理不信任的SSL证书
SSL证书是数字证书的一种,类似于驾驶证、护照和营业执照的电子副本。因为配置在服务器上,也称为SSL服务器证书。SSL 证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。
测试网站 https://inv-veri.chinatax.gov.cn/
res = requests.get(url, verify=False)
import requestsurl = 'https://inv-veri.chinatax.gov.cn/' res = requests.get(url, verify=False) # verify=False处理不信任的SSL证书的方法 print(res.text)
cookie
cookie :通过在客户端记录的信息确定用户身份。
HTTP是一种无连接协议,客户端和服务器交互仅仅限于 请求/响应过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,让服务器知道这是前一个用户发起的请求,必须在一个地方保存客户端信息。
cookie在爬虫当中有什么作用?
反反爬(分情况)有的情况需要加上cookie,而有的情况加上cookie反而不好。
import requests url = 'https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=2021-01-31&leftTicketDTO.from_station=CSQ&leftTicketDTO.to_station=BXP&purpose_codes=ADULT' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36','Cookie':'_uab_collina=159490169403897938828076; JSESSIONID=059E6A956317A6C29612191B80756EAE; _jc_save_wfdc_flag=dc; _jc_save_fromStation=%u957F%u6C99%2CCSQ; _jc_save_toStation=%u5317%u4EAC%2CBXP; BIGipServerotn=770703882.38945.0000; BIGipServerpool_passport=82051594.50215.0000; RAIL_EXPIRATION=1612306095523; RAIL_DEVICEID=MUbHpgONO-X61Z236wAlH9EJl5tTVqhKDGL0CK19twFmu4Q2DzVSkR6Vzo5JmksTSutFybiXbqLCiq58Ogotzy4h_80GW4xL9sywrvxTIbthUTAS_qAPqjJ9doueJxATHNiptXa4jZrfnbXeQ07idJRMe5vs2NAo; route=495c805987d0f5c8c84b14f60212447d; _jc_save_fromDate=2021-01-31; _jc_save_toDate=2021-01-30'} res = requests.get(url, headers=headers) print(res.content.decode('utf-8'))
模拟登录
# 人人网模拟登录 import requests headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36','Cookie':'anonymid=kc1mze9joexboe; _r01_=1; taihe_bi_sdk_uid=c5ab893b13e43548f001c993d2154595; ''jebe_key=5337f110-24a5-48d0-9393-8a1a4cc620c5%7Cbd5a1aba8e897ca35d9faabeb72dc675%7C1593503968723%7C1%7C1593503971085; jebe_key=5337f110-24a5-48d0-9393-8a1a4cc620c5%7Cbd5a1aba8e897ca35d9faabeb72dc675%7C1593503968723%7C1%7C1593503971087; depovince=HUN; JSESSIONID=abclfrdcXF9NbbatAOIDx; taihe_bi_sdk_session=65324970426d3a0861752a5ee25f5daa; ick_login=95400701-ce98-4eef-8120-5aeb3cb0dd9e; t=3b767095c882e7b11e76f06b0f1ca7584; societyguester=3b767095c882e7b11e76f06b0f1ca7584; id=974676254; xnsid=9d5e007a; jebecookies=498dd881-4b83-45e3-bcde-e57009790821|||||; ver=7.0; loginfrom=null; wp_fold=0' } url = 'http://www.renren.com/974676254/profile' req = requests.get(url, headers=headers) # print(req.text) with open('rr2.html', 'w', encoding='utf-8') as file_obj:file_obj.write(req.text)
补充 遇到ajax加载的数据 动态网页的数据(不在源码当中) 解决方式一 可以在NetWork中分析它的数据接口(看12306的案例) 解决方式二 可以通过selenium来获取数据 (以后在说)
requests.session()(拓展)
session:通过在服务端记录的信息确定用户身份
在这里我们主要说的是requests模块中的session 指的就是一个会话。
- requests.session() # 保持会话
例:需求:突破12306图片验证码 {result_message: “验证码校验成功”, result_code: “4”}
- 第一种 账号正确 密码错误 验证码错误 {result_message: “验证码校验失败”, result_code: “5”}
- 第二种 账号正确 密码错误 验证码正确 {result_message: “验证码校验成功”, result_code: “4”} login
- 第三种 账号正确 密码正确 验证码正确
步骤
- 第一步 明确目标url https://kyfw.12306.cn/passport/captcha/captcha-check
第二步 采用post 请求携带数据 response
第三步 要获取验证码的图片
第四步 找到正确的验证码
补充 注意 data:image/jpg;base64 需要删掉 https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1612270067237&callback=jQuery19103867502059860666_1612270057099&_=1612270057100 https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1612268610660&callback=jQuery19107815595372326347_1612268556807&_=1612268556812 二者相同的内容 https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand 它就是一个12306图片验证码的链接 需要删除 64 https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand 分析总结 我们由正常的方式发现这个代码比较臃肿。所以就采用另外的方式来获取验证码的图片链接。 第一次 打开登录页面的时候就有这个图片那就证明 肯定是有一个地址的存在 然后经过尝试和对比 得出了一个12306图片验证码的url
import requests req = requests.session() # 保持会话 # 主机是win10 python 3.6.5 # win7 python 3.6.4 def login():# 获取图片,对比https,删除-image64中的64pic_response = req.get('https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand')codeImage = pic_response.contentfn = open('code2.png', 'wb')fn.write(codeImage)fn.close()headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}# 投机行为codeStr = input('请输入验证码坐标:')data = {'answer': codeStr,'rand': 'sjrand','login_site': 'E',}response = req.post('https://kyfw.12306.cn/passport/captcha/captcha-check', data=data, headers=headers)print(response.text)login()
- 第一步 明确目标url https://kyfw.12306.cn/passport/captcha/captcha-check
requests源码分析(拓展)
为什么要进行源码分析呢?
- 1 提供思路 提供解决方案
- 2 了解优秀代码的编写逻辑
- 3 程序员基本的素养 企业的要求
- 4 下载源码位置:https://github.com/
- 5 Pycharm: File–>All close–>Check out from Version Control–>Git–>URL:…–>Test–>Clone–> 得到requests源码
End !
Best wishes for you!
一木.溪桥学爬虫-04:requests模块相关推荐
- 一木.溪桥学爬虫-03:请求模块urllib、 urllib.request、urllib.parse.urlencode、urllib.parse.quote(str)、.unquote()
一木.溪桥 在Logic Education跟Jerry学爬虫 07期:Python 爬虫 一木.溪桥学爬虫-03:请求模块urllib. urllib.request.urllib.parse.ur ...
- 一木.溪桥学Python-14 异常捕获
一木.溪桥 在Logic Education跟Amy学Python 逻辑教育 :https://logicedu.ke.qq.com 12期:Python基础课 一木.溪桥学Python-14:异常捕 ...
- 一木.溪桥学Python-03: Python 运算符
一木.溪桥 在Logic Education跟Amy学Python 12期:Python基础课 一木.溪桥学Python-03: Python 运算符 日期:2020年12月18日 学习目标: 算术. ...
- 一木.溪桥学Python-06:元组tuple、字典dict
一木.溪桥 在Logic Education跟Amy学Python 12期:Python基础课 一木.溪桥学Python-06:元组tuple.字典dict 日期:2020年12月25日 学习目标: ...
- python bar函数循环_一木.溪桥学Python-08: for循环、function函数
一木.溪桥 在Logic Education跟Amy学Python 逻辑教育 :https://logicedu.ke.qq.com 12期:Python基础课 一木.溪桥学Python-08: fo ...
- 一木.溪桥学Python-10:函数闭包、装饰器、推导式
一木.溪桥 在Logic Education跟Amy学Python 逻辑教育 :https://logicedu.ke.qq.com 12期:Python基础课 一木.溪桥学Python-10:函数闭 ...
- 一木.溪桥学Python-11:迭代器、生成器、面象对象class MyClass:、self 参数、 __init__() 方法、__str__() 方法
一木.溪桥 在Logic Education跟Amy学Python 逻辑教育 :https://logicedu.ke.qq.com 12期:Python基础课 一木.溪桥学Python-11:迭代器 ...
- 一木.溪桥学Python-13:多继承、多态、常用魔法方法、单例模式
一木.溪桥 在Logic Education跟Amy学Python 逻辑教育 :https://logicedu.ke.qq.com 12期:Python基础课 一木.溪桥学Python-13:多继承 ...
- 一木.溪桥学Python-04: Python基础数据类型int ,float ,bool ,complex,None,str, 转义字符
一木.溪桥 在Logic Education跟Amy学Python 12期:Python基础课 一木.溪桥学Python-04: Python基础数据类型int ,float ,bool ,compl ...
最新文章
- 局域网语音通话demo
- Eclipse运行时无法加载主类的解决方法
- 禁止php 报错怎么做,php – 禁用Laravel错误处理程序
- ADO.NET数据绑定 DataTabele
- 大数据WEB阶段(十五)JavaEE三大核心技术之过滤器
- nginx开发遇到的问题
- Python冒泡排序(4)
- CentOS 7 中firewall-cmd命令
- toolbox、library 的组织
- 3种更新vCenter Server Appliance 6.5的方法
- 自学python能学成吗-没有任何编程基础可以直接学习python语言吗?学会后能够做什么?...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-1.SpringBoot整合微信支付开发在线教育视频站点介绍...
- 解决嵌套块级元素垂直外边距的塌陷
- win8普通版连接远程桌面---RDPWrap
- Python faker模块
- 地图和地理空间革命:地理学大规模开放在线课堂(MOOC)
- Springboot-项目启动加载类
- Python函数isdigit()--判断字符串是否为数字
- ROS机器人 RIA-E100使用
- Android-FrameWork原理与架构分析