爬虫项目实战:利用基于selenium框架的爬虫模板爬取豆瓣电影Top250

  • 👋 Hi, I’m @货又星
  • 👀 I’m interested in …
  • 🌱 I’m currently learning …
  • 💞 I’m looking to collaborate on …
  • 📫 How to reach me …
    • README 目录(持续更新中) 各种错误处理、爬虫实战及模板、百度智能云人脸识别、计算机视觉深度学习CNN图像识别与分类、PaddlePaddle自然语言处理知识图谱、GitHub、运维…
    • WeChat:1297767084
    • GitHub:https://github.com/cxlhyx

文章目录

  • 概要
  • 整体架构流程
  • 技术细节
    • *Step 2: 解析网页并提取目标数据*
    • *Step 3: 存储数据到本地或其他持久化存储服务器中*
    • *Step 4: 控制流程,调用上述函数完成数据抓取任务*
  • 结果
  • 源码

概要

利用基于selenium框架的爬虫模板进行项目实战
博主之前发了一篇爬虫:解决动态刷新、基于selenium框架的爬虫、解决登录以及验证码问题(含爬虫模板),介绍了爬虫如何解决动态刷新、基于selenium框架的爬虫、如何解决登录以及验证吗问题,以及分享了爬虫的源码:爬虫模板、基于selenium框架的爬虫模板(包含登录与验证码问题)、爬虫项目实战:爬虫模板爬取单位净值 (动态更新网址)。

还利用了爬虫模板来进行简单的入门项目:爬取豆瓣图书Top250。爬虫项目实战:利用爬虫模板爬取豆瓣图书Top250

今天我们利用基于selenium框架的爬虫模板进行另外一个简单的入门项目:爬取豆瓣电影Top250。流程基本上是一样的,但使用selenium框架我们可以解决某些看得到源码,使用request库却爬取不到的情况

整体架构流程

整体架构流程基于selenium框架的爬虫模板
由于豆瓣电影没有使用太强的反爬机制,html源码利用F12打开开发人员工具看得到也爬得到,所以直接使用简单的爬虫模板也是可以的。但这了我们使用基于selenium框架的爬虫模板,模板请在概要或者源码的链接里自取。

技术细节

其实这里要做的与使用爬虫模板爬取豆瓣图书Top250是一样的,大家可以对比一下。
爬虫项目实战:利用爬虫模板爬取豆瓣图书Top250
需要做的修改:

  • Step 2: 解析网页并提取目标数据
  • Step 3: 存储数据到本地或其他持久化存储服务器中
  • Step 4: 控制流程,调用上述函数完成数据抓取任务

Step 2: 解析网页并提取目标数据

对爬取到的html源码进行解析,需要我们对html语言有一定的了解,可以简单了解一下HTML 教程- (HTML5 标准),同时还需要对BeautifulSoup有了解,可以参考python爬虫之Beautifulsoup模块用法详解。
这里我们主要爬取电影的名称、人物时间地点类型、评分、简介。我们打开一个网页豆瓣电影 Top 250,F12打开开发人员工具,查看对应的html源码。
在这里插入图片描述

可以看到

  1. 名称:有三种,中文名,外文名,别名。各自在一个span标签内,所以我们向上找它们的父标签,是一个链接标签a,不太方便查找,继续向上找,可以查找class为hd的div标签,然后在这个标签里去找class为title或other的span标签。注意到在外文名、别名前有 / ,爬取后会变成\xa0/\xa0,所以需要将他们去掉。
data_list = []
data_list.append([[j.text.replace("\xa0/\xa0", "") for j in i.find_all('span', ['title', 'other'])]for i in soup.find_all('div', 'hd')])  # 电影名
  1. 人物时间地点类型:在class为空的p标签里,所以只能向上找class为bd的div标签,然后再在这个标签里去找p标签。一样需要对爬取下来的字符串进行处理,包括\ 、\n、空格等等
 wwww = []for i in soup.find_all('div', 'bd'):tmp = []for j in i.find('p', _class=''):text = j.text.replace("\xa0\xa0\xa0", '\\')text = text.replace("\xa0", "")text = text.replace("\n", "")text = text.replace(" ", "")if text != "" and text != '豆瓣':tmp.append(text)if len(tmp) != 0:wwww.append(tmp)data_list.append(wwww)  # who when where what
  1. 评分:由于评分所在的标签span,既有属性class=“rating_num”,又有property=“v:average”,所以很明显可以直接查找。
