爬虫入门经典:如何爬取豆瓣电影Top250

您所在的位置:网站首页 网络爬虫爬取豆瓣电影 爬虫入门经典:如何爬取豆瓣电影Top250

爬虫入门经典:如何爬取豆瓣电影Top250

2024-07-15 21:36| 来源: 网络整理| 查看: 265

一、项目分析1.1 单页分析

目标网站:https://movie.douban.com/top250

44

我们打开网址,查看页面布局,可以看到有电影名称及别名、评分、引言等等,在此就以电影名称及别名、评分、引言为爬取目标。

我们打开开发者选项,发现这个网页为静态网页,这样就很好爬取了:

55

爬取部分所在位置

1、电影名称与其他名称

77

2、 URL

88

3、 评分

99

4、 引言

1010

这个时候,你是否会感觉无从下手。没关系,本大师会为你排忧解惑!

网页大体结构已经分析完成,那么接下来就需要对我们所要爬取的内容进行xpath解析:

1、 电影名称解析

1313

2、 其他名称解析

1414

3、 链接解析

1515

通过查看我们发现得到的是这一页中的所有链接,我们选取第一个即:

代码语言:javascript复制(//div[@class="hd"]/a/@href)[0]

这样就可以达到对应的URL链接了。

4、 评分解析

1616

我们可以看到评分和链接一样,都是选取第一个即可:

代码语言:javascript复制(//div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text())[0]

5、 引言解析

1717

引言解析和上述两个看着一样,但是如果直接和上面以上是会报错的,因为引言可能有的是没有的,比如说排名212的《九品芝麻官》,就没有引言。

1818

这个时候就需要加上判断语句:

代码语言:javascript复制# 条件语句:如果有引言则写引言,若没有则不写 if quote: quote = quote[0] else: quote = ''1.2 翻页分析

在分析完单页爬取内容后,我们就需要继续分析分页,来完成循环爬取的功能。

我们先来分析下网页链接:

代码语言:javascript复制https://movie.douban.com/top250?start=0&filter= https://movie.douban.com/top250?start=25&filter= https://movie.douban.com/top250?start=50&filter=

通过查看对比,我们发现其网页变化仅为start=?以此可以判定,其是以25为分页。

我们再来看下总页数,这印证了我们的猜想是正确的。

2020

分析完成了下面就可以来进行实现了:

代码语言:javascript复制doubanUrl = 'https://movie.douban.com/top250?start={}&filter=' # 一共10页,循环10次 for i in range(10): # 获取url pageLink = doubanUrl.format(i * 25) print(pageLink)

下面我们来打印下拼接网址

2121

打开其中一个网址,看是否成功

2222

Respect,分析到这里就完美结束了!

二、完整代码代码语言:javascript复制# encoding: utf-8 ''' @author 李华鑫 @create 2020-10-14 8:30 Mycsdn:https://buwenbuhuo.blog.csdn.net/ @contact: [email protected] @software: Pycharm @file: 豆瓣.py @Version:1.0 ''' import requests from lxml import etree import csv # 豆瓣top250网址 doubanUrl = 'https://movie.douban.com/top250?start={}&filter=' # 获取网页源码 def getSource(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36' } response = requests.get(url, headers=headers) # 以防出现乱码 设置编码格式 response.encoding = 'utf-8' return response.text # 引言 评分 网址 标题 ---> 网页源代码中 # 获取电影信息 def getEveryItem(source): # 生成一个Html对象 selector = etree.HTML(source) # 通过selector对象来找到 电影信息 movieItemList = selector.xpath('//div[@class="info"]') # 定义一个空列表 movieList = [] # 通过for循环来遍历 for eachMovie in movieItemList: # 创建一个字典,向列表中存储数据[{电影一},{电影二}...] movieDict = {} title = eachMovie.xpath('div[@class="hd"]/a/span[@class="title"]/text()') # 电影名 otherTitle = eachMovie.xpath('div[@class="hd"]/a/span[@class="other"]/text()') # 其他名称 link = eachMovie.xpath('div[@class="hd"]/a/@href')[0] # 链接 star = eachMovie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0] # 评分 quote = eachMovie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()') # 引言 # 条件语句:如果有引言则写引言,若没有则不写 if quote: quote = quote[0] else: quote = '' # 保存数据 movieDict['title'] = ''.join(title + otherTitle) movieDict['url'] = link movieDict['star'] = star movieDict['quote'] = quote print(movieDict) movieList.append(movieDict) return movieList # 保存数据 def writeData(movieList): with open('douban_top250.csv', 'w', encoding='utf-8',newline='') as f: writer = csv.DictWriter(f, fieldnames=['title', 'star', 'quote', 'url']) writer.writeheader() # 写入表头 for each in movieList: # 逐行写入 writer.writerow(each) # 启动 if __name__ == "__main__": movieList = [] # 一共10页,循环10次 for i in range(10): # 获取url pageLink = doubanUrl.format(i * 25) print(pageLink) source = getSource(pageLink) movieList += getEveryItem(source) writeData(movieList)三、运行结果2424

美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3