1 安装Requests
pip install requests
2 获取响应内容
import requests
r = requests.get('http://www.santostang.com/')
print("文本编码:", r.encoding)
print("响应状态码:", r.status_code)
print("字符串方式的响应体:", r.text)
上例的说明如下:
- (1)r.text是服务器响应的内容,会自动根据响应头部的字符编码进行解码。
- (2)r.encoding是服务器内容使用的文本编码。
- (3)r.status_code用于检测响应的状态码,如果返回200,就表示请求成功了;如果返回的是4xx,就表示客户端错误;返回5xx则表示服务器错误响应。我们可以用r.status_code来检测请求是否正确响应。
- (4)r.content是字节方式的响应体,会自动解码gzip和deflate编码的响应数据。
- (5)r.json()是Requests中内置的JSON解码器。
3 定制requests
我们使用Requests库获取了网页数据,但是有些网页需要对Requests的参数进行设置才能获取需要的数据,这包括传递URL参数、定制请求头、发送POST请求、设置超时等。
3.1 传递URL参数
为了请求特定的数据,我们需要在URL的查询字符串中加入某些数据。如果你是自己构建URL,那么数据一般会跟在一个问号后面,并且以键/值的形式放在URL中,如http://httpbin.org/get?key1=value1。
在Requests中,你可以直接把这些参数保存在字典中,用params(参数)构建至URL中。
import requests
key_dict = {'key1':'value1', 'key2':'value2'}
r = requests.get('http://httpbin.org/get', params=key_dict)
print("URL已经正确编码:", r.url)
print("字符串方式的响应体: \n", r.text)
3.2 定制请求头
.请求头Headers提供了关于请求、响应或其他发送实体的信息。对于爬>虫而言,请求头十分重要,尽管在上一个示例中并没有制定请求头。如果没有指定请求头或请求的请求头和实际网页不一致,就可能无法返回正确的结果。
Requests并不会基于定制的请求头Headers的具体情况改变自己的行为,>只是在最后的请求中,所有的请求头信息都会被传递进去。
import requests
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.63' ,
'Host':'www.santostang.com'
}
r = requests.get('http://www.santostang.com/', headers = headers)
print("响应状态码:", r.status_code)
3.3 发送POST请求
除了GET请求外,有时还需要发送一些编码为表单形式的数据,如在登录的时候请求就为POST,因为如果用GET请求,密码就会显示在URL中,这是非常不安全的。如果要实现POST请求,只需要简单地传递一个字典给Requests中的data参数,这个数据字典就会在发出请求的时候自动编码为表单形式。
import requests
key_dict = {'key1':'value1', 'key2':'value2'}
r = requests.post('http://httpbin.org/post', data=key_dict)
print("字符串方式的响应体: \n", r.text)
# 输出为
{
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
...略
}
可以看到,form变量的值为key_dict输入的值,这样一个POST请求就发送成功了。
3.4 超时
有时爬虫会遇到服务器长时间不返回,这时爬虫程序就会一直等待,造成爬虫程序没有顺利地执行。因此,可以用Requests在timeout参数设定的秒数结束之后停止等待响应。意思就是,如果服务器在timeout秒内没有应答,就返回异常。
r = requests.get(url, timeout=1.5)
3.5 Requests爬虫实践:TOP250电影数据
import requests
from bs4 import BeautifulSoup
def get_movies():
headers ={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.63' ,
'Host':'movie.douban.com'
}
movie_list= []
for i in range(0, 10):
link = 'https://movie.douban.com/top250?start=' + str(i*25)
r = requests.get(link, headers = headers, timeout = 5)
print(str(i+1),'页面响应码',r.status_code)
soup =BeautifulSoup(r.text, "lxml")
div_list = soup.find_all('div', class_ = 'hd')
for each in div_list:
movie = each.a.span.text.strip()
movie_list.append(movie)
return movie_list
movies = get_movies()
print(movies)