data_list.append([i.text for i in soup.find_all('span', {'class': "rating_num", 'property': "v:average"})])  # 评分
  1. 简介:在一个p标签里面,但它所在的span标签有class为inq,可以直接查找。不过比起其它三个,某些书没有这一项,所以有可能会对应不上,于是对于没有的,我们把它设为空。因此,我们也没办法直接查找span标签了,所以我们通过它的祖先标签div,class值为info间接搜索它,找到的直接添加在数据列表,没有就加空字符串。
 About = []for i in soup.find_all('div', 'info'):if i.find('span', 'inq'):About.append(i.find('span', 'inq').text)else:About.append(" ")data_list.append(About)  # 简介

Step 3: 存储数据到本地或其他持久化存储服务器中

在step2中,我们将爬取到250部电影的名字、人物时间地点类型、评分、简介分别存在一个列表当中,一共4个列表,再把它们放在一个大列表中。这一步要做的是就是把他们存储在txt或者其它文件当中,还是比较简单的,主要就是文件的读取而已。

与爬取图书稍有不同,电影名字可能有中文名,外文名,别名,也有可能只有中文名和别名,这里需要区分一下。还有就是人物时间地点类型,会分成两部分爬取,即人物、时间地点类型。评分与简介是一样的。

 with open("豆瓣电影Top250.txt", 'a', encoding='utf-8') as file:for i in range(25):if len(result_list[0][i]) == 2:file.write("Chinese name: " + result_list[0][i][0] + '\n')file.write("Other name: " + result_list[0][i][1] + '\n')elif len(result_list[0][i]) == 3:file.write("Chinese name: " + result_list[0][i][0] + '\n')file.write("Foreign name: " + result_list[0][i][1] + '\n')file.write("Other name: " + result_list[0][i][2] + '\n')file.write("Who: " + result_list[1][i][0] + '\n')file.write("When/Where/What: " + result_list[1][i][1] + '\n')file.write("Score: " + result_list[2][i] + '\n')file.write("About: " + result_list[3][i] + '\n')file.write('=' * 50 + '\n')

Step 4: 控制流程,调用上述函数完成数据抓取任务

基于selenium框架的爬虫模板相比,这一步只需稍微修改,原因是豆瓣的每一页只有25部电影,而我们要爬取的是Top250的。那么如何解决呢,观察榜单的链接可以发现榜单的每一页的链接都只是在 https://movie.douban.com/top250?start= 的后面加上0、25…而已,所以简单遍历一下就可以了。
爬取豆瓣图书Top250相比则在于需要打开关闭浏览器。

driver = webdriver.Firefox()  # 打开火狐浏览器
spider = MySpider()
url = "https://movie.douban.com/top250?start="
for page in trange(0, 250, 25):target_url = url + str(page)html_content = spider.get_html_content(target_url)if html_content:result_list = spider.parse_html(html_content)spider.store_data(result_list)else:print("网页访问失败")
driver.close()  # 关闭浏览器

结果

部分结果如图
在这里插入图片描述

源码

基于selenium框架的爬虫模板请看爬虫:解决动态刷新、基于selenium框架的爬虫、解决登录以及验证码问题(含爬虫模板)

from selenium import webdriver  # 打开网页爬取源码
from bs4 import BeautifulSoup  # 解析源码
from tqdm import trangeclass MySpider():def __init__(self):pass# Step 1: 访问网页并获取响应内容def get_html_content(self, url):try:driver.get(url)driver.set_page_load_timeout(10)  # 设置超时限制10shtml_content = driver.page_source  # 网页内容return html_content  # 返回网页内容except Exception as e:print(f"网页请求异常:{e}")return None# Step 2: 解析网页并提取目标数据def parse_html(self, html_content):soup = BeautifulSoup(html_content, 'html.parser')  # 解析 html 数据# TODO:根据需求编写解析代码,并将结果保存到合适的数据结构中data_list = []data_list.append([[j.text.replace("\xa0/\xa0", "") for j in i.find_all('span', ['title', 'other'])]for i in soup.find_all('div', 'hd')])  # 电影名wwww = []for i in soup.find_all('div', 'bd'):tmp = []for j in i.find('p', _class=''):text = j.text.replace("\xa0\xa0\xa0", '\\')text = text.replace("\xa0", "")text = text.replace("\n", "")text = text.replace(" ", "")if text != "" and text != '豆瓣':tmp.append(text)if len(tmp) != 0:wwww.append(tmp)data_list.append(wwww)  # who when where whatdata_list.append([i.text for i in soup.find_all('span', {'class': "rating_num", 'property': "v:average"})])  # 评分About = []for i in soup.find_all('div', 'info'):if i.find('span', 'inq'):About.append(i.find('span', 'inq').text)else:About.append(" ")data_list.append(About)  # 简介return data_list# Step 3: 存储数据到本地或其他持久化存储服务器中def store_data(self, result_list):# TODO:编写存储代码,将数据结果保存到本地或其他服务器中with open("豆瓣电影Top250.txt", 'a', encoding='utf-8') as file:for i in range(25):if len(result_list[0][i]) == 2:file.write("Chinese name: " + result_list[0][i][0] + '\n')file.write("Other name: " + result_list[0][i][1] + '\n')elif len(result_list[0][i]) == 3:file.write("Chinese name: " + result_list[0][i][0] + '\n')file.write("Foreign name: " + result_list[0][i][1] + '\n')file.write("Other name: " + result_list[0][i][2] + '\n')file.write("Who: " + result_list[1][i][0] + '\n')file.write("When/Where/What: " + result_list[1][i][1] + '\n')file.write("Score: " + result_list[2][i] + '\n')file.write("About: " + result_list[3][i] + '\n')file.write('=' * 50 + '\n')# Step 4: 控制流程,调用上述函数完成数据抓取任务
if __name__ == '__main__':driver = webdriver.Firefox()  # 打开火狐浏览器spider = MySpider()url = "https://movie.douban.com/top250?start="for page in trange(0, 250, 25):target_url = url + str(page)html_content = spider.get_html_content(target_url)if html_content:result_list = spider.parse_html(html_content)spider.store_data(result_list)else:print("网页访问失败")driver.close()  # 关闭浏览器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从 RBAC 到 NGAC ,企业如何实现自动化权限管理?

随着各领域加快向数字化、移动化、互联网化的发展,企业信息环境变得庞大复杂,身份和权限管理面临巨大的挑战。为了满足身份管理法规要求并管理风险,企业必须清点、分析和管理用户的访问权限。如今,越来越多的员工采用移动设备进行…

杰发科技AC7801——Flash模拟EEP内存分布情况

简介 本文记录了在使用AutoChips芯片Flash模拟EEP过程中的一些理解 核心代码如下 #include <stdlib.h> #include "ac780x_sweeprom.h" #include "ac780x_debugout.h"#define SWEEPROM_SIZE (2048UL) /* Ssoftware eeprom size(Byte) */ #define TE…

Excel动态选择某一行/列的最后一个数据

选择列的最后一个数据&#xff1a; 以A列为例&#xff0c;使用&#xff1a; LOOKUP(1,0/(A:A<>""),A:A)选择行的最后一个数据&#xff1a; 以第3行为例&#xff0c;使用&#xff1a; LOOKUP(1,0/(3:3<>""),3:3)示例程序 列最后一个数据&a…

【精选】框架初探篇之——MyBatis的CRUD及配置文件

MyBatis增删改查 MyBatis新增 新增用户 持久层接口添加方法 void add(User user);映射文件添加标签 <insert id"add" parameterType"com.mybatis.pojo.User">insert into user(username,sex,address) values(# {username},# {sex},# {address}) <…

华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法

华硕灵耀XPro(UX7602ZM)原装Win11系统恢复安装教程方法&#xff1a; 第一步&#xff1a;需要自备华硕6个底包工厂安装包&#xff08;EDN.KIT.OFS.SWP.HDI.TLK&#xff09;或者自己备份的iso/esd/wim等镜像恢复 支持系列&#xff1a; 灵耀系列原装系统 无畏系列原装系统 枪…

小程序中的大道理之三--对称性和耦合问题

再继续扒 继续 前一篇 的话题, 在那里, 提到了抽象, 耦合及 MVC, 现在继续探讨这些, 不过在此之前先说下第一篇里提到的对称性. 注: 以下讨论建立在前面的基础之上, 为控制篇幅起见, 这里将不再重复前面说到的部分, 如果您还没看过前两篇章, 阅读起来可能会有些困难. 这是第一…

壳牌——利用人工智能应对新能源转型

荷兰皇家壳牌(Shell)最初是一家卖贝壳的商店&#xff0c;截至 2018 年&#xff0c;它是全球收入排名第五的公司。它的业务范围涵盖从勘探和钻探到提炼和零售的整个燃料供应链。壳牌在石油、天然气、生物燃料、风能和太阳能等端到端燃料生产领域处于世界领先地位。 当前&#x…

【21年扬大真题】编写程序,去除掉字符串中所有的星号。

【21年扬大真题】 编写程序&#xff0c;去除掉字符串中所有的星号。 int main() {int i 0;int j 0;char arr[30] {0};char brr[30] {0};printf("请输入一个字符串:");gets(arr);for (i 0;i < 30;i){if (arr[i] ! *) {brr[j] arr[i];j;}}int tmp j;for (i …

【Amazon】安装卸载AWS CLI操作流程(Windows 、Linux系统)

AWS 命令行界面&#xff08;AWS CLI&#xff09;是用于管理 AWS 产品的统一工具。只需要下载和配置一个工具&#xff0c;您就可以使用命令行控制多个 AWS 产品并利用脚本来自动执行这些服务。 AWS CLI v2 提供了多项新功能&#xff0c;包括改进的安装程序、新的配置选项&#…

高清动态壁纸软件Live Wallpaper Themes 4K mac中文版功能

Live Wallpaper & Themes 4K mac是一款提供各种高清动态壁纸和主题的应用程序。该应用程序提供了大量的动态壁纸和主题&#xff0c;包括自然、动物、城市、抽象等各种类别&#xff0c;可以满足用户不同的需求。除了壁纸和主题之外&#xff0c;该应用程序还提供了许多其他功…

判断序列Series中的值是否都不一样 PandasSeries中的方法:is_unique()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断序列Series中的值是否都不一样 PandasSeries中的方法&#xff1a; is_unique() 选择题 请问下列程序运行的的结果是&#xff1a; import pandas as pd s1 pd.Series([1,2,3]) print("…

Odoo16系统忘记Master密码的解决方法

1 打开项目配置文件../Odoo 16.0.20231119/server/odoo.conf 2 找到admin_passwd 开头的行&#xff0c;删除该行&#xff0c;或者在该行前面添加英文半角分号;注释掉本行 3 重启odoo服务&#xff0c;然后访问页面如&#xff1a;http://localhost:8069/web 4 选择数据库是&am…

Windows核心编程 跨进程操作

目录 进程A拿到进程B句柄是否能用 句柄的权限 关于句柄表 跨进程使用句柄-继承 CreateProcess&#xff1a;bInheritHandles OpenProcess FindWinodw GetCurrentProcess 跨进程使用句柄-拷贝 跨进程操作内存 WriteProcessMemory VirtualProtectEx ReadProcessMemo…

浏览器缓存控制讲解

缓存的作用 在你访问互联网中的任何资源其所产生的任何链路中的每一个节点几乎都会进行缓存&#xff0c;整个缓存体系和细节十分复杂。比如浏览器缓存&#xff0c;服务器缓存&#xff0c;代理服务器缓存&#xff0c;CDN缓存等。 但是缓存又十分重要&#xff0c;不可缺少&…

NX二次开发UF_CURVE_ask_curve_struct_data 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_curve_struct_data Defined in: uf_curve.h int UF_CURVE_ask_curve_struct_data(UF_CURVE_struct_p_t curve_struct, int * type, double * * curve_data ) overview…

情感对话机器人的任务体系

人类在处理对话中的情感时&#xff0c;需要先根据对话场景中的蛛丝马迹判断出对方的情感&#xff0c;继而根据对话的主题等信息思考自身用什么情感进行回复&#xff0c;最后结合推理出的情感形成恰当的回复。受人类处理情感对话的启发&#xff0c;情感对话机器人需要完成以下几…

从0开始学习JavaScript--深入了解JavaScript框架

JavaScript框架在现代Web开发中扮演着关键角色&#xff0c;为开发者提供了丰富的工具和抽象层&#xff0c;使得构建复杂的、高性能的Web应用变得更加容易。本文将深入探讨JavaScript框架的核心概念、常见框架的特点以及它们在实际应用中的使用。 JavaScript框架的作用 JavaSc…

STM32 寄存器配置笔记——USART配置中断接收乒乓缓存处理

一、概述 本文主要介绍如何配置USART接收中断&#xff0c;使用乒乓缓存的设计接收数据并将其回显在PC 串口工具上。以stm32f10为例&#xff0c;配置USART1 9600波特率。具体配置参考上一章节STM32 寄存器配置笔记——USART配置 打印。 乒乓缓存的设计应用场景&#xff1a;当后面…

【ceph】如何打印一个osd的op流程,排查osd在干什么

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

canvas高级动画001:文字瀑布流

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…