爬虫项目实战:利用基于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.hqwc.cn/news/215608.html

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

相关文章

80C51单片机----数据传送类指令

目录 一.一般传送指令,即mov指令 1.16位传送(仅1条) 2.8位传送 (1)目的字节为A(累加器) (2)目的字节为Rn(工作寄存器) (3)目的字节为direct…

Python报错:AttributeError(类属性、实例属性)

Python报错:AttributeError(类属性、实例属性) Python报错:AttributeError 这个错误就是说python找不到对应的对象的属性,百度后才发现竟然是初始化类的时候函数名写错了 __init__应该有2条下划线,如果只有…

逆矩阵相关性质与例题

1.方阵的行列式:就是将方阵中的每一个元素转换至行列式中。 1.性质一:转置方阵的行列式等于转置前的行列式。(对标性质:行列式与它的转置行列式相等) 2.性质二:|ka||a|*k的n次方,n为方阵阶数。 …

Feign接口请求返回异常 no suitable HttpMessageConvert found for response type

问题场景&#xff1a; 后端调用feign接口请求, 接口返回异常, no suitable HttpMessageConvert found for response type 问题描述 报错异常如下&#xff1a; //根据图片特征 去查询人员信息ResultVo<List> personVos ipbdFaceLibPersonApi.queryFacePersonByFeatur…

ErphpdownV16.21插件 安装教程和插件下载

ErphpdownV16.21插件下载_新版本 上传插件并解压 登入后台插件管理启动ErphpdownV16.21插件即可 启动后设置即可使用此版本为学习版插件 功能介绍&#xff1a; Erphpdown会员推广下载专业版 经过完美测试运行于wordpress 3.x-6.x版本。后续会增加更多实用的功能。已针对此插件…

Javaweb之前端工程化的详细解析

3 前端工程化 3.1 前端工程化介绍 我们目前的前端开发中&#xff0c;当我们需要使用一些资源时&#xff0c;例如&#xff1a;vue.js&#xff0c;和axios.js文件&#xff0c;都是直接再工程中导入的&#xff0c;如下图所示&#xff1a; 但是上述开发模式存在如下问题&#xff…

物联网AI MicroPython学习之语法 实时时钟RTC

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; RTC 介绍 模块功能: 实时时钟RTC驱动模块 接口说明 RTC - 构建RTC对象 函数原型&#xff1a;RTC()参数说明&#xff1a; 无 返回值&#xff1a; 构建的RTC对象。 datetime - RTC时钟操作 函数原型&a…

导入PIL时报错

在导入PIL时,报以下错误: 查找原因 参考博客 Could not find a version that satisfies the requirement PIL (from versions: ) No matching distributi-CSDN博客,按照wheel后,安装PIL时,报如下的错误。 查找说是python版本与wheel文件版本不同,确认本机python版本 …

【深度学习】卷积神经网络结构组成与解释

卷积神经网络是以卷积层为主的深度网路结构&#xff0c;网络结构包括有卷积层、激活层、BN层、池化层、FC层、损失层等。卷积操作是对图像和滤波矩阵做内积&#xff08;元素相乘再求和&#xff09;的操作。 1. 卷积层 常见的卷积操作如下&#xff1a; 卷积操作解释图解标准卷…

Oracle SQL 注入上的 Django GIS 函数和聚合漏洞 (CVE-2020-9402)

漏洞描述 Django 于2020年3 月4日发布了一个安全更新&#xff0c;修复了 GIS 函数和聚合中的 SQL 注入漏洞。 参考链接&#xff1a; Django security releases issued: 3.0.4, 2.2.11, and 1.11.29 | Weblog | Django 该漏洞要求开发者使用 JSONField/HStoreField;此外&…

Vue服务端渲染——同构渲染

Vue.js 可以用于构建客户端应用程序&#xff0c;组件的代码在浏览器中运行&#xff0c;并输出 DOM 元素。同时&#xff0c;Vue.js 还可以在 Node.js 环境中运行&#xff0c;它可以将同样的组件渲染为字符串并发送给浏览器。这实际上描述了 Vue.js 的两种渲染方式&#xff0c;即…

nodejs微信小程序+python+PHP-书吧租阅管理系统的设计与实现-安卓-计算机毕业设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…