实现目标

本案计划实现:通过网络请求,获取豆瓣电影TOP250的数据,并存储到Json文件中。

案例应用技巧:

  • GET请求(requests):headers
  • 翻页
  • 网页解析(BeautifulSoup)

实现过程

总体来说,简单的单线程爬虫的实现流程如下:

  • 确定数据所在的Url,以及控制翻页的参数
  • 执行网页请求并解决请求中出现的问题
  • 解析网页,获取格式化数据
  • 实现翻页
  • 存储数据

下面我们按着以上步骤来依次完成。

确定数据所在Url

在Chrome浏览器中打开豆瓣电影TOP250,其Url为:https://movie.douban.com/top250。

通过观察,可以发现目标数据是存在于网页源代码中的,直接请求网页Url即可获得。

同时,第1页仅显示了25部电影,说明我们需要请求10次不同的页面才能完成所有250部电影的抓取。于是我们在页面上点击打开第2页,发现第2页的Url是:

https://movie.douban.com/top250?start=25&filter=

相较于第1页的Url,第2页增加了start参数和filter参数,因为filter参数内容为空值,很可能是用来”我没看过的“选项的筛选的,因此start参数应该是实际起作用的。因为第1页有25个电影,而第2页的start参数为25,说明start很可能是指当前页面是从第多少部电影开始显示的。

为了检验这个结果,我们使用浏览器打开start参数值为0的页面,果然正确地打开了第1页。因此,我们只需要修改start参数就可以有效地实现翻页了。

网页请求

下面我们开始尝试使用Python实现请求,在这个过程中,建议大家使用IDLE或PyCharm的Python Console模式来进行测试,减少网站的实际请求次数,以减少对目标网站的影响,以免被IP封锁。

我们先以第1页为例进行尝试,发现直接使用requests的请求并不能获得数据,说明我们的请求被拒绝了。因此,我们可以打开Chrome控制台中访问页面时的请求,选择headers选项卡,查看其中的Request Headers,并依据这个headers来伪装我们的请求。实现代码如下:

 import requests ​ headers = {     "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",     "accept-language": "zh-CN,zh;q=0.9",     "cache-control": "no-cache",     "Connection": "keep-alive",     "host": "movie.douban.com",     "pragma": "no-cache",     "Sec-Fetch-Dest": "document",     "Sec-Fetch-Mode": "navigate",     "Sec-Fetch-Site": "none",     "Sec-Fetch-User": "?1",     "Upgrade-Insecure-Requests": "1",     "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36", } ​ response = requests.get("https://movie.douban.com/top250", headers=headers) ​ print(response.content.decode(errors="ignore"))

暂时先不要在headers中添加“Accept-Encoding”,否则请求结果可能会被压缩,影响解析。

在打印出的内容中,我们通过搜索可以找到我们需要的数据。

网页解析

下面,我们使用CSS选择器将电影的各类信息解析出来(先定位到每个电影的标签,再定位到各类信息的标签,最后将各类信息从标签中提取出来)。在解析过程中,我们要随时考虑到我们当前解析的标签可能不存在,并努力避免因标签不存在而报错。实现代码如下:

 from bs4 import BeautifulSoup ​ bs = BeautifulSoup(response.content.decode(errors="ignore"), 'lxml') for movie_label in bs.select("#content > div > div.article > ol > li"):  # 定位到电影标签     url = movie_label.select_one("li > div > div.pic > a")["href"]  # 获取电影链接(标签的href属性)     title_text = movie_label.select_one("li > div > div.info > div.hd > a").text  # 获取标题行内容     info_text = movie_label.select_one("li > div > div.info > div.bd > p:nth-child(1)").text  # 获取说明部分内容     rating_num = movie_label.select_one("li > div > div.info > div.bd > div > span.rating_num").text  # 获取评分     rating_people = movie_label.select_one("li > div > div.info > div.bd > div > span:nth-child(4)").text  # 获取评分人数     if quote_label := movie_label.select_one("li > div > div.info > div.bd > p.quote"):         quote = quote_label.text  # 获取评价     print(url, title_text, info_text, rating_num, rating_people, quote)

通过以上代码,我们成功地将各部分的数据都解析出来了,但是解析出的标题行内容、说明部分内容、评分、评分人数和评价中格式相对混乱,包括很多不需要的内容,需要进一步的清洗。

