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.rhkb.cn/news/220585.html

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

相关文章

利用canvas封装录像时间轴拖动(uniapp),封装上传uniapp插件市场

gitee项目地址,项目是一个空项目,其中包含了封装的插件,自己阅读,由于利用了canvas所以在使用中暂不支持.nvue,待优化; 项目也是借鉴了github上的一个项目,timeline-canvas,​​​​​​​ ​​​​​​​

【2.2操作系统】进程管理

目录 1.进程的基本概念2.进程的状态3.信号量与PV操作4.前趋图5.死锁6.银行家算法 1.进程的基本概念 &#x1f31f;进程是程序在一个数据集合上运行的过程&#xff0c;它是系统进行资源分配和调度的一个独立单位。它由程序块、进程控制块 (PCB) 和数据块三部分组成。 &#x1f…

Kubernetes 的用法和解析 -- 5

一.企业级镜像仓库Harbo 准备&#xff1a;另起一台新服务器&#xff0c;并配置docker yum源&#xff0c;安装docker 和 docker-compose 1.1 上传harbor安装包并安装 [rootharbor ~]# tar xf harbor-offline-installer-v2.5.3.tgz [rootharbor ~]# cp harbor.yml.tmpl harbor…

一篇文章带你了解各个程序员接单平台,让你选择不再迷茫!!!

相信现在很多程序员都已经走上了或者准备走上网上接单这条路&#xff0c;但是目前市面上的接单平台可谓五花八门&#xff0c;对于各个平台的优缺点&#xff0c;不同的程序员该如何选择适合自己的接单平台&#xff0c;你又是否了解呢&#xff1f; 接下来就让小编用一篇文章来为…

Axure动态面板的使用

一. 动态面板 Axure动态面板是Axure RP软件中的一个功能模块&#xff0c;用于创建交互式原型和模拟应用程序的动态效果。它可以模拟用户在应用程序中的操作流程&#xff0c;并展示不同状态之间的变化&#xff0c;提供更真实的用户体验。通过创建不同的状态和添加交互效果&…

springboot 学生信息管理

介绍 一个学生信息管理后台&#xff0c;适用于大作业&#xff0c;课设等 软件架构 springbootmybatisthymeleaf &#xff08;前后端未分离&#xff09; 安装教程 注&#xff1a;mysql数据库要8.0以上&#xff0c;&#xff0c;本地mysql新建一个名为 student 的空数据库&am…

ElasticSearch详细搭建以及常见错误high disk watermark [ES系列] - 第497篇

导读 历史文章&#xff08;文章累计490&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六…

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

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

2023 英特尔On技术创新大会直播 |让更多人了解AI魅力

2023 英特尔On技术创新大会直播 |让更多人了解AI魅力 前言&#xff1a;主要领域:人工智能&#xff1a;使用 OpenVINO™ 落地边缘端生成式 AIOpenVINO™学习总结&#xff1a; 新一代 AI PC计算平台&#xff1a;新一代至强平台&#xff1a;边云协同&#xff1a;先进技术&#xff…

基于JavaWeb+SSM+Vue微信小程序的移动学习平台系统的设计和实现

基于JavaWebSSMVue微信小程序的移动学习平台系统的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 Lun文目录 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 2 第2章 开发环…

自助式可视化开发,ETLCloud的集成之路

自助式可视化开发 自助式可视化开发是指利用可视化工具和平台&#xff0c;使非技术人员能够自主创建、定制和部署数据分析和应用程序的过程。 传统上&#xff0c;数据分析和应用程序开发需要专业的编程和开发技能。但是&#xff0c;自助式可视化开发工具的出现&#xff0c;使…

AI抠图软件哪个好用?推荐这三款抠图工具给你

AI抠图软件哪个好用&#xff1f;你是否听说过AI抠图这个操作呢&#xff1f;简单来说&#xff0c;抠图就是一种对图像进行处理的技术&#xff0c;它的目的是将图片中的某些区域去除或者替换。比如&#xff0c;如果你有一张背景很杂乱的图片&#xff0c;你想把背景去掉&#xff0…

四、Spring IoC实践和应用(基于XML配置方式组件管理)

本章概要 基于XML配置方式组件管理 实验一&#xff1a; 组件&#xff08;Bean&#xff09;信息声明配置&#xff08;IoC&#xff09;实验二&#xff1a; 组件&#xff08;Bean&#xff09;依赖注入配置&#xff08;DI&#xff09;实验三&#xff1a; IoC 容器创建和使用实验四…

python:import自定义包或py文件时,pyCharm正常但终端运行提示ModuleNotFoundError: No module named错误

问题 示例项目引用items.py&#xff0c;项目在pycharm开发工具中可以正常运行&#xff0c;但使用终端直接运行会报错ModuleNotFoundError: No module named。如下图。 原因 pycharm开发工具运行正常&#xff0c;说明目录和引用模块是没问题的。问题在于终端的运行环境只搜索文…

armday1

1到一百的累加

蓝桥杯time模块常用操作

#导入time模块import time #获取时间戳 start_time time.time () print ( "start_time ", start_time) time .sleep ( 3) end_time time.time () print ( "end_time ", end_time)#计算运行时间 print("运行时间 { :.0f } ".format(end_time …

VR党建:VR全景技术如何助力党建知识传播

导语&#xff1a; 随着科技的不断发展&#xff0c;虚拟现实技术逐渐深入人们生活的方方面面。VR全景技术作为一种全新的沉浸式体验方式&#xff0c;被广泛应用于娱乐、教育、医疗等领域。而在党建学习中&#xff0c;VR全景技术也展现出了巨大的潜力&#xff0c;成为了一种创新…

LVS-DR模式部署

实验准备&#xff1a; 节点服务器 192.168.116.20 #web1 192.168.116.30 #web2 1.部署NFS共享存储 2.部署Web节点服务器 将两台服务器的网关注释掉 #重启网卡 systemctl restart network 修改节点服务器的内核参数|vim /etc/sysctl.conf net.ipv4.conf.lo.arp_ign…

浅谈云性能测试的关键要点

随着云计算的广泛应用&#xff0c;云性能测试成为确保云服务质量和性能的关键环节。云性能测试不仅涵盖了传统性能测试的方面&#xff0c;还需要考虑云环境的特殊性。以下是云性能测试的几个关键要点&#xff1a; 1. 模拟真实云环境 云环境具有虚拟化、弹性扩展等特点&#xff…

install cuda cudnn tersorRT

1, dark view 2,470-server cant install 11.4 3,cuda.run and tensorRT.dpkg cant # 安装 $ ubuntu-drivers devices$ sudo apt-get install nvidia-driver-470-server # 推荐是server&#xff0c;都可以。#delelt sudo apt --purge remove nvidia-* CUDA Toolkit Archiv…