一、概述
Python 爬虫中,常用来请求网页的库有 urllib、urllib2、httplib等,但是这些库用起来比较麻烦,需要写很多代码。Requests 库正是为了解决这个问题而生的。Requests 库是 Python 社区中优秀的http请求库,他简化了 HTTP 请求发送,方便开发者快速地请求网络资源,可以以非常简单的语法来发送 HTTP/1.1 请求。 Requests 库简单、易学、功能强大、性能卓越,十分适合初学者使用。
二、Requests 库基本用法
Requests 库可以通过 pip 一键安装,安装方法如下:pip install requests
1.发送 GET 请求
发送 get 请求我们需要使用 requests 库的 get 函数来实现,如下所示:
import requests
url = 'http://www.baidu.com'
response = requests.get(url)
print(response)
response 将会返回一个 Response 对象,其中包括 status_code(状态码)、headers、text、encoding、cookies 等属性,如下所示:
<Response [200]>
2.发送 POST 请求
使用 POST 请求来提交数据时,可以使用 post 函数。示例如下:
import requests
url = 'http://httpbin.org/post'
data = {'name':'Dachuang'}
r = requests.post(url, data=data)
print(r)
Response 对象同样包含了 status_code、headers、text、encoding、cookies等属性,如下所示:
<Response [200]>
3.传递参数
get 请求可以通过 url 传递参数,POST 请求可以通过 data 传递参数。示例如下:
import requests
url = 'http://httpbin.org/get'
params = {'name':'Dachuang'}
response = requests.get(url, params=params)
print(response)
url 中的请求参数是已经构造好的 url,而参数 params 则是以字典形式传递的参数,它会在请求 url 中拼接参数。data参数也可以以字典形式传递。
通过 params 参数传递参数是 url 传参的一种方式,可以通过该方式避免 url 中参数的混淆等一系列问题。除了 params 参数外,还可以通过 headers 参数设置请求头。
4.设置请求头
Requests 使用 Header 参数来向请求添加 HTTP 头部,示例如下:
import requests
url = 'http://httpbin.org/get'
params = {'name':'Dachuang'}
headers = {'User-Agent':'Mozilla/5.0'}
response = requests.get(url, params=params, headers=headers)
print(response)
Requests 头部有很多内容,其中比较重要的就是 User-Agent 了。有些网页会检测请求头中的 User-Agent 是否为浏览器类型,如果不是则会屏蔽该请求,使用 Requests 设置 User-Agent 可以避免此类问题。
5.使用代理发送请求
Requests 允许我们向请求中添加代理。现在很多网站都有反爬虫机制,比如通过浏览器头部进行判断、同 IP 访问次数进行判断等,在这种情况下,我们可以通过向 Requests 请求中添加代理的方式来解决。设置代理方式如下:
import requests
url = 'http://www.baidu.com'
proxies = {
'http': 'http://127.0.0.1:1080',
'https': 'http://127.0.0.1:1080'
}
response = requests.get(url, proxies=proxies)
print(response)
其中,proxies 中的 key 值是协议名加上冒号(‘:’)加上地址,value 值同样是协议名加上冒号(‘:’)加上地址。
6.超时设置
Requests 允许我们设置请求的超时时间,这就意味着如果请求超过设定的时间限制,那么该请求将会被认为是失效的,示例代码如下:
import requests
url = 'http://www.baidu.com'
timeout = 2
response = requests.get(url, timeout=timeout)
print(response)
这里的timeout表示请求的超时时间,单位为 s,如该请求超时时间设定为2秒,如果该请求的响应时间超过2秒,那么该请求将会被视为请求失败并抛出异常以告诉用户响应超时了。
三、爬虫中的优秀实践
1.Referer 和 Origin
Referer的作用是用来表明当前请求是从什么网站来的,正常情况下在发送Ajax异步请求的时候是没有Referer值的。Origin的作用类似,同样是用来表明当前请求是从什么网站来的,但是它不能用在Ajax异步请求中。使用 Referer 和 Origin 是通常不会引起网络层面的异常的,因此在使用时最好加上这两个参数。
def get_products():
headers = {
"Referer": "https://www.jd.com/",
"Origin": "https://www.jd.com/"
}
url = "https://item.jd.com/123456.html"
response = requests.get(url, headers=headers)
return response
2.设置User-Agent
User-Agent 用来标识用户代理,客户端的一种标识方式。在使用 Python 爬虫爬取数据的时候,使用默认的 User-Agent 很容易被目标网站识别出来是爬虫。这时需要在 User-Agent 中加入随机的浏览器类型,以模拟用户访问行为。
import random
import requests
def get_products():
user_agent_list = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
] headers = {
'User-Agent': random.choice(user_agent_list),
'Referer': 'https://www.jd.com/',
'Origin': 'https://www.jd.com/',
}
url = "https://item.jd.com/123456.html"
response = requests.get(url, headers=headers)
return response
3.使用代理
有一些网站会对 IP 进行限制,这时需要使用代理(IP代理)。在向网站请求数据的时候,可以使用 requests 库设置代理来进行请求。
import requests
def get_products():
url = "https://item.jd.com/123456.html"
# 代理
proxy_host = "127.0.0.1"
proxy_port = "1080"
proxies = {
"http": f"http://{proxy_host}:{proxy_port}",
"https": f"http://{proxy_host}:{proxy_port}",
}
response = requests.get(url, proxies=proxies)
return response
4.设置cookie
Cookie 是一种保存用户信息的方案。如果一个网站需要记住用户的登录状态、购物车内的商品、用户的偏好等信息,那么这些信息就可以通过Cookie的形式保存在用户的浏览器上。对于这一点,requests 库提供了 cookie 参数来保存用户的 Cookie 信息。看下面的详细实现。
import requests
def get_products():
# cookie
cookie = "sessionid=abcd;"
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'Referer': 'https://www.jd.com/',
'Origin': 'https://www.jd.com/',
}
url = "https://item.jd.com/123456.html"
cookies = requests.utils.cookiejar_from_dict(requests.utils.dict_from_cookiejar(
requests.utils.cookiejar_from_string(cookie)))
response = requests.get(url, headers=headers, cookies=cookies)
return response
四、参考资料
Requests 是一个相对年轻但功能不断完善和迅速被接受的Python HTTP 库。官方文档提供了非常好的说明和例子。
官方文档:http://docs.python-requests.org/zh_CN/latest/
requests使用介绍:https://www.cnblogs.com/-wenli/p/8462410.html
Requests快速上手指南:https://www.cnblogs.com/cnkai/p/9248440.html
Python爬虫(四):Requests库详解:https://www.jianshu.com/p/08455bcc505c
五、总结
Requests 是一个非常使用非常方便的Python HTTP 库,它用于发送 HTTP/1.1 请求的库,非常适合爬虫使用。Requests 库支持多种 HTTP 请求方式和一些额外的特性,例如,与其他Python库相比,requests 可以自动解码响应内容为 unicode,适用于所有版本的 Python3,并且功能强大,同时性能卓越。在Python爬虫应用中早已成为开发者们必不可少的库之一,不断的优化和升级,使得使用 Requests 发送 HTTP 请求变得更加简单方便。