python爬虫案例_Python“豆瓣电影TOP250爬虫案例”详解
实现目标
本案计划实现:通过网络请求,获取豆瓣电影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爬虫案例”详解相关推荐
- python爬取豆瓣电影top250的代码_Python爬虫——爬取豆瓣电影Top250代码实例
利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Excel表中 ...
- Python爬虫 爬取豆瓣电影TOP250
Python爬虫 爬取豆瓣电影TOP250 最近在b站上学习了一下python的爬虫,实践爬取豆瓣的电影top250,现在对这两天的学习进行一下总结 主要分为三步: 爬取豆瓣top250的网页,并通过 ...
- Python爬虫爬取豆瓣电影Top250
爬虫爬取豆瓣Top250 文章目录 爬虫爬取豆瓣Top250 完整代码 第一步获取整个网页并以html来解析 正则表达式来匹配关键词 所有信息写入列表中 存入Excel中 效果如图 本文学习自B站UP ...
- python爬取豆瓣电影top250_Python爬虫——爬取豆瓣电影Top250代码实例
利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Excel表中 ...
- 利用定向网络爬虫爬取豆瓣电影top250【Python】
最近在外地实习,闲来无事学了一下requests库和BeautifulSoup,掌握基本用法之后试着爬取了一下豆瓣电影top250,中间也参考了不少其他大佬的博客,所以最后写出来的代码也都大同小异吧, ...
- python爬取豆瓣电影top250并保存为xlsx_Python 爬虫 存储Excel - 豆瓣电影Top250
from bs4 import BeautifulSoup #网页解析,获取数据 import re #正则表达式,进行文字匹配 import urllib.request,urllib.error ...
- append从一个添加到另一_真特么激动第一个爬虫----爬取豆瓣电影top250
养成习惯,先赞后看!!! 前言 之前一直对爬虫有兴趣,但是一直没有真正静下心来去好好学习过,这一段时间跟着b站上的一个教程做了自己人生中第一个爬虫程序,还是很有成就感的. 准备工作 1. 我们爬取一个 ...
- 豆瓣电影TOP250爬虫及可视化分析笔记
人类社会已经进入大数据时代,大数据深刻改变着我们的工作和生活.随着互联网.移动互联网.社交网络等的迅猛发展,各种数量庞大.种类繁多.随时随地产生和更新的大数据,蕴含着前所未有的社会价值和商业价值! ...
- 八爪鱼采集器之豆瓣电影Top250爬虫
一.在使用操作之前先一起了解一下八爪鱼这个采集数据工具. 相比于python爬虫,八爪鱼使用更加简便,因为它是所见即得的方式,所以不需要编写代码(除了正则表达式,以及xpath,因为如果有布局不一致的 ...
- 爬虫爬取豆瓣电影top250
最新研究了下爬虫,且将信息保存到EXCEL和sqlite: 代码供参考: 代码如下: # This is a sample Python script.# Press Shift+F10 to exe ...
最新文章
- 关于object references an unsaved transient instance - save the transient instance before flushing的解决方法
- ProgressDialog的使用-------------范例(学习笔记)
- jquery学习(3)--高级选择器
- win7查看 本地计算机策略,win7系统本地组策略编辑器打不开怎么办
- 捡到vivo手机怎么清除账号_为什么现在买手机,很少会去考虑OPPO和vivo呢?看一下老板怎么说...
- centos7操作SSH/SSHD服务(查看/启动/重启/自启)
- 易语言 安全连接mysql_易语言连接MySql操作例子
- Python乒乓球小游戏源代码
- 微博登录及删除粉丝/转发/评论的脚本[更新中]
- 计算机投影仪的作用是什么,投影电脑
- 【C++背包】稀奇古怪的多重背包问题
- 【zblog】模板怎么安装?zblog主题安装教程
- android 向上飘的字符,Android如何自定义View实现抖音飘动红心效果
- 网站攻击有哪几种方式?如何处理
- 更改MyEclipse/Eclipse的工作空间名字(workspace)
- MBTI职业性格测试完整版(静态题库)
- python语言通俗理解_慢步学习,python语言编程,来扯扯语言的学习理解
- PLC(Power Line Carrier)电力线载波介绍
- BUUCTF basic PikaChu AWD-Test1 Webug 4.0
- 58页大数据资源平台建设可行性研究方案(附下载)