翼度科技»论坛 编程开发 python 查看内容

【python爬虫案例】利用python爬取豆瓣电影TOP250评分排行数据!

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
一、爬取对象-豆瓣电影TOP250

今天给大家分享一期豆瓣读书TOP排行榜250的python爬虫案例
爬取的目标网址是:https://movie.douban.com/top250

咱们以目标为驱动,以兴趣为导向,先来看下爬虫程序运行后得到的excel文档数据

那代码是如何实现豆瓣电影TOP250数据爬取的了?下面逐一讲解一下python实现。
二、豆瓣电影网站分析

通过浏览器F12查看所有请求,发现他并没有发送ajax请求,那说明我们要的数据大概率是在html页面内容上。

于是我们 点击右键->查看网页源代码  ,发现我们需要的豆瓣电影评分的排行榜数据都在html页面里

这就简单了,我们直接往下看,上代码。
三、python爬虫代码详解

首先,导入我们需要用到的库
  1. import requests     # 发请求
  2. from lxml import etree  # 解析html
  3. import pandas as pd  # 存取csv
  4. from urllib.parse import urljoin    # url处理
复制代码
然后,向豆瓣电影TOP250的网页发起请求,获得html页面内容
  1. page_source = requests.get(page_url, headers=headers).text
复制代码
用lxml库解析html页面
  1. tree = etree.HTML(page_source)
复制代码
使用xpath来提取我们需要的排行榜数据内容
  1. # 获得数据所在的标签
  2. lis = tree.xpath("//ol[@class='grid_view']/li")
  3. # 循环标签获得电影信息
  4. for li in lis:
  5.     url = extract_first(li.xpath(".//div[@class='hd']/a/@href")).strip()    # 链接
  6.     movie_name = "".join(li.xpath(".//div[@class='hd']/a//text()"))  # 电影名字
  7.     movie_name = re.sub("\s+", "", movie_name)
  8.     score = extract_first(li.xpath(".//span[@class='rating_num']/text()")).strip()  # 评分
  9.     star_people_num = extract_first(li.xpath(".//div[@class='star']/span[4]/text()")).strip()   # 评价人数
  10.     star_people_num = re.search("\d+", star_people_num).group()
  11.     one_evaluate = extract_first(li.xpath(".//p[@class='quote']/span/text()")).strip()  # 一句话评价
  12.     info = "".join(li.xpath(".//div[@class='bd']/p/text()")).strip()   # 电影信息:导演、主演、年份、国家、类型
  13.     infos = info.split("\n")
  14.     director = infos[0].split("\xa0\xa0\xa0")[0]  # 导演
  15.     actor = None
  16.     try:
  17.         actor = infos[0].split("\xa0\xa0\xa0")[1]   # 主演
  18.     except:
  19.         # 只有导演,没有主演的(比如 第3页 窃听风暴)
  20.         pass
复制代码
其中,需要特殊说明的是,第3页《窃听风暴》这部电影和其他电影页面排版不同:

这部电影只有导演,却没有主演信息,所以会有个异常处理的代码
  1. try:
  2.     actor = infos[0].split("\xa0\xa0\xa0")[1]   # 主演
  3. except:
  4.     # 只有导演,没有主演的(比如 第3页 窃听风暴)
  5.     pass
复制代码
还有就是有些电影,他的年份、国家、类型的格式有细微的不同之处,所以也需要特殊处理一下。
  1. info_sub = re.sub("\s+", "", infos[1])
  2. info_subs = info_sub.split("/")
  3. if len(info_subs) == 3:
  4.     year = info_subs[0]     # 年份
  5.     country = info_subs[1]      # 国家
  6.     type = info_subs[2]     # 类型
  7. elif len(info_subs) == 4:
  8.     year = str(info_subs[0]) + "/" + str(info_subs[1])  # 年份
  9.     country = info_subs[2]  # 国家
  10.     type = info_subs[3]  # 类型
  11. else:
  12.     print(f"!!!!未匹配上规则!!!! 电影名称={movie_name}", infos)
复制代码
最后,我们将爬虫爬取的数据保存到csv文档里
  1. def save_to_csv(csv_name):
  2.     """
  3.     数据保存到csv
  4.     @param csv_name: csv文件名字
  5.     @return:
  6.     """
  7.     df = pd.DataFrame()  # 初始化一个DataFrame对象
  8.     df['电影名字'] = movie_names
  9.     df['电影链接'] = urls
  10.     df['评分'] = scores
  11.     df['评分人数'] = star_people_nums
  12.     df['导演'] = directors
  13.     df['主演'] = actors
  14.     df['年份'] = years
  15.     df['国家'] = countrys
  16.     df['类型'] = types
  17.     df['一句话评价'] = one_evaluates
  18.     df.to_csv(csv_name, encoding='utf8', index=False)  # 将数据保存到csv文件
  19.     print("保存文件成功", csv_name)
复制代码
上面的movie_names、urls等变量都是使用的list来进行存储的,这样才能符合pandas导出数据时的需要,最后调用to_csv()方法即可导出豆瓣电影的排行榜数据到文档里了。
三、python爬虫源代码获取

我是 @王哪跑,持续分享python干货,各类副业软件!
附完整python源码及数据【python爬虫案例】利用python爬虫爬取豆瓣电影评分TOP250排行数据

来源:https://www.cnblogs.com/wangnp/p/18412433
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具