目录
- 静态页面抓取
- 安装Requests
- 获取响应内容
- 定制Requests
- 传递URL参数
- 定制请求头
- 发送POST参数
- 超时
- Requests爬虫实践:TOP250电影数据
- 网站分析
静态页面抓取
在网站设计中,纯粹HTML格式的网页通常被称为静态网页。对于静态网页,所有的数据呈现在网页的HTML代码中;相对而言使用AJAX动态加载网页的数据不一定出现在HTML代码中,这就给爬虫增加了困难。本节主要介绍静态网页数据的抓取。
安装Requests
pip install requests
获取响应内容
import requests
r=requests.get('http://www.santostang.com/')
print("文件编码:",r.encoding)
print("响应状态码:",r.status_code)
print("字符串的响应体:",r.text)
这样就返回了一个名为 r
的response响应对象,里面存储了服务器响应的内容。
- r.text是服务器响应的内容,会自动根据响应头部的字符编码进行解码
- r.encoding是服务器内容使用的文本编码
- r.status_code 用于检测响应的状态码,如果返回200,表示请求成功;如果返回4xx,表示客户端错误,返回5xx,表示服务器错误响应。可以使用r.status_code来检测请求是否正确响应。
- r.content是字节方式的响应体,会自动节码gzip和deflate编码的响应数据
- r.json是Requests内置的JSON解码器
定制Requests
传递URL参数
为了请求特定的参数,我们通常在URL的查询字符中加入某些数据,如果我们自己构建URL,一般数据会跟在一个问号后面,如http://httpbin.org/get?key1=value1&key2=value2
在Requests中,可以把这些参数放在字典李,用params构建至URL里。例如key1=value1,key2=value2构建至http://httpbin.org/get里
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)
定制请求头
请求头Headers提供了关于请求、响应或其他发送实体的信息。对于爬虫而言,请求头十分重要,有的时候,如果没有请求头或者请求头和实际网页不一致,就可能无法返回正确的结果。
右键点击检查
点击Network,在左侧的资源栏找到需要请求的网页(http://www.santostang.com/
),单击需要请求的网页,在Headers中可以看到 Requests 中 Headers 的详细信息
提取请求头中重要的信息,把代码改成:
import requests
headers={
'Host': 'www.santostang.com',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36'
}
r=requests.get('http://www.santostang.com/',headers=headers)
print("响应状态码:",r.status_code)
**注意:**这里的Host字段的意思主要是,指明http报文的方向,访问的地点
发送POST参数
除了GET请求外,有时还需要发送一些编码为表单形式的数据,如在登陆的时候请求就是POST,因为如果使用GET请求,密码就显示在URL里,这是非常不安全的。
import requests
key_dict={'key1':'value1','key2':'value2'}
r=requests.post('http://httpbin.org/post',data=key_dict)
print("URL已经正确编码:",r.url)
print("字符串的响应体:\n",r.text)
这样的话,表单不存在于URL中,但又使用用于了请求。
超时
有时爬虫遇到服务器长时间不反悔,这时爬虫程序就会一直等待,造成爬虫没有顺利执行。
因此可以使用Requests
中的timeout参数设置特定的表述结束后停止等待响应。意思是:服务器在timeout秒后没有应答,就返回异常。
我们把这个秒数设置成0.001,看看会抛出什么异常。
import requests
url='http://www.santostang.com/'
r=requests.get(url,timeout=0.001)
Requests爬虫实践:TOP250电影数据
网站分析
- 使用检查功能查看该网页的请求头,提取重要的请求头信息
headers={
'Host': 'movie.douban.com',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36'
}
我们观察可以发现,一页有25个电影的信息,如果想要获取250个电影信息,我们需要获取总共10页
这时候我们会发现,点击第一页的时候网址为https://movie.douban.com/top250?start=0
点击第二页网址就变成了https://movie.douban.com/top250?start=25
根据这个,我们就很好理解了,每增加一页,网页的start参数就增加25
这里使用了xpath的方法对网页数据进行筛选
import requests
import lxml.html
headers={
'Host': 'movie.douban.com',
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36'
}
num=0
for i in range(10):
#拼接每一页的网址
url='https://movie.douban.com/top250?start='+str(i*25)
#获取网页源码
html=requests.get(url,headers=headers,timeout=5).text
#构建网页对象
selector=lxml.html.fromstring(html)
#使用xpath获取电影名称
name_list=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
#获取评分
score_list=selector.xpath('//*[@id="content"]/div/div[1]/ol//div/div[2]/div[2]/div/span[2]/text()')
#获取电影名句
FamousSentences_list=selector.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[2]/p[2]/span/text()')
#print("第",str(i+1),"页名句数量:",len(FamousSentences_list))
#打印每页的电影信息
for j in range(25):
num+=1
print("top",str(num),":",name_list[j]," 评分:",score_list[j])
#print("top",str(num),":",name_list[j]," 评分:",score_list[j]," ",FamousSentences_list[j])
注意:对电影的经典名句进行获取时,发现有部分电影没有经典名句,这样就会出现下标越界的情况