解析、清洗标题行:

 title_text = movie_label.select_one("li > div > div.info > div.hd > a").text.replace("", "")  # 提取标题行内容+清除换行符 title_chinese = clear_space_in_polar(title_text.split("/")[0])  # 提取中文标题+清除前后空格 title_other = [clear_space_in_polar(title) for title in title_text.split("/")[1:]]  # 提取其他标题+清除前后空格

解析导演信息(因长度原因,大部分主演名字不全暂不解析):

 info_text = movie_label.select_one("li > div > div.info > div.bd > p:nth-child(1)").text  # 获取说明部分内容 info_text = re.sub(" *", "", info_text)  # 清除行前多余的空格 info_text = re.sub("^", "", info_text)  # 清除开头的空行 info_line_1 = info_text.split("")[0]  # 获取第1行内容信息:包括导演和主演 info_line_2 = info_text.split("")[1]  # 获取第2行内容信息:包括年份、国家和类型 director = re.sub(" *(主演|主.{3}|.{3}).*$", "", info_line_1)  # 仅保留导演部分 year = int(re.search("[0-9]+", info_line_2.split("/")[0]).group())  # 提取电影年份并转换为数字 country = clear_polar_space(info_line_2.split("/")[1]) if len(info_line_2.split("/")) >= 2 else None  # 提取电影国家 classify = clear_polar_space(info_line_2.split("/")[2]) if len(info_line_2.split("/")) >= 3 else None  # 提取电影类型 classify = re.split(" +", classify)  # 将电影类型转换为list形式

解析评分、评分人数和评价:

 # 解析评分 rating_num = movie_label.select_one("li > div > div.info > div.bd > div > span.rating_num").text  # 提取评分 rating_num = float(re.search("[0-9.]+", rating_num).group())  # 将评分转换为浮点型数字 ​ # 解析评分人数 rating_people = movie_label.select_one("li > div > div.info > div.bd > div > span:nth-child(4)").text  # 提取评分人数 rating_people = int(re.search("[0-9]+", rating_people).group())  # 将评分人数转换为数字 ​ # 解析评价(该标签可能会不存在) if quote_label := movie_label.select_one("li > div > div.info > div.bd > p.quote"):     quote = quote_label.text.replace("", "")  # 提取评价+清除换行符 else:     quote = None

在解析的过程中,我们将每个电影解析的结果临时存储在循环前定义的movie_list列表中。

 movie_list.append({     "title": {         "chinese": title_chinese,         "others": title_other     },     "director": director,     "year": year,     "country": country,     "classify": classify,     "rating": {         "num": rating_num,         "people": rating_people     },     "quote": quote })

实现翻页

在完成了单页面的解析后,我们开始实现翻页。根据之前对页面的了解,我们只需要将页面的请求和解析嵌套到一个循环中即可。在每次循环中均需进行延迟,以免请求频率过高。实现代码如下:

 import time for page_num in range(10):     url = "https://movie.douban.com/top250?start={0}&filter=".format(page_num * 25)     response = requests.get(url, headers=headers)     ......     time.sleep(5)

存储数据

最后,我们将存储在临时变量movie_list列表中的数据存储到本地Json文件(若使用IDLE或PyCharm的Python Console模式,建议使用绝对路径)。

 import json with open("豆瓣TOP250电影.json", "w+", encoding="UTF-8") as file:     file.write(json.dumps({"data": movie_list}, ensure_ascii=False))

本系列案例采集的一切数据仅可用于学习、研究用途!

