Python爬虫实例(二):requests模块应用,发送get/post请求,获取响应

安装requests模块

使用前先安装requests模块:pipenv install requests(注意后面有个s)

pipenv install requests

 

发送get请求,获取响应

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请求,获取响应(模拟手机版的浏览器)

请求体

发送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())

 

 

                                                如果觉得内容不错,请扫码关注微信公众号,获取更多内容

                                        

 

你可能感兴趣的:(爬虫,Python爬虫专栏)