爬虫入门经典:如何爬取豆瓣电影Top250 |
您所在的位置:网站首页 › 网络爬虫爬取豆瓣电影 › 爬虫入门经典:如何爬取豆瓣电影Top250 |
一、项目分析1.1 单页分析 目标网站:https://movie.douban.com/top250 ![]() 我们打开网址,查看页面布局,可以看到有电影名称及别名、评分、引言等等,在此就以电影名称及别名、评分、引言为爬取目标。 我们打开开发者选项,发现这个网页为静态网页,这样就很好爬取了: ![]() 爬取部分所在位置 1、电影名称与其他名称 ![]() 2、 URL ![]() 3、 评分 ![]() 4、 引言 ![]() 这个时候,你是否会感觉无从下手。没关系,本大师会为你排忧解惑! 网页大体结构已经分析完成,那么接下来就需要对我们所要爬取的内容进行xpath解析: 1、 电影名称解析 ![]() 2、 其他名称解析 ![]() 3、 链接解析 ![]() 通过查看我们发现得到的是这一页中的所有链接,我们选取第一个即: 代码语言:javascript复制(//div[@class="hd"]/a/@href)[0]这样就可以达到对应的URL链接了。 4、 评分解析 ![]() 我们可以看到评分和链接一样,都是选取第一个即可: 代码语言:javascript复制(//div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text())[0]5、 引言解析 ![]() 引言解析和上述两个看着一样,但是如果直接和上面以上是会报错的,因为引言可能有的是没有的,比如说排名212的《九品芝麻官》,就没有引言。 ![]() 这个时候就需要加上判断语句: 代码语言: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为分页。 我们再来看下总页数,这印证了我们的猜想是正确的。 ![]() 分析完成了下面就可以来进行实现了: 代码语言:javascript复制doubanUrl = 'https://movie.douban.com/top250?start={}&filter=' # 一共10页,循环10次 for i in range(10): # 获取url pageLink = doubanUrl.format(i * 25) print(pageLink)下面我们来打印下拼接网址 ![]() 打开其中一个网址,看是否成功 ![]() 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)三、运行结果![]() 美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |