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 = 1
    for 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 += 1

    i += 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.text
    if 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.text

        if 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.text
    if 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.text
    if 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 版本的环境,基本环境因素要注意哦,要不然就算一样的代码运行起来也可能会有问题。

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

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

相关文章

机器学习 | 贝叶斯方法

不同于KNN最近邻算法的空间思维&#xff0c;线性算法的线性思维&#xff0c;决策树算法的树状思维&#xff0c;神经网络的网状思维&#xff0c;SVM的升维思维。 贝叶斯方法强调的是 先后的因果思维。 监督式模型分为判别式模型和生成式模型。 判别模型和生成模型的区别&#xf…

英码科技受邀参加2023计算产业生态大会,分享智慧轨道交通创新解决方案

12月13-14日&#xff0c;“凝心聚力&#xff0c;共赢计算新时代”——2023计算产业生态大会在北京香格里拉饭店成功举办。英码科技受邀参加行业数字化分论坛活动&#xff0c;市场总监李甘来先生现场发表了题为《AI哨兵&#xff0c;为铁路安全运营站好第一道岗》的精彩主题演讲&…

PIL/Pillow

Abstract PIL(Python Imaging Library)是一个用于图像处理的 Python 库。它提供了广泛的功能&#xff0c;包括图像加载、保存、调整大小、裁剪、旋转、滤镜应用等。 由于 PIL 的开发停止在 2009 年&#xff0c;因此推荐使用其后续的维护版本 Pillow。Pillow 是一个兼容 PIL 接…

Vue3+el-table实现甘特图

Vue3 el-table实现甘特图效果 代码gitee 整体实现效果如下 进度列&#xff0c;可以通过设置天或小时&#xff0c;切换不同列显示类型。 涉及到的问题 1、通过Worker解决js线程堵塞问题 在根据时间动态生成列时&#xff0c;由于开始时间与结束时间跨度过大时&#xff0c;计…

【从服务器获取共享列表失败】【无法与设备或资源通信】解决方案!

【从服务器获取共享列表失败】背景&#xff1a; 某项目搭建有samba共享&#xff0c;使用一段时间后&#xff0c;不知何种原因&#xff0c;客户端链接共享时报&#xff1a;从服务器获取共享列表失败&#xff0c;无效的参数。 可参考解决方案A&#xff1a; 银河麒麟samba共享文…

vue3 环境变量

开发环境&#xff1a; .env.development VITE_HTTPhttp://www.baidu.com生成环境&#xff1a; .env.production VITE_HTTPhttp://www.jd.com获取环境里的值 <template></template><script setup lang"ts"> console.log(import.meta.env); <…

图片处理软件DxO PhotoLab 6 mac高级工具

DxO PhotoLab 6 mac是一款专业的RAW图片处理软件&#xff0c;适用于Mac操作系统。它具有先进的图像处理技术和直观易用的界面&#xff0c;可帮助用户轻松地将RAW格式的照片转换为高质量的JPEG或TIFF图像。 DxO PhotoLab 6支持多种相机品牌的RAW格式&#xff0c;包括佳能、尼康、…

【docker】数据管理

Docker容器会随时关闭和开启,Docker 容器的数据放哪里呢&#xff1f; 答案就是&#xff1a;数据卷和数据卷容器 官网文档 Manage data in Docker | Docker Docs 数据卷(Data Volume) 数据卷就是将宿主机的某个目录&#xff0c;映射到容器中&#xff0c;作为数据存储的目录&…

21 3GPP中 5G NR高速列车通信标准化

文章目录 信道模型实验——物理层设计相关元素μ(与子载波间隔有关)设计参考信号(DMRS) 本文提出初始接入、移动性管理、线性小区设计等高层技术。描述3GPP采用HST场景的评估参数&#xff0c;阐释了HST应用的物理层技术&#xff0c;包括数字通信和参考信号设计&#xff0c;链路…

