爬虫项目实战:利用基于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 trange


class MySpider():
    def __init__(self):
        pass

    # Step 1: 访问网页并获取响应内容
    def get_html_content(self, url):
        try:
            driver.get(url)
            driver.set_page_load_timeout(10)  # 设置超时限制10s
            html_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 what
        data_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.mfbz.cn/a/187368.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VRRP的交换机VRRP主备配置例子

拓朴如下: 主要配置如下: [S1] vlan batch 10 20 # interface Vlanif10ip address 10.1.1.1 255.255.255.0vrrp vrid 1 virtual-ip 10.1.1.254vrrp vrid 1 priority 200vrrp vrid 1 preempt-mode timer delay 20 # interface Vlanif20ip address 13.1.1…

死磕Nacos系列:Nacos在我的SpringCloud项目中做了什么?

Nacos服务注册 我们一个SpringCloud项目中集成了Nacos,当项目启动成功后,就可以在Nacos管理界面上看到我们项目的注册信息,还可以看到项目的健康状态等等信息: 那Nacos是什么时候进行了哪些操作的呢?今天我们来一探究…

【从浅识到熟知Linux】基本指定之find、grep、head和tail

🎈归属专栏:从浅学到熟知Linux 🚗个人主页:Jammingpro 🐟每日一句:一篇又一篇,学写越上头。 文章前言:本文介绍find、grep、head和tail指令用法并给出示例和截图。 文章目录 find基本…

Jquery ajax 进行网络请求,同步阻塞引起的UI线程阻塞 (loading图片不显示 )

jax重新获取数据刷新页面功能,因为ajax属于耗时操作,想在获取数据且加载页面时显示加载遮罩层,结果发现了ajax的好多坑。 ajax 执行http网络请示时时,让遮罩层显示,ajax加载完毕后遮罩层消失。 因为我想让loadChart()…

mysql 更改密码

由于两台设备的mysql数据库的密码不一样,开发时每次连接数据库都需要更改配置文件,所以想修改一下mysql数据库的密码。 mysql 修改密码千万不要直接修改,直接修改的话会出现两种情况: 1,修改成功,无法登录。…

elasticsearch 索引库操作和文档操作

文章目录 索引库操作mapping映射属性索引库的CRUD(创建,读取,更新,删除)创建索引库和映射基本语法:示例: 查询索引库修改索引库删除索引库 文档操作新增文档查询文档删除文档修改文档全量修改增…

通过互联网代理部署Docker+Kubernetes 1.28.1

一、背景 在公司环境中,我们往往都是无法直接连接外网的,之前写过一篇文章,是通过外网自建的中转机器下载需要的离线包,并在内网搭建一个harbor,通过harbor的方式搭建了一个kubernetes,但是这种方式还是有…

蓝牙运动耳机哪个好?蓝牙运动耳机排行榜前十名

​在运动中,音乐可以激发你的热情和动力,而一款好的运动耳机则可以让你更好地享受音乐。然而,市面上的运动耳机品牌和型号众多,质量参差不齐。所以,今天精选了5款市面上比较优秀的运动耳机给大家参考,是你运…

【鬼鬼鬼iiARPG开发记录】

鬼鬼鬼ARPG开发记录 一、创建项目1、创建3D(URP)项目2、导入新的输入系统(input system)3、勾选Enter Play Mode Options 二、导入资源1、创建若干文件夹 一、创建项目 1、创建3D(URP)项目 2、导入新的输入系统(input system) …

PyTorch-ReID重识别算法库与数据集资料汇总

Torchreid 是一个用于深度学习人员重新识别的库,用 PyTorch 编写,为我们的 ICCV’19 项目 Omni-Scale Feature Learning for Person Re-Identification 开发。 PyTorch-ReID的特点是 多GPU训练支持图像和视频 REID端到端培训和评估极其轻松地准备 Rei…

【SpringBoot系列】SpringBoot日志配置

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

电子学会C/C++编程等级考试2021年06月(二级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:数字放大 给定一个整数序列以及放大倍数x,将序列中每个整数放大x倍后输出。 时间限制:1000 内存限制:65536输入 包含三行: 第一行为N,表示整数序列的长度(N ≤ 100); 第二行为N个整数(不超过整型范围),整数之间以一个空格…

Redis集群(新)

1.什么是集群 Redis集群实现了对Redis的水平扩容,可实现并发写操作,启动n个redis节点,将数据分别存储在不同的节点中,每块节点负责不同区域的插槽,所以Redis集群通过分区来提供一定程度的可用性。 Redis集群现采用的是…

Google hacking语法

Google hacking语法 文章目录 Google hacking语法site:inurl:intitle:filetypecacheintext注意 site: 搜索子域 跟域名site:www.baidu.com 定位 跟语言 site: jp inurl: 用于在特定url链接中搜索网站信息 inurl:login intitle: 使用intitle:指令返回页面标题中包含关键…

【pandas】数据透视表【pivot_table】

pivot_table pandas的pivot_table函数是一个非常有用的工具,用于创建一个数据透视表,这是一种用于数据总结和分析的表格形式。 以下是pivot_table的基本语法: pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean,…

vcsa6.7打补丁操作

首先到官网中查找到最新的patch,需要有注册账号才可操作 网址链接:https://customerconnect.vmware.com/patch#search 下载后把iso文件上传到磁盘中,vcsa虚拟机中做光盘iso挂接后, 使用浏览器输入https://ip:5480登录&#xff…

数组基础知识

数组基础(不定时更新) 数组基础 数组基础 (1)数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标下对应的数据。数组下标都是从0开始的。数组内存空间的地址是连续的。 (…

【unity实战】实现一个放置3d物品建造装修系统(附项目源码)

文章目录 最终效果前言绘制开始场景素材开始放置旋转物体扩展优化1. 绘制地图边界,确保放置物品在指定区域内工作2. 让模型所占面积大小更加准确3. 隐藏白色瓦片指示区域 最终效果其他源码参考完结 最终效果 前言 其实3d物品建造装修系统之前就已经做过了&#xff…

Vue框架学习笔记——事件处理

文章目录 前文提要事件处理的解析过程样例代码如下:效果展示图片:v-on:click"响应函数"v-on:click简写形式响应函数添加响应函数传参占位符"$event"注意事项 前文提要 本人仅做个人学习记录,如有错误,请多包…

1、windows10系统下Qt5.12.0与卸载

一、安装包下载 1、Qt社区下载 https://download.qt.io/archive/qt/5.12/5.12.10/qt-opensource-windows-x86-5.12.10.exe 2、百度网盘下载 链接:百度网盘 请输入提取码 3、Qt官网下载: Try Qt | 开发应用程序和嵌入式系统 | Qt 二、安装提示 下…
最新文章