目标网站: https://movie.douban.com/top250
需求: 爬取电影中文名、英文名、电影详情页链接、导演、主演、上映年份、国籍、类型、评分、评分人数, 并保存到csv文件当中
目标url: https://movie.douban.com/top250
requests
lxml
安装requests安装命令:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
lxml安装命令:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lxml
requests模块
- requests 是 Python 编程语言中一个常用的第三方库,它可以帮助我们向 HTTP 服务器发送各种类型的请求,并处理响应。
- 向 Web 服务器发送 GET、POST 等请求方法;
- 在请求中添加自定义标头(headers)、URL 参数、请求体等;
- 自动处理 cookies;
- 返回响应内容,并对其进行解码;
- 处理重定向和跳转等操作;
- 检查响应状态码以及请求所消耗的时间等信息。
lxml模块
了解 lxml模块和xpath语法
lxml 是 Python 编程语言中一个常用的第三方库,它提供了一个高效而简单的方式来解析和处理 XML 和 HTML 文档。
- 从文件或字符串中读取 XML 或 HTML 文档;
- 使用 XPath 或 CSS 选择器来查找和提取文档中的数据;
- 解析 XML 或 HTML 文档,并将其转换为 Python 对象或字符串;
- 对文档进行修改、重构或序列化;
- 处理命名空间和 CDATA 等特殊情况。
xpath语法-基础节点选择语法
- XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。
- 这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
- 使用chrome插件选择标签时候,选中时,选中的标签会添加属性class=“xh-highlight”
xpath定位节点以及提取属性或文本内容的语法
xpath语法-节点修饰语法
可以根据标签的属性值、下标等来获取特定的节点
节点修饰语法
关于xpath的下标
- 在xpath中,第一个元素的位置是1
- 最后一个元素的位置是last()
- 倒数第二个是last()-1
xpath语法-其他常用节点选择语法
// 的用途
- //a 当前html页面上的所有的a
- bookstore//book bookstore下的所有的book元素
@ 的使用
- //a/@href 所有的a的href
- //title[@lang=“eng”] 选择lang=eng的title标签
text() 的使用
- //a/text() 获取所有的a下的文本
- //a[texts()=‘下一页’] 获取文本为下一页的a标签
- a//text() a下的所有的文本
xpath查找特定的节点
- //a[1] 选择第一个s
- //a[last()] 最后一个
- //a[position()<4] 前三个
包含
- //a[contains(text(),“下一页”)]选择文本包含下一页三个字的a标签**
- //a[contains(@class,‘n’)] class包含n的a标签
实战教程
打开网站
https://movie.douban.com/top250
我们打印之后发现并没有输出任何内容,这是因为对于爬虫来说,有时候网站可能会采取一些反爬虫措施,以防止爬虫程序过度访问网站或者获取网站数据。那么为了避免反爬,我们需要设置合适的请求头信息来模拟真实浏览器行为,设置合适的 User-Agent 和其他请求头信息,使请求看起来更像是来自正常的浏览器访问。
注意:这里的请求头信息要以字典的格式写入
接下来就是进行数据提取,也就需要我们导入lxml模块。
lxml模块的使用
- 导入lxml 的 etree 库
- 利用etree.HTML,将html字符串(bytes类型或str类型)转化为Element对象,Element对象具有xpath的方法,返回结果的列表
xpath方法返回列表的三种情况
- 返回空列表:根据xpath语法规则字符串,没有定位到任何元素
- 返回由字符串构成的列表:xpath字符串规则匹配的一定是文本内容或某属性的值
- 返回由Element对象构成的列表:xpath规则字符串匹配的是标签,列表中的Element对象可以继续进行xpath
前面我们已经找到了<div class="info">这个标签,返回的数据类型是一个列表,循环遍历这个列表里的元素,那么我们接下来找标签元素就可以直接以<div class="info">为父节点来查找他的子孙级标签。
这里就以电影中文名为例,<div class="info">的下一级标签是<div class="hd">在下一级就是一个a标签,然后就是电影中文名所在的<span class="title">标签。
xpath里面的 https://blog.csdn.net/m0_74194018/article/details/ 代表当前节点,也就是<div class="info">标签;最后的text()是获取标签里的文本内容。这里用break终止循环,我们只要查看一下打印的数据正不正确就行了。
返回的数据类型还是列表,可以看到:电影中文名就是列表的第一个元素,外文名就是第二个元素,直接利用索引取值就行了。
另外我们可以看到外文名有一些xa0/xa0这样的符号, xa0 是一个 Unicode 字符,表示非断行空格。我们利用索引取值之后可以用字符串中的strip函数将它给去除。
这样就获得了中文名和外文名。
电影详情页链接也可以用上面类似的方法获取。
但这里有一点需要注意,我们这里不是要获取a标签里的文本内容,而是要获取a标签里的href属性值。xpath中可以用@获取标签里面的属性值。
可以看到导演、主演、上映年份、国籍和电影类型其实都在一个p标签里面,那么我们只要获取到这个p标签,然后利用索引取值就行了。
最后的评分和评分人数所在同一级的不同span标签里面,而且它们还具有同一个父级标签<div class="star">,这里我们只要注意在取span标签时,它的索引是从1开始的,而不是从0开始。
到这里我们都是爬取一页的电影数据,并没有进行翻页处理,那怎么进行翻页处理呢?
我们可以点击其他页数,查看一下其url的变化
我们可以发现它的start的参数随着翻页是发生变化的,变化规律类似与一个表达式:(页数 - 1) * 25。
现在我们所有的数据都爬完了,现在就要进行数据保存了,这里我们是要保存到csv文件中,就要借助于csv这个内置模块。
将数据写入到csv文件中需要以特定的格式写入,一种是列表嵌套元组,一种是列表嵌套字典。这里我们使用列表嵌套字典的方式写入。别问,问就是习惯了
应为字典里面要有所有电影的数据信息,为了方便,我们直接在循环内部定义一个字典,每一部电影的数据都放在一个字典中。而所有的字典都在一个列表当中,所以我们直接将列表定义在循环外面就行了。