- GET请求(基于ajax的GET请求也适用)
import requests
url = "https://www.baidu.com"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}
response = requests.get(url=url, headers=headers) # 对指定url发起请求并返回一个响应对象
# 以下为response响应对象的常用属性
response.text # 返回响应对象字符串类型的页面数据
response.content # 返回响应对象二进制(bytes)类型的页面数据
response.status_code # 返回响应状态码
response.headers # 返回响应头信息
response.url # 返回请求的url
- 带参数的GET请求
方式一:直接对带有参数的url发请求
import requests
url = "https://www.baidu.com/s?wd=中国" # 带参数的url
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}
response = requests.get(url=url, headers=headers)
with open("test.html", "w", encoding="utf-8") as obj:
obj.write(response.text)
方式二:把参数封装到字典中再发请求
import requests
url = "https://www.baidu.com/s"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}
params = {
"wd": "中国"
}
# get函数中有个params参数就是请求参数的内容
response = requests.get(url=url, params=params, headers=headers)
with open("test.html", "w", encoding="utf-8") as obj:
obj.write(response.text)
- POST请求(基于ajax的POST请求也适用)
以登陆51job网站为例
首先我们打开51job的登陆页面,按F12打开开发者工具
为了能获取到登陆信息,需要先设置一下持续显示日志,在preserve log前面打勾
接下来输入正确的账号和密码,点击登录,查看右侧的抓包信息,找到 login.php 对应的信息
可以看到,登陆对应的请求为POST请求,第一行为对应的url。POST请求一定会携带参数,我们往下找
这里就是我们要找的请求参数了,接下来开始写代码
import requests
# 将请求参数转换为字典的函数
def formed_data(data):
lis = data.split("\n")
dic = {}
for val in lis:
lis_2 = val.split(":")
dic[lis_2[0]] = lis_2[1]
return dic
url = "https://login.51job.com/login.php"
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
}
# 请求参数
query = """lang:c
action:save
from_domain:i
loginname:***
password:***
verifycode:
isread:on"""
form_data = formed_data(query) # 转换为字典
# 这里需要使用post函数来发请求,post函数中的data参数就是请求参数的内容
response = requests.post(url=url, data=form_data, headers=headers)
with open("test.html", "w", encoding="utf-8") as obj:
obj.write(response.text)
转换函数是本人临时写的,可以应对一般情况,免去了手动加引号的烦恼。
这时打开文件 会发现文件中出现了很多乱码
出现这种情况的原因是51job网页是用的是 gbk 的编码格式,而我的浏览器是以 utf-8 格式读取文件的,出现乱码是正常现象,那么如何解决呢?只需要修改最后的持久化存储步骤即可
with open("test.html", "w") as obj:
# 使用content属性而不是text属性,解码之后写入文件
obj.write(response.content.decode("gbk"))
还可以直接以bytes类型直接写入文件
with open("test.html", "wb") as obj: # 模式为wb
obj.write(response.content) # 使用content属性
再打开文件就没有乱码了,并且可以看出是登陆之后的页面