静态网页就是纯粹HTML格式的网页,早期的网站都是由静态网页制作的,静态网页的数据比较容易获取,因为我们所需的代码都隐藏在HTML代码中。抓取静态网页,我们使用requests库,requests能够让你轻易地发送HTTP请求,这可库使用简单,功能完善。
获取响应的内容的过程,等同于我们使用浏览器的过程,我们在浏览器中输入网址,浏览器就会向服务器请求内容,服务器返回的就是HTML代码,浏览器就会自动解析代码。而我们的网络爬虫与浏览器发送请求的过程是一样的,是通过requests向浏览器发送请求,获取请求内容。
import requests
# 发送请求,获取服务器响应内容
r = requests.get("http://www.santostang.com/")
print("文本编码:", r.encoding)
print("响应状态码:", r.status_code)
print("字符串方式的响应体:", r.text)
我们使用requets发送请求获取数据,但是有些网页需要对参数进行设置才能获取需要的数据,接下来我们就设置这些参数
1. 传递URL参数
有时我们需要在URL加入一些参数,才能请求特定的数据,在URL中加入参数的形式是在问号后,以键/值的形式放在URL中,我们可以把参数保存在字典中,用params构建到URL中。
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.get('http://httpbin.org/get', params=key_dict)
print("URL已经正确编码:", r.url)
print("字符串方式的响应体:\n", r.text)
2. 定制请求头
请求头就是Headers部分,Headers提供了关于请求,响应或其他发送请求实体的信息。简单来说就是模拟浏览器的作用,所以请求头是必学的,那么我们怎么构建请求头呢,我们使用的是Google浏览器。可以点击鼠标右键,点击检查,然后看下图,就可以找到请求所需要的参数。
# 构建请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
'Host': 'www.santostang.com'
}
r = requests.get("http://www.santostang.com/", headers=headers)
print("响应状态码:", r.status_code)
响应状态码: 200
3. 发送POST请求
除了get请求外,还需要发送一些编码格式为表单形式的数据,有些网站需要登录才能访问,这样我们就需要使用POST请求,我们也需要传递一个字典给Reques中的data参数。这个数据字典就会发出请求的时候自动编码为表单形式。
key_dict = {'key1': 'value1', 'key2': 'value2'}
r = requests.post('http://httpbin.org/post', data=key_dict)
print(r.text)
4. 超时
有时在我们发送请求的时候,服务器会长时间没有响应,这时爬虫会一直等待。造成爬虫程序没有顺利执行,可以用requests在timeout参数设定的秒数之后停止等待响应。我们设置这个秒数为0.001秒。
url = "http://www.santostang.com/"
r = requests.get(url, timeout=0.001)
ConnectTimeout: HTTPConnectionPool(host='www.santostang.com', port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(, 'Connection to www.santostang.com timed out. (connect timeout=0.001)'))
爬取豆瓣网的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/71.0.3578.98 Safari/537.36',
'Host': 'movie.douban.com'
}
movie_list = []
for i in range(0, 10):
# 构建url,发送请求
url = "https://movie.douban.com/top250?start={}" + str(i * 25)
r = requests.get(url, headers=headers, timeout=10)
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)
总结:本篇笔记主要学习了爬取静态网页时发送requests请求, 包括url参数的设定方法,最后,实现了一个小案例。
上一篇文章:爬虫学习----爬虫简介
下一篇文章:爬虫学习----动态网页爬取
注意:本篇学习笔记,是总结唐松老师的《Python网络爬虫从入门到实践》这本书的内容,如果想了解书中详细内容,请自行购买。