本系列文档用于对Python爬虫技术的学习进行简单的教程讲解,巩固自己技术知识的同时,万一一不小心又正好对你有用那就更好了。
Python 版本是3.7.4
在上篇文章记录了requests库的基本用法,本篇文章就来讲一下requests库的高级用法,一共包含四个部分:
在爬虫操作中,经常需要携带请求头信息(比如User-Agent、Referer、Host、Origin、Cookie)才能正常访问。
protocal+host
,不包含路径等信息,也就不会包含含有用户信息的敏感内容,跟Referer相似,但是Origin只能用于post请求。Referer适用于所有请求;因此Origin较Referer更安全,多用于防范CSRF攻击;GET
请求代码示例 # 引入requests库
import requests
# 声明定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
# 向指定的url发送请求,并返回
url = 'https://www.baidu.com/s'
# 传入参数
data = {
'wd': '中国'
}
r = requests.get(url=url, params=data, headers=headers)
print(r.text)
POST
请求代码示例 # 引入requests库
import requests
# 声明定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
# 请求地址
post_url = 'https://fanyi.baidu.com/sug'
# 参数
form_data = {
'kw': 'baby'
}
# 进行post请求
req = requests.post(url=post_url, data=form_data, headers=headers)
print('json:', req.json())
关于代理的一些知识我已经在《Python爬虫 — urllib高级用法教程》这篇文章中已经有讲解,在这里就不再赘述。
使用requests
添加代理也是非常简单,只要在请求方法中(例如requests.get()
或者requests.post()
)传递proxies
参数就可以了,示例代码如下:
GET
请求代码示例 # 引入requests库
import random
import requests
# 声明定义代理服务器列表
proxy_list = [
{"http": "58.21.202.124:8080"},
{"http": "58.21.202.39:8080"},
{"http": "39.107.232.194:8080"}
]
# 随机选择一个代理
proxy = random.choice(proxy_list)
# 声明定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
# 请求地址
url = 'http://www.baidu.com/s?ie=UTF-8&wd=ip'
# 进行GET请求,打印响应结果
try:
req = requests.get(url=url, headers=headers, proxies=proxy)
print(req.text)
except requests.exceptions.ConnectionError as e:
print(e)
POST
请求代码示例 # 引入requests库
import random
import requests
# 声明定义代理服务器列表
proxy_list = [
{"http": "58.21.202.124:8080"},
{"http": "58.21.202.39:8080"},
{"http": "39.107.232.194:8080"}
]
# 随机选择一个代理
proxy = random.choice(proxy_list)
# 声明定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36',
}
# 请求地址
url = 'http://www.baidu.com/s?ie=UTF-8&wd=ip'
# 进行POST请求,打印响应结果
try:
req = requests.post(url=url, headers=headers, proxies=proxy)
print(req.text)
except requests.exceptions.ConnectionError as e:
print(e)
如果在一个相应中包含了cookie
,那么可以利用cookies
属性拿到这个返返回的cookie
值,例如:
# 引入requests库
import requests
# GET访问
# 向指定的url发送请求,并返回
url = 'https://www.baidu.com/'
# 发送get请求
req = requests.get(url=url)
# 响应内容
print('Cookies信息:', req.cookies)
print(req.cookies.get_dict())
上面那个不是重点,重点的是requests.Session()
;之前使用urllib
库的时候是可以使用opener
发送多个请求,多个请求之间是可以共享cookie
的。那么如果使用requests
,也要达到共享cookie
的目的,那么可以使用requests
库给我们提供的session
对象。注意,这里的session
不是web开发中的那个session
,这个地方只是一个会话的对象而已。还是以人人网登陆为例,使用requests
来实现,示例代码如下:
# 引入requests库
import requests
# 声明定义header
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'
}
# 创建session对象
session = requests.Session()
# 人人网登陆地址
post_uel = 'http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019621044248'
# 参数
form_data = {
'email': '188****7357', # 这是手机号,我隐藏掉中间四位
'icode': '',
'origURL': 'http://www.renren.com/home',
'domain': 'renren.com',
'key_id': '1',
'captcha_type': 'web_login',
'password': '01cb55635986f56265d3b55aaddaa79337d094cb56d6cf7724343a93ad586fe7',
'rkey': 'd5ff51375d8eb17a011cad5622d835fd',
'f': 'http%3A%2F%2Fwww.renren.com%2F971686685%2Fprofile'
}
ret1 = session.post(url=post_uel, headers=headers, data=form_data)
print('登陆结果:', ret1.json())
print('*' * 50)
# 人人网个人中心地址
get_url = 'http://www.renren.com/971686685/profile'
ret2 = session.get(url=get_url)
print(ret2.content.decode())
对于那些已经被信任的SSL证书的网站,例如http://www.baidu.com/
,那么使用requests
库直接就可以正常的返回响应。请求可以为HTTPS请求验证SSL证书,就像web浏览器一样,SSL验证默认是开启的,如果证书验证失败,请求会抛出SSLError遇到请求的SSL验证,可以直接跳过不验证,将verify=False设置一下即可示例代码:
# 引入requests库
import requests
# 向指定的url发送请求,并返回
url = 'https://www.12306.cn/'
# 发送get请求
req = requests.get(url=url, verify=False)
print(req.content)