Python 爬虫之简单的爬虫(四)

爬取动态网页(下)


文章目录

  • 爬取动态网页(下)
  • 前言
  • 一、大致内容
  • 二、基本思路
  • 三、代码编写
    • 1.引入库
    • 2.加载网页数据
    • 3.获取并保存
    • 4.保存文档
  • 总结


前言

上篇主要讲了如何去爬取数据,这篇来讲一下如何在获取的同时将数据整理保存到excel文档中。

上一篇《Python 爬虫之简单的爬虫(三)》链接:https://blog.csdn.net/weixin_57061292/article/details/135073002


一、大致内容

以上一篇文章为基础。在原来的代码上进行增添和修改。
增添的内容是:Python操作文档的一些库等相关代码。
修改的内容是:对上一篇的《3.获取指定数据》进行修改,遍历获取的数据的同时把它们添加到新创建的excel文档里。

运行效果图:
在这里插入图片描述


二、基本思路

接着上一篇的基本思路继续写:

  • 第五步:导入一下需要的新的软件库
  • 第六步:主要是将上一篇《3.获取指定数据》里面print()替换成将数据保存到文档中的操作。
  • 第七步:删除文档中默认的Sheet工作表,并保存文档。

三、代码编写

1.引入库

代码如下:

# 以上是原来的
from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 以下是新添加的
from openpyxl.styles import Font, Alignment, Border, Side
import openpyxl
import re

2.加载网页数据

代码如下:

# 这些是原来的
driver = webdriver.Firefox()
driver.get("https://movie.douban.com/annual/2022/?fullscreen=1&source=movie_navigation")
time.sleep(5)
driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')# 这些是新添加的
# 创建实例对象
wb = openpyxl.Workbook()

这里新添加一个对象实例,用来生成excel文档用的。


3.获取并保存

代码如下:

# 获取四大影视类型标题
comment_Titles = driver.find_elements(by=By.CSS_SELECTOR, value='.module-top10-grid-chart-title')
# 创建以四大影视类型标题的四个工作表
i = 0
for comment in comment_Titles:# 创建工作表ws = wb.create_sheet(index=i, title=comment.text)# 冻结首行ws.freeze_panes = 'A2'# 首行居中、加粗、加框线# 将电影中的元素作为标题添加到每个工作表的第一行中cell_titles = ['片名', '演员', '评分', '产地']index = 1for title in cell_titles:wc = ws.cell(row=1, column=index, value=title)# 加粗wc.font = Font(bold=True)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))# 水平垂直居中wc.alignment = Alignment(horizontal='center', vertical='center')index += 1i += 1# 获取每个影视类型里的第一名片名
which_mo_list = driver.find_elements(by=By.CSS_SELECTOR, value='.subject-top-title')
# 将第一名的片名写入到每个工作表中
a = 0
for each_mo in which_mo_list:movie_title = each_mo.get_attribute('title')if a == 0:ws = wb['评分最高华语电影']wc = ws.cell(column=1, row=2, value=f'《{movie_title}》')# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif a == 1:ws = wb['评分最高外语电影']wc = ws.cell(column=1, row=2, value=f'《{movie_title}》')# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif a == 2:ws = wb['年度冷门佳片']wc = ws.cell(column=1, row=2, value=f'《{movie_title}》')# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif a == 3:ws = wb['华语剧集']wc = ws.cell(column=1, row=2, value=f'《{movie_title}》')# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))a += 1# 获取每个影视类型里的第一名评分
movies_top_scores_list = driver.find_elements(by=By.CSS_SELECTOR, value='.rating-card-value')
# 将第一名的评分写入到每个工作表中
c = 0
for movie_top_score in movies_top_scores_list:score = movie_top_score.textif c == 0:ws = wb['评分最高华语电影']wc = ws.cell(column=3, row=2, value=score)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif c == 1:ws = wb['评分最高外语电影']wc = ws.cell(column=3, row=2, value=score)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif c == 2:ws = wb['年度冷门佳片']wc = ws.cell(column=3, row=2, value=score)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif c == 3:ws = wb['华语剧集']wc = ws.cell(column=3, row=2, value=score)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))c += 1# 获取所有影片的人物信息
persons_list = driver.find_elements(by=By.CSS_SELECTOR, value='.subject-credit')
# 将演员信息添加到各自的工作表中
b = 0
for person in persons_list:person_title = person.find_elements(by=By.TAG_NAME, value='p')for title in person_title:# 演员信息actor = title.textif 0 < b <= 10:ws = wb['评分最高华语电影']wc = ws.cell(column=2, row=b+1, value=actor)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 11 < b <= 21:ws = wb['评分最高外语电影']wc = ws.cell(column=2, row=b-10, value=actor)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 22 < b <= 32:ws = wb['年度冷门佳片']wc = ws.cell(column=2, row=b-21, value=actor)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 33 < b <= 43:ws = wb['华语剧集']wc = ws.cell(column=2, row=b-32, value=actor)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))b += 1# 获取所有影片的片名(每个影视类型里的第一名除外)
movies_title_list = driver.find_elements(by=By.CSS_SELECTOR, value='.subjects-rank-title')
# 将片名写入到每个工作表中
d = 0
for movie_title in movies_title_list:# 使用正则表达式提取中文文本# 使用正则表达式 [\u4e00-\u9fff]+# 匹配一个或多个连续的中文字符,并使用 re.search().group(1) 获取第一个括号内的匹配内容,即中文文本。chinese_text = re.search(r'([\u4e00-\u9fff]+)', movie_title.text).group(1)if 0 <= d <= 8:ws = wb['评分最高华语电影']wc = ws.cell(column=1, row=d+3, value=f'《{chinese_text}》')# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 9 <= d <= 17:ws = wb['评分最高外语电影']wc = ws.cell(column=1, row=d-6, value=f'《{chinese_text}》')# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 18 <= d <= 26:ws = wb['年度冷门佳片']wc = ws.cell(column=1, row=d-15, value=f'《{chinese_text}》')# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 27 <= d <= 35:ws = wb['华语剧集']wc = ws.cell(column=1, row=d-24, value=f'《{chinese_text}》')# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))d += 1# 获取影片的产地(每个影视类型里的第一名除外)
addresses_list = driver.find_elements(by=By.CSS_SELECTOR, value='.subjects-rank-credits > div:nth-child(2)')
# 将产地名称添加到每个工作表中
e = 0
for addresses in addresses_list:address_text = addresses.textif 0 <= e <= 8:ws = wb['评分最高华语电影']wc = ws.cell(column=4, row=e + 3, value=address_text)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 9 <= e <= 17:ws = wb['评分最高外语电影']wc = ws.cell(column=4, row=e - 6, value=address_text)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 18 <= e <= 26:ws = wb['年度冷门佳片']wc = ws.cell(column=4, row=e - 15, value=address_text)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 27 <= e <= 35:ws = wb['华语剧集']wc = ws.cell(column=4, row=e - 24, value=address_text)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))e += 1# 获取影片评分(每个影视类型里的第一名除外)
movies_scores_list = driver.find_elements(by=By.CSS_SELECTOR, value='.subjects-rank-rating')
# 将评分输入到每个工作表中
f = 0
for movie_score in movies_scores_list:score = movie_score.textif 0 <= f <= 8:ws = wb['评分最高华语电影']wc = ws.cell(column=3, row=f + 3, value=score)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 9 <= f <= 17:ws = wb['评分最高外语电影']wc = ws.cell(column=3, row=f - 6, value=score)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 18 <= f <= 26:ws = wb['年度冷门佳片']wc = ws.cell(column=3, row=f - 15, value=score)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))elif 27 <= f <= 35:ws = wb['华语剧集']wc = ws.cell(column=3, row=f - 24, value=score)# 单元格左右上下加框线wc.border = Border(left=Side(border_style='thin'), right=Side(border_style='thin'),top=Side(border_style='thin'), bottom=Side(border_style='thin'))f += 1

代码很多哈。但都是有规律的。上一篇是获取到数据把它变成一个列表,然后遍历打印出来它。

这里变了。不是遍历打印了,改成遍历保存了。因为上面获取的每个列表里面的元素顺序是有规律的(需要大家自己动手去体会啦),结合一定的逻辑判断,分别把它们填写到四个类型的工作表中去(再添加一些对表格美化的操作的代码)。


4.保存文档

代码如下:

del wb['Sheet']
wb.save(f'example{int(time.time())}.xlsx')

删除文档默认的Sheet工作表(没卵用),保存文档(默认保存到当前文件夹下)。


总结

其它的还好,主要是数据的遍历保存的逻辑判断部分的代码,这个需要大家手动去搞一遍才能明白。这篇用的是Python 3.11.6 版本的环境,基本环境因素要注意哦,要不然就算一样的代码运行起来也可能会有问题。

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

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

相关文章

每个开发人员都应该知道的六个生成式 AI 框架和工具

在快速发展的技术环境中&#xff0c;生成式人工智能是一股革命性的力量&#xff0c;它改变了开发人员处理复杂问题和创新的方式。本文深入探讨了生成式 AI 的世界&#xff0c;揭示了对每个开发人员都至关重要的框架和工具。 1. LangChain LangChain 由 Harrison Chase 开发并于…

Ansible自动化运维以及模块使用

ansible的作用&#xff1a; 远程操作主机功能 自动化运维(playbook剧本基于yaml格式书写) ansible是基于python开发的配置管理和应用部署工具。在自动化运维中&#xff0c;现在是异军突起 ansible能够批量配置、部署、管理上千台主机。类似于Xshell的一键输入工具。不需要每…

Linux 命令大全备忘录

碰巧一些 Linux 终端命令很难回忆起来&#xff0c;将它们作为备忘单保存在您的计算机或纸张上是一种很好的做法。此列表并不详尽&#xff0c;但它包括最常用的命令。请随时在下面的评论中添加您最常用的命令并分享此列表✌️。 用户 Id – 有关用户&#xff08;uid、gid 和组…

通过层进行高效学习:探索深度神经网络中的层次稀疏表示

一、介绍 深度学习中的层次稀疏表示是人工智能领域日益重要的研究领域。本文将探讨分层稀疏表示的概念、它们在深度学习中的意义、应用、挑战和未来方向。 最大限度地提高人工智能的效率和性能&#xff1a;深度学习系统中分层稀疏表示的力量。 二、理解层次稀疏表示 分层稀疏表…

JDK各个版本特性讲解-JDK19特性

JDK各个版本特性讲解-JDK19特性 一、JAVA19概述二、新特性介绍1. 记录模式(预览版本)2.Linux/RISC-V 移植3.外部函数和内存 API &#xff08;预览版&#xff09;4.虚拟线程(预览版)5.Vector API &#xff08;第四次孵化&#xff09;6.Switch 模式匹配&#xff08;第三预览版&am…

从C代码制作chm开发文档【doxygen + graphviz+winChm】

需要的工具&#xff1a; 1. doxygen 最新版本 2. graphviz 最新版本 3. winChm破解版本 1. 最后制作的效果 2. 生成HTML文档 生成hmtl文档是勾选如下2项&#xff0c;为生成chm准备&#xff1a; 需要选择如下2项&#xff1a; generate HTMLHELP 生…

C语言数据结构-排序

文章目录 1 排序的概念及运用1.1 排序的概念1.2 排序的应用 2 插入排序2.1 直接插入排序2.2 希尔排序2.3 直接排序和希尔排序对比 3 选择排序3.1 堆排序3.2 直接选择排序 4 交换排序4.1 冒泡排序4.2 快速排序4.2.1 挖坑法14.2.2 挖坑法24.2.3 挖坑法3 5 并归排序6 十万级别数据…

基于RBAC的k8s集群权限管控案例

在日常的kubernetes集群维护过程中&#xff0c;常常涉及多团队协作&#xff0c;不同的团队有不同的操作和权限需求。比如&#xff0c;运维团队需要有node的所有操作权限&#xff0c;以便对集群进行节点的扩缩容等日常维护工作&#xff0c;但资产运营团队通常只需要node的查看权…

深入探索Git的高级技巧与神奇操作(分支,高效合并)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 深入探索Git的高级技巧与神奇操作 前言强制推送的妙用1. 什么是强制推送&#xff1f;2. 为什么需要使用强制推送&#xff1f;3. 强制推送的风险与注意事项4. 如何正确、安全地执行强制推送步骤&#x…

vCenter HA拆分和部署

原创作者&#xff1a;运维工程师 谢晋 vCenter HA拆分和部署 拆分vCenter HA部署vCenter HA 拆分vCenter HA 客户vCenter HA内一台虚拟机出现故障无法连接&#xff0c;报错如下&#xff1a; 点击移除集群报错如下&#xff1a; 查找官方KB&#xff0c;按照官方KB进行移除…

PyCharm关闭项目很慢

我的版本&#xff1a; PyCharm 2023.2.5 (Professional Edition) 问题&#xff1a; 关闭项目的时候显示一直在关闭项目 &#xff08;单次解决&#xff1a;任务管理器里面杀掉PyCharm&#xff09; 解决方案&#xff1a; 在PyCharm中按下快捷键 CtrlShiftA。 输入Registry或…

如何同时给每张PPT插入不同的图片?这2种方法可行!

有时候创作PPT&#xff0c;我们需要把几十张图片插入到PowerPoint中&#xff0c;每张图片作为一张幻灯片&#xff0c;如果一张张手动操作&#xff0c;那就未免太花时间了。今天小编来分享2种方法&#xff0c;可以让您快速给每张PPT插入不同图片。 方法一、使用“创建相册” 1.…

第三方软件验收测试对于软件项目验收的重要性

软件公司开发出一款软件产品后需要通过一系列的验收测试才能顺利上市&#xff0c;从而被最终用户使用。验收测试是部署软件之前的最后一个测试操作。在软件产品完成了单元测试、集成测试和系统测试之后&#xff0c;产品发布之前所进行的软件测试活动。由于软件企业会将更多的精…

护肤品类小红书素人达人的推广报价是多少?

小红书是一款集社交和电商于一体的平台&#xff0c;用户可以在上面分享生活点滴、购物心得、旅游攻略等。近年来&#xff0c;随着护肤美妆市场的不断扩大&#xff0c;越来越多的品牌和商家选择在小红书上投放广告&#xff0c;借助素人达人的影响力为产品引流。那么&#xff0c;…

某国有银行业务收益提升 30 倍,它究竟是怎么做到的!

在激烈的银行竞争环境下&#xff0c;释放存量客户的复购潜力成为关注的重点。然而&#xff0c;目前银行销售理财产品过程中存在一系列问题&#xff0c;其中一个主要原因是过度依赖理财经理的个人经验。国有银行也难以避免这些问题在目标客户定位和营销执行过程中的出现。 某国…

Word的兼容性问题很常见,禁用兼容模式虽步不是最有效的,但可以解决兼容性问题

当你在较新版本的Word应用程序中打开用较旧版本的Word创建的文档时&#xff0c;会出现兼容性问题。错误通常发生在文件名附近&#xff08;兼容模式&#xff09;。兼容性模式问题&#xff08;暂时&#xff09;禁用Word功能&#xff0c;从而限制使用较新版本Word的用户编辑文档。…

【华为OD题库-098】DNA序列-java

题目 一个DNA序列由A/C/G/T四个字母的排列组合-组成。G和C的比例(定义为GC-Ratio &#xff09;是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中&#xff0c;这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。给定一个很长的DNA序列&…

腾讯云debian服务器的连接与初始化

目录 1. 远程连接2. 软件下载3. 设置开机自启动 1. 远程连接 腾讯云给的服务器在安装好系统之后&#xff0c;只需要在防火墙里面添加一个白名单&#xff08;ip 或者域名&#xff09;就能访问了。 防火墙添加本机WLAN的IPv4白名单&#xff0c;本地用一个远程工具连接&#xff…

免费api接口大全分享

免费api接口大全分享~使用第三方接口开发能大大加速我们的开发速度&#xff01; 短信验证码&#xff1a;可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商&#xff0c;3秒可达&#xff0c;99.99&#xff05;到达率&#xff0c;支持大容量高并发。通知短信&a…

Java第十七章总结

数据库基础 SQL语言 1、select 语句 select 语句用于从数据中检索数据。语法如下&#xff1a; SELECT 搜选字段列表 FROM 数据表名 WHERE 条件表达式 GROUP BY 字段名 HAVING 条件表达式(指定分组的条件) ORDER BY 字段名[ASC|DESC] 2、insert 语句 insert 语句用于向表中插入…