爬虫项目实战:利用基于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,一经查实,立即删除!

相关文章

Lua实现面向对象三大特性

面向对象是基于table实现的 封装 :(冒号) 自动将调用该函数的对象作为第一个参数传入 --Object就是第一参数 function Object:new() self:代表默认传入的第一个参数 _index:当自己的变量中找不到时,会默认找原表中_index指向的内容 Obj…

AD9361快速开发指南

AD9361是ADI(Analog Devices)公司推出的一款全集成的RF收发器芯片,广泛应用于无线通信系统,包括基于FPGA和ARM处理器的数码电视,卫星通信,雷达通信,军事通信和工业控制等领域。AD9361提供了广泛…

Qt问题 QString 和 void* 相互转化

QString转为void*格式 //将路径QString转为void*格式QByteArray byteArray qstrFilePath.toUtf8();char* charArray byteArray.data();void* voidPath static_cast<void*>(charArray);void*转为QString格式 char* charPath static_cast<char*>(voidPath); QS…

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

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

杰发科技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…

音视频5、libavformat-2

4、封装 Muxers (封装器)以 AVPacket 的形式获取编码数据并将其写入到指定容器格式的文件或输出字节流中。 muxing过程中最重要的API函数有: avformat_write_header() 用于写入文件header; av_write_frame() / av_interleaved_write_frame() 用于写…

后端跟前端讨论:如何对比分析AB方案?

目录 一、结论 二、场景再现 1、方案说明 2、不同思维的碰撞&#xff08;重点&#xff09; &#xff08;1&#xff09;场景描述 &#xff08;2&#xff09;后端思维 &#xff08;3&#xff09;前端思维 3、我作为后端说一句 一、结论 不是在设置相同条件下进行对比。 …

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

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

C++右值引用

文章目录 1.左值概念和右值概念1.1.赋值目的1.2.左值右值1.2.1.左值1.2.2.右值 2.左值引用和右值引用2.1.左值引用2.2.右值引用2.2.1.细化参数2.2.2.资源转移2.2.2.1.返回转移2.2.2.2.参数转移 3.万能引用和完美转发3.1.万能引用3.2.完美转发 4.关于const的补充5.类的新成员5.1…

【精选】框架初探篇之——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; 灵耀系列原装系统 无畏系列原装系统 枪…

golang学习笔记——并发计算斐波纳契数

文章目录 按顺序计算斐波纳契数并发计算斐波纳契数使用两个无缓冲 channel 的程序的第二个版本 按顺序计算斐波纳契数 golang学习笔记——将 channel 用作通信机制 golang学习笔记——并发计算斐波纳契数 package mainimport ("fmt""math/rand""tim…

不单一的错误!如何修复Windows 10上“未安装音频输出设备”的错误

许多Windows 10用户,尤其是那些使用HP或Dell笔记本电脑和PC的用户,都会遇到一个错误,上面写着“未安装音频输出设备”。这意味着你无法收听计算机上的任何声音,这让你很难放松,也很难完成工作。 错误通常会在系统托盘中的音频控制旁边显示一个红十字符号。 在这篇文章中…

postgresql经常出现连接一会后服务器拒绝连接

本地连接远程Linux上PG数据库经常自动断开连接 原因&#xff1a;Linux设置的tcp的keepalive超时时间太长&#xff0c;如果网络状况不佳&#xff0c;可能会导致连接断掉。 [rootlocalhost ~]# sysctl -a | grep net.ipv4.tcp_keepalive sysctl: reading key "net.ipv6.con…

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

再继续扒 继续 前一篇 的话题, 在那里, 提到了抽象, 耦合及 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;包括改进的安装程序、新的配置选项&#…

Vue中mvvm的作用

目录 模型表示应用程序的数据。在Vue.js中&#xff0c;它们是JavaScript对象。视图是用户界面。在Vue.js中&#xff0c;使用模板语法编写HTML的表示层。ViewModel是视图的抽象表示&#xff0c;负责处理用户输入的数据&#xff0c;并处理视图的数据绑定。ViewModel使用模型中的…

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

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