python爬虫案例_Python“豆瓣电影TOP250爬虫案例”详解相关推荐

  1. python爬取豆瓣电影top250的代码_Python爬虫——爬取豆瓣电影Top250代码实例

    利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Excel表中 ...

  2. Python爬虫 爬取豆瓣电影TOP250

    Python爬虫 爬取豆瓣电影TOP250 最近在b站上学习了一下python的爬虫,实践爬取豆瓣的电影top250,现在对这两天的学习进行一下总结 主要分为三步: 爬取豆瓣top250的网页,并通过 ...

  3. Python爬虫爬取豆瓣电影Top250

    爬虫爬取豆瓣Top250 文章目录 爬虫爬取豆瓣Top250 完整代码 第一步获取整个网页并以html来解析 正则表达式来匹配关键词 所有信息写入列表中 存入Excel中 效果如图 本文学习自B站UP ...

  4. python爬取豆瓣电影top250_Python爬虫——爬取豆瓣电影Top250代码实例

    利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Excel表中 ...

  5. 利用定向网络爬虫爬取豆瓣电影top250【Python】

    最近在外地实习,闲来无事学了一下requests库和BeautifulSoup,掌握基本用法之后试着爬取了一下豆瓣电影top250,中间也参考了不少其他大佬的博客,所以最后写出来的代码也都大同小异吧, ...

  6. python爬取豆瓣电影top250并保存为xlsx_Python 爬虫 存储Excel - 豆瓣电影Top250

    from bs4 import BeautifulSoup #网页解析,获取数据 import re #正则表达式,进行文字匹配 import urllib.request,urllib.error ...

  7. append从一个添加到另一_真特么激动第一个爬虫----爬取豆瓣电影top250

    养成习惯,先赞后看!!! 前言 之前一直对爬虫有兴趣,但是一直没有真正静下心来去好好学习过,这一段时间跟着b站上的一个教程做了自己人生中第一个爬虫程序,还是很有成就感的. 准备工作 1. 我们爬取一个 ...

  8. 豆瓣电影TOP250爬虫及可视化分析笔记

      人类社会已经进入大数据时代,大数据深刻改变着我们的工作和生活.随着互联网.移动互联网.社交网络等的迅猛发展,各种数量庞大.种类繁多.随时随地产生和更新的大数据,蕴含着前所未有的社会价值和商业价值! ...

  9. 八爪鱼采集器之豆瓣电影Top250爬虫

    一.在使用操作之前先一起了解一下八爪鱼这个采集数据工具. 相比于python爬虫,八爪鱼使用更加简便,因为它是所见即得的方式,所以不需要编写代码(除了正则表达式,以及xpath,因为如果有布局不一致的 ...

  10. 爬虫爬取豆瓣电影top250

    最新研究了下爬虫,且将信息保存到EXCEL和sqlite: 代码供参考: 代码如下: # This is a sample Python script.# Press Shift+F10 to exe ...

最新文章

  1. 关于object references an unsaved transient instance - save the transient instance before flushing的解决方法
  2. ProgressDialog的使用-------------范例(学习笔记)
  3. jquery学习(3)--高级选择器
  4. win7查看 本地计算机策略,win7系统本地组策略编辑器打不开怎么办
  5. 捡到vivo手机怎么清除账号_为什么现在买手机,很少会去考虑OPPO和vivo呢?看一下老板怎么说...
  6. centos7操作SSH/SSHD服务(查看/启动/重启/自启)
  7. 易语言 安全连接mysql_易语言连接MySql操作例子
  8. Python乒乓球小游戏源代码
  9. 微博登录及删除粉丝/转发/评论的脚本[更新中]
  10. 计算机投影仪的作用是什么,投影电脑
  11. 【C++背包】稀奇古怪的多重背包问题
  12. 【zblog】模板怎么安装?zblog主题安装教程
  13. android 向上飘的字符,Android如何自定义View实现抖音飘动红心效果
  14. 网站攻击有哪几种方式?如何处理
  15. 更改MyEclipse/Eclipse的工作空间名字(workspace)
  16. MBTI职业性格测试完整版(静态题库)
  17. python语言通俗理解_慢步学习,python语言编程,来扯扯语言的学习理解
  18. PLC(Power Line Carrier)电力线载波介绍
  19. BUUCTF basic PikaChu AWD-Test1 Webug 4.0
  20. 58页大数据资源平台建设可行性研究方案(附下载)

热门文章

  1. [.NET] : 使用自定义对象当作报表数据源
  2. FindWindowEx的应用
  3. IAR平台下使用STM32的DSP配置方法
  4. C/C++编程语言中char** a和char* a[]介绍
  5. mysql 小技巧
  6. Python使用日常
  7. 项目名报错,但是项目里不显示错误的问题
  8. JVM笔记——技术点汇总
  9. 乱七八糟 Nodejs 系列一:试水
  10. 【美团外卖】美食知识图谱的迭代及应用