环境
python:3.7.4
python库:requests-html
IDE:pycharm2019.3版本
浏览器:Chrome最新版
爬取网址: https://movie.douban.com/top250
教程
本次爬取的网页是豆瓣top250,这是一个典型的静态网页,适合入门学习如何爬取需要的内容
静态网页是指一次性加载所有内容,可以直接获取网页的内容
动态网页会在滚动或点击的时候有些地方再加载出来,例如知乎滚动会一直加载新的内容
首先打开网址,按下F12打开开发者模式,切换到Network
正常情况下会没有内容,因为我们页面已经加载好了,现在需要右键标签重新加载或者刷新页面
选中top250,一般第一个就是请求页面的内容,可以清楚的看到请求的方法和网址
跳过中间的响应头,下一个是请求头
我们为了避免被反爬虫检测到,一般采用模拟浏览器的行为,也就是构建请求头
下面附上代码来详细了解一下过程
from requests_html import HTMLSession
def dou_ban():
session = HTMLSession() # 创建一个会话
url = 'https://movie.douban.com/top250' # 请求的网址
# 浏览器请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
'Connection': 'close'
}
r = session.get(url=url, headers=headers) # get请求
name = r.html.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]/text()')[0]
print('电影名字:', name)
score = r.html.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[2]/div/span[2]/text()')[0]
print('评分:', score)
numbers = r.html.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[2]/div/span[4]/text()')[0]
print('评价人数:', numbers)
dou_ban() # 函数调用
输出结果
session就是创建一个会话,利用它来进行http请求,url是请求的网址
headers是模仿浏览器头,一般都加上User-Agent表示模拟chrome浏览器避免被检查出来是爬虫,这里加了一个Connection是因为一般默认的连接是keep_alive,也就是长连接,多次运行会导致出现http连接数达到最大值的异常,可能会出现(Max retries exceeded with url ....),如果已经出现了我的解决方法是重启计算机!
根据网页看到是get方法请求,所以利用get方法,返回的是服务器给我们的内容,用text属性可以看到整个html页面
一般我们不会关注整个页面,而是提取我们想要的内容,这里就要利用提取规则,一般对于静态页面有xpath和css选择器等,这里用的是xpath(教程链接: https://www.jianshu.com/p/85a3004b5c06),这里不需要特别学习xpath语法,因为浏览器可以帮助我们快速找到
r.html.xpath表示用xpath提取内容,教程中提取了第一个电影《肖申克的救赎》的名字、评分、评价人数
利用浏览器获取xpath的步骤
1.F12进入开发者模式,点击左上角的箭头
2.点击第一个电影的名字
可以看到右边会显示相应的html代码
3.右键 Copy->Copy XPath,这样就复制了对应的xpath
接下来类比获取评分和评价人数,需要注意的是xpath提取出来的是相关的html元素,文本文字需要在xpath后面加上 /text(),返回值类型是列表,而且只有一个元素,所以是 [0]
值得注意的是现在大多数网页都加入了js代码是动态网页,如果上述方法不能提取到相关的内容表示当前网页是动态网页,需要有一些别的条件才能获取,后面会讲到,但是很多时候都是这样提取的,需要熟练掌握。