使用前先安装requests模块:pipenv install requests(注意后面有个s)
pipenv install requests
import requests
url = "https://www.baidu.com/"
response = requests.get(url) # 发送get请求,请求url地址对应的响应
print(response) # 打印响应的状态码。返回, 表示的是对象
# 获取响应内容,获取网页的html字符串
# 方法一
print(response.content) # 返回b' 开头的内容,是二进制字节流,中文内容都被编码过了
print(response.content.decode()) # 把响应的二进制字节流转化为str类型
# 方法二
print(response.content.decode("gbk")) # 如果方法一获取的内容含有乱码,则指定解码格式gbk(常用的中文字符集)
# 方法三
response.encoding = "utf-8" # response.text容易出现乱码,故前面添加response.encoding="utf-8"
print(response.text)
以上三种response方法,一般能正确获取到响应的内容
(1)response.content.decode()
(2)response.content.decode("gbk")
(3)response.encoding = "utf-8"
response.text
response的其他方法:
print('response.request.url', response.request.url) # 发送请求的的url地址
print('response.url', response.url) # response响应的url地址
print('response.request.headers', response.request.headers) # 请求头
print('response.headers', response.headers) # 响应头
response = requests.get(url, headers={headers字典})
发送post请求与发送get请求类似,但发送post请求需要带请求体。具体请参考链接:Python爬虫之个人笔记(一):URL地址和HTTP协议
请求体是一个字典,用来设置post方法中的data参数:对应newwork——>name下面其中一个(可能会有很多name),要找到post方式的,然后最下面可以找到有Form Data的。复制query、from、to等内容到程序中,做成字典。
一般格式:response = requests.post(url, data={请求体的字典})
import requests
url = "https://fanyi.baidu.com/v2transapi"
data = {"from": "zh",
"to": "en",
"query": "你叫什么名字",
"transtype": "translang",
"simple_means_flag": "3",
"sign": "720330.925435",
"token": "ada68d4d4032df7e374059e9fa70d184"}
response = requests.post(url, data=data)
print(response.content.decode())
以上代码只返回了两行内容。
{"error":0,"msg":"success","lan":"en"}
如果请求发送成功(返回200状态码),但没有返回内容,或者返回的内容与我们实际在网页上看到的少很多,可能是对方服务器已经识别我们为爬虫,这时要带上请求头,用来设置post方法中的headers参数。如Request Headers里面的User_Agent、Referer等等。注意:需要带上那些参数,并不是固定的,而是视对方服务器而定的。对方服务器的程序员可能设定缺少某些数据就将识别为爬虫,则不返回响应,所以需要带上那些参数,需视实际情况而定。
目的:为了模拟浏览器,获取和浏览器一模一样的内容。
一般格式:response = requests.post(url, data={请求体的字典}, headers={headers字典})
例如,以下代码headers中带上了user_agent、content-type等5个参数,仍被识别为爬虫,仅返回以下内容
{"error":997,"from":"zh","to":"en","query":"\u4f60\u53eb\u4ec0\u4e48\u540d\u5b57"}
import requests
url = "https://fanyi.baidu.com/v2transapi"
data = {"from": "zh",
"to": "en",
"query": "你叫什么名字",
"transtype": "translang",
"simple_means_flag": "3",
"sign": "720330.925435",
"token": "ada68d4d4032df7e374059e9fa70d184"}
headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"Content - Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Referer": "https://fanyi.baidu.com/?aldtype=16047",
"Accept - Encoding": "gzip, deflate, br",
"Accept - Language": "zh-CN,zh;q=0.9"}
response = requests.post(url, data=data, headers=headers)
print(response.content.decode())
但当headers中带上user_agent、cookie两个参数时,则可以正常返回响应的内容。由此可以猜测,百度翻译的请求如果没有带上Cookie,则会被识别为爬虫。
import requests
url = "https://fanyi.baidu.com/v2transapi"
data = {"from": "zh",
"to": "en",
"query": "你叫什么名字",
"transtype": "translang",
"simple_means_flag": "3",
"sign": "720330.925435",
"token": "ada68d4d4032df7e374059e9fa70d184"}
headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1",
"Cookie": "xxx" # 此处的cookie被人为省略了
}
response = requests.post(url, data=data, headers=headers)
print(response.content.decode())
如果觉得内容不错,请扫码关注微信公众号,获取更多内容