1、发送post请求

1.1 哪些地方我们会用到POST请求:

(1)登录注册(post比get安全)

(2)需要传输大文本的时候(POST请求对数据长度没有要求)

爬虫也需要在这两个地方模拟浏览器发送post请求

  1. 用法:
  2. response = requests.post("http://www.baidu.com/",data=data,headers=headers)

1.2 post请求传参

post请求一般通过参数data来提交参数;
data是一个字典与get请求中的params类似;
浏览器network中post请求所带的参数,常常有两种格式:一种是最常见的Form Data,这种格式的参数,用字典传参即可
image.png
另一种是比较少见的Request Payload,这种格式的参数直接用引号将其括住,直接传给data即可(字符串传参)
image.png

在pycharm中格式化从浏览器中复制过来的data的方法

  1. ctrl+r打开搜索框
  2. 上搜索框:(.?): (.)
  3. 下搜索框:”$1”: “$2”,
  4. 勾上regest(使用正则匹配)
    1. 用法:
    2. data = {"name": "xiaoming", "page": 1}
    3. response = requests.post("http://www.baidu.com/", data=data)
    百度翻译案例
    有反爬,401 ```python import requests

url = “https://fanyi.baidu.com/v2transapi“ headers = { “User-Agent”: “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36” } data = { “from”: “en”, “to”: “zh”, “query”: “resource”, “transtype”: “translang”, “simple_means_flag”: “3”, “sign”: “125214.330287”, “token”: “d980256379a8ce61fd87448efd4e8487”, “domain”: “common” } res = requests.post(url, headers=headers, data=data) print(res.status_code) print(res.text)

  1. <a name="z9fqd"></a>
  2. ### 1.3 代理IP
  3. 为什么要使用代理ip?<br />1 让服务器以为不是同一个客户端在请求;<br />2 防止我们的真实地址被泄露,防止被追究;
  4. ![image.png](https://cdn.nlark.com/yuque/0/2020/png/704718/1577963780771-078c1089-eff3-4efb-a8d8-2f558a00e2f1.png#align=left&display=inline&height=400&margin=%5Bobject%20Object%5D&name=image.png&originHeight=400&originWidth=1508&size=219187&status=done&style=none&width=1508)<br />参数:proxies,也是字典形式,**键:请求所用的协议,值是ip及端口号**
  5. 用法
  6. ```python
  7. proxies = {
  8. "http": "123.7.17.237:8060"
  9. }

注意:可以将相同协议的ip端口号写入列表中组成ip池,然后通过随机选取,放入proxies中(字典键重复时,取后重复的值),并且要检查IP的可用性,检查方式:1.可以使用requests检查;2.在线代理IP质量检查的网站;

案例

import requests

url = "https://www.baidu.com"
headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}
proxies = {
    "http": "123.7.17.237:8060"
}
res = requests.get(url, headers=headers, proxies=proxies)
print(res.status_code)
print(res.text)