Requests库的使用

305 阅读4分钟

安装第三方模块

  • 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 [异常状态]