解决问题:
2万字带你走进python爬虫requests库,史上最全!!
3.3 使用 POST 请求抓取网页,实现不了的原因
须知:
哪些地方我们会用到 POST 请求?
- 登录注册(在 web 工程师看来 POST 比 GET 更安全, url 地址中不会暴露用户的账号密码等信息)
- 需要传输大文本内容的时候( POST 请求对数据长度没有要求)
所以同样的,我们的爬虫也需要在这两个地方回去模拟浏览器发送 post 请求其实发送 POST 请求与 GET 方式很相似,只是参数的传递我们需要定义在 data 中即可:
POST 参数说明:
post(url, data=None, json=None, **kwargs):
❖ URL: 待请求的网址
❖ data : ( 可选 ) 字典,元组列表,字节或类似文件的对象,以在 Request 的正文中发送
❖ json: ( 可选 )JSON 数据,发送到 Request 类的主体中。
❖ **kwargs: 可变长关键字参数
补充:
requests 模块发送请求有 data 、 json 、 params 三种携带参数的方法
params 在 get 请求中使用, data 、 json 在 post 请求中使用。
data 可以接收的参数为:字典,字符串,字节,文件对象,
❖ 使用 json 参数,不管报文是 str 类型,还是 dict 类型,如果不指定 headers 中 content-type 的
类型,默认是: application/json 。
❖ 使用 data 参数,报文是 dict 类型,如果不指定 headers 中 content-type 的类型,默认 application/x
www-form-urlencoded ,相当于普通 form 表单提交的形式,会将表单内的数据转换成键值对,此时数据可以从 request.POST 里面获取,而 request.body 的内容则为 a=1&b=2 的这种键值对形式。
❖ 使用 data 参数,报文是 str 类型,如果不指定 headers 中 content-type 的类型,默认 applica
tion/json 。
用 data 参数提交数据时, request.body 的内容则为 a=1&b=2 的这种形式,
用 json 参数提交数据时, request.body 的内容则为 ’“a”: 1, “b”: 2’ 的这种形式
直接上全部的爬虫代码:
有参考这个博主,不知道user-agent和Cookie等获取方式的请点击
但是他的-获取json文件内容,我使用不了
import requests
url ="https://fanyi.baidu.com/v2transapi"
# 准备翻译的数据
# translate="How can Apple iCloud, which has been released for 13 years, store billions of databases without lagging?"
# How can Apple iCloud, which has been released for 13 years, store billions of databases without lagging?
kw = input("请输入要翻译的词语:")
# ps = {"kw": kw}
ps = {
"from": "en",
"to": "zh",
"query": kw,
"transtype": "enter",
"simple_means_flag": "3",
"sign": "744869.1031828",
"token": "写你自己的token",
"domain": "common",
"ts": "1705988866641"
}
# 准备伪造请求
headers = {
# User-Agent:首字母大写,表示请求的身份信息;一般直接使用浏览器的身份信息,伪造爬虫请求
# 让浏览器认为这个请求是由浏览器发起的[隐藏爬虫的信息]
"user-agent": "用你自己的user-agent",
"Cookie": '写你自己的cookie'
}
# 发送POST请求,附带要翻译的表单数据--以字典的方式进行传递
response = requests.post(url, data=ps, headers=headers)
# 打印返回的数据
# print(response.content)
print(response)
# utf-8解码出来中文是正则表达式
print(response.content.decode('utf-8'))
# 中文转码
print(response.content.decode("unicode_escape"))
import jsonpath
json=response.json()
if __name__ == '__main__':
# 若传入的数据为str类型需要将它转成dict类型
# result = json.loads(jsondata)
dstlist=[]
dstlist=jsonpath.jsonpath(json, '$..dst')
print(dstlist)
爬取结果截图: