requests库
源码传送门
requests库借助了urllib3库,相较于urllib库,代码更加简单,爬虫效率更高。
1.安装
在cmd中执行下列代码来安装requests库。
pip install requests
2.请求
2.1.GET请求
我们直接使用requests.get()方法创建请求对象,例如,
import requests
response = requests.get("http://www.baidu.com") # get()方法中的参数为所爬网页的url地址
requests库中获取可以通过.text或.content返回数据。注意,.text会在返回数据的时候自动进行解码,可能会出现解码错误;而.content会直接返回字节流数据,需要我们自己通过decode()方法自行解码。例如,
print(response.text) # unicode格式的数据,自动解码
print(type(response.text))
print(response.content) # 返回字节流数据
print(response.content.decode('utf-8'))
我们还可以返回以下数据,
print(response.url) # 返回完整的url地址
print(response.encoding) # 返回响应头的字符编码
print(response.status_code) # 返回响应码
如果我们需要以GET方法传入相关数据,需要给requests.get()传入params参数。注意,这里传入的数据不需要通过urlencode()进行处理,直接以字典的形式传入即可。
同样,为了防止服务器发现我们是爬虫,需要给给requests.get()传入header参数。
例如,我们要获取使用百度搜索得到的python的相关结果,
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.56",
}
params = {
'wd': 'python',
} # 相关参数
response = requests.get("http://www.baidu.com", params=params, headers=headers)
print(response.content.decode('utf-8'))
2.2.POST请求
POST请求需要使用requests.post()方法。
与urllib的POST请求相同,我们只需给requests.post()方法添加data参数,即可实现POST请求。
例如,我们要爬取有道翻译的翻译结果,
import requests
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.56",
}
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule" # url地址
keyword = input("请输入要查询的单词:") # 输入要翻译的单词
data = {
"i": keyword,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": "15936963039542",
"sign": "f0ca3de0336ac08733c16d04ced62633",
"ts": "1593696303954",
"bv": "971477db6e42007c994a2623150c1717",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_CLICKBUTTION",
} # 传入相关data参数,相关参数可以在浏览器的“检查”-“网络”中找到
response = requests.post(url, data=data, headers=headers)
# 处理获取的数据
dic = response.json()
print(dic['translateResult'][0][0]['tgt'])
3.代理
为了防止IP地址被封,我们需要使用代理来爬取数据。
我们只需给requests.get()方法传入proxies参数即可实现代理。注意,proxies参数必须是字典形式,键为网络协议名称,值为IP地址加端口号。例如,
import requests
import random
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.56",
}
ip_lists = [
{'http': 'http://125.108.92.173:9000'},
{'http': 'http://113.128.25.249:9999'},
{'http': 'http://122.4.45.140:9999'},
{'http': 'http://36.248.129.170:9999'},
]
proxy = random.choice(ip_lists) # 随机选取一个代理IP地址
response = requests.get("http://httpbin.org/ip", proxies=proxy, headers=headers)
print(response.text)