基于PHP的蛋糕购物商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的蛋糕购物商城系统 一 介绍 此蛋糕购物商城基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈&#xff1a;phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销…

【大数据存储与处理】实验四 MongoDB 文档操作

实验四 MongoDB 文档操作 【实验目的】&#xff1a; 1. 掌握 MongoDB CRUD 基本操作&#xff1b; 2. 掌握 MongoDB 插入文档 3. 掌握 MongoDB 更新文档 4. 掌握 MongoDB 删除文档 5. 掌握 MongoDB 删除集合。 【实验内容与要求】&#xff1a; MongoDB 是一个介于关系数…

深入理解PyTorch中的Hook机制:特征可视化的重要工具与实践

文章目录 一、前言1. 特征可视化的重要性2. PyTorch中的hook机制简介 二、Hook函数概述1. Tensor级别的hook&#xff1a;register_hook()2. Module级别的hook 三、register_forward_hook()详解1. 功能与使用场景2. 示例代码与解释3. 在特征可视化中的具体应用 四、register_bac…

HarmonyOS播放视频及音乐

效果如下 代码 Entry Component struct PageVideo {State videoSrc: Resource $rawfile(AndroidVideo.mp4)State previewUri: Resource $rawfile(6_20231218171028A068.jpg)State curRate: PlaybackSpeed PlaybackSpeed.Speed_Forward_1_00_XState isAutoPlay: boolean fal…

js按顺序循环接口返回数据,组合成新数据

有时候我们需要根据一个参数&#xff0c;通过接口返回的数据进行一一对应。形成请求参数又有对应的返回结果的新数据。 新数据格式1&#xff1a;一个对象包含请求参数和返回值 现在vue项目里有个字典接口&#xff0c;该页面很多地方要调用字典接口&#xff0c;需要写个循环将…

IIOT与IOT:什么是工业物联网?为什么需要工业物联网?

工业物联网也被称作工业4.0或工业互联网&#xff0c;是物联网的一个子集&#xff0c;其通过通信技术连接的众多工业设备组成的网络&#xff0c;使系统能够以前所未有的方式监控、收集、交换、分析和提供有价值的新见解&#xff0c;以帮助工业企业做出更智能、更快速的业务决策。…

告诉你playwright 不使用with sync_playwright() as编写脚本的新方法

大家都知道playwright代码的标准写法是&#xff1a; with sync_playwright() as p:browser p.chromium.launch(channel"chrome", headlessFalse)page browser.new_page()page.goto("http://www.baidu.com")print(page.title())browser.close() with sy…

解决ESP8266无法退出透传问题以及获取网络时间以及天气方法

网上很多配置ESP8266的教程&#xff0c;但是遇到无法退出透传模式的情况却没有找得到答案&#xff0c;不知道是大家都没遇到还是怎么样&#xff0c;以下是我的解决方法&#xff1a;实测有效 先发送“”&#xff08;三个加号&#xff09;&#xff08;如果是在串口调试助手调试&…

硕迪填报如何自动生成UUID并存入数据库

硕迪填报如何自动生成UUID并存入数据库 需求&#xff1a;1、在不修改jsp页面的情况下&#xff0c;如何生成一个UUID并存入数据库&#xff1f; 2、修改数据时&#xff0c;根据UUID去更新数据。 现在我总结一个更简洁的方法&#xff0c;具体操作步骤如下&#xff1a; 1、填报表…

SpringBoot知识点回顾01

Spring是为了解决企业级应用开发的复杂性而创建的&#xff0c;简化开发。 Spring是如何简化Java开发的 为了降低Java开发的复杂性&#xff0c;Spring采用了以下4种关键策略&#xff1a; 1、基于POJO的轻量级和最小侵入性编程&#xff0c;所有东西都是bean&#xff1b; 2、通…

WebGL开发虚拟旅游应用

WebGL可以用于开发虚拟旅游应用&#xff0c;提供用户在浏览器中探索虚拟景点和环境的交互体验。以下是在WebGL中开发虚拟旅游应用的一般流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析…