安装第三方模块
-
pip install
-
下载源码解码,进入解压后的目录,
python setup.py install -
***.whl文件,安装方法pip install ***.whl
判断请求是否成功
assert response.status_code == 200
response.header为响应头部response.request.headers为请求的头部- 不止可以用过Response来设置Cookie,也可以用JS设置Cookie
response.request.headers返回的字典中User-Agent默认为Python -requests/2.**.*(版本号)
发送带header的请求
why?
模拟浏览器,欺骗服务器,获取和浏览器一致的内容
how?
header 的形式:字典
# 如何设置 header = {"User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36"} requests.get(url,headers = headers)
发送带参数的请求
- 参数的形式:字典
kw = {'wd':'长城'}- 用法:
requests.get(url,params = kw)
URL编码
https://www.baidu.com/s?User-Agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F84.0.4147.105+Safari%2F537.36&wd=%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9- 用在线工具解码
解决返回网页乱码
1.通过 chardet 库初步判断页面的编码
import chardet
chardet.detect(r.content) #查看网页转义编码
r.content.decode(chardet.detect(r.content).encoding)
'''
包含中文字数,存在误判情况,导致乱码
gb2312 < gbk <gb18030
'''
2.使用cchardet 库
import cchardet
# cchardet 精确度比chardet高
cchardet.detect(r.content) #查看网页转义编码
r.content.decode(cchardet.detect(r.content).encoding)
字符串格式化的方式
"{}哔哩哔哩",format("搜索") -> "搜索哔哩哔哩"
"哔{0}哔{1}".format("哔","哩")->"哔哩哔哩"
"%(name)s playing %(gamename)s have %(time)d min"%{'name':'Elvis','gamename':'OW','time':60}
列表推导式
[i for i in range(3)]->[0,1,2]
[i+3 for i in range(3)]->[3,4,5]
["a" for i in range(3)]->["a","a","a"]
["a" for i in range(3) if i%2==0]->["a","a"]
使用代理IP
- 准备一堆的IP地址,组成IP池,随机使用一个IP
- 检查IP可用性
- 可以使用requests添加超时参数,判断IP地址的质量
- 在线代理IP质量检测的网站
- 以键值对形式添加进去get()的data里面
- 如何随机选择代理IP
- {"IP":IP,"times":0}
- [{},{},{}],对这个IP列表进行排序,按照使用次数排序
- 选择使用次数较少的10个IP,从中随机选择一个
携带Cookie请求
- 携带一堆Cookie进行请求,把Cookie组成Cookie池
获取登陆后得页面的三种方式
①使用requests提供session类来请求登陆之后的网站的思路
- 实例化session
- 先使用session发送请求,登陆网站,把cookie保存在session
- 再使用session请求登陆之后才能访问的网站,session能够自动的携带登陆成功时保存再其中的cookie,进行请求
②不发送post请求,使用cookie获取登陆后的页面
- cookie 过期时间很长的网站
- 在cookie过期之前能够拿到所有的数据(比较麻烦)
- 配合其他程序一起使用,其他程序专门获取cookie,当前程序只负责请求页面
③将请求中的cookie字符串转化为字典
-
先用使用字典推导式
-
在推导式中用字符串分割
Cookie = "td_cookie=18446744073253590511; anonymid=ke7y6ilm-ahnt2f; depovince=GW; r01=1; taihe_bi_sdk_uid=77c5697f32fb227f7b7ae5e3d07cd4a8; __utma=151146938.1942804965.1598238975.1598238975.1598238975.1; __utmz=151146938.1598238975.1.1.utmcsr=renren.com|utmccn=(referral)|utmcmd=referral|utmcct=/; JSESSIONID=abc8yDsem3PpRa82_nFqx; ick_login=7ec23d19-f0e2-412c-a11f-62a04ae519d9; taihe_bi_sdk_session=8b040723910994a20200d9ed284e9d59; jebecookies=bfa7caf7-0e49-436a-9025-d6dfc7bafafe|||||; _de=17F2A61E5D774F08027123AF20EEBA9A; p=da2e70a380c5b80b935a29d95602b2e34; first_login_flag=1; ln_uact=13610052334; ln_hurl=head.xiaonei.com/photos/0/0/…; t=53a151335819c405da02c6bde4bff7ce4; societyguester=53a151335819c405da02c6bde4bff7ce4; id=974982934; xnsid=e0a46487; ver=7.0; loginfrom=null; wp_fold=0"
cookie = {i.split("=")[0]: i.split("=")[1] for i in Cookie.split("; ")}
------------
### 页面表单提交
* 页面标签中"name"的属性值作为键(key),个人用户真实的数据为值(value),用post请求发送出去
### 寻找登陆的POST地址
* 在form表单中寻找action 对应的URL地址
* POST 的数据是input 标签中name的值作为键(key),真正的用户名密码作为值(value)的字典,POST的URL地址就是action对应的URL地址
* 抓包,寻找登陆的URL地址--看Network
* 勾选"Perserve Log"按钮,防止页面跳转找不到URL
* 寻找post数据,确定参数
* 参数不变---直接用,比如密码不是动态加密的时候
* 参数变
* 参数在当前响应中
* 通过JS生成
---------
### <a href = "https://www.bilibili.com/video/BV1Lx411d7Cj?p=16" target = "_blank">定位JS</a>
* 选择可以触发JS事件的按钮,点击调试中的"event listener",找到JS的位置
* 通过chrome中的search all file(全局搜索)来搜索URL中关键字
* 添加断点方式来查看JS的操作,通过python来进行同样的操作
------
### Requests 小技巧
* requests.get之后,可以通过“cookies”的属性查看返回的cookie,cookies属性是一个对象。可以用“requests.utils.dict_from_cookiejar”转化成字典。
* 将字典转成对象"requests.utils.cookiejar_from_dict"
* "requests.utils.unquote"方法,对URL地址解码
* "requests.utils.quote"方法,对URL地址编码
------------------
* 请求SSL证书验证
* `response = requests.get("https://www.12306.cn/mormhweb/", verify =False)`
------------------------------------
* 设置超时
* ```response = requests.get("https://www.12306.cn/mormhweb/", timeout = 20)```
* "retrying"第三方库,超时尝试重试
* ```
# 重试3次
@retry(stop_max_attempt_number=3)
```
------------------------
* 配合状态码判断是否请求成功
* ```assert response.status_code == 200```
* 使用try-except [异常状态]