Python网络爬虫4-实战爬取pdf

1.需求背景

爬取松产品中心网站下的家电说明书。这里以冰箱为例:松下电器-冰箱网址
网站分析:
第一步:
点击一个具体的冰箱型号,点击了解更多,会打开此型号电器的详情页面。
在这里插入图片描述
第二步:在新打开的详情页面中说明书下载标识

在这里插入图片描述
第三步:点击说明书下载,将下载此说明书

2.实现思路与核心步骤

由以上操作,我们知道了模拟用户点击的具体步骤,大致得到了一个整体思路。
主要难点:

  1. 如何在整个页面中定位到某一个具体的电器型号,如何遍历依次得到此页面所有型号
  2. 打开新页面,如何切换到新打开的窗口
  3. 如何定位到新打开窗口的说明书下载按钮
  4. 下载完成后如何切换回到原始的页面,进行下一个电器的点击
  5. 多个页面,如何进行翻页

2.1 得到新页面的链接

依次解决:
1.按F12,打开开发者模式,点击如图所示的1,检查,点击了解详情2,会自动定位显示如图3所示。

在这里插入图片描述
发现3标识的href就是此型号的详情页面。所以可以编写函数得到此链接。
这里也有两种方式:
方式一:使用Selenium模拟用户点击,使用xpath定位得到此href
方式二:使用requests直接得到此页面中的所有href链接,发现具体型号的链接时带有product,依据此进行筛选。
本文使用方式二:


def get_allurl(url):
    '''
    得到url下,所有以.html结尾的href标签下的链接
    :param url:
    :return:
    '''
    result_link = []

    html_content = requests.get(url).text
    soup = BeautifulSoup(html_content, "html.parser")
    
    # 由开发者模式下可以看出,我们需要的href标签时a,且时以.html为结尾
    link_nodes = soup.find_all('a', href=lambda href: href and href.endswith('.html'))
    for node in link_nodes:
        tem_url=node.get("href")
        result_link.append(tem_url)
       
    return result_link

2.2 模拟用户进行点击下载

在这里插入图片描述
进入此页面,发现此网站下的链接并不是直接以.pdf为结尾的链接,而是有封装了一层,所以只能通过模拟用户点击的方式。

在这里插入图片描述
同时需要点击两次,首先第一次时说明书下载,出来具体型号,我们这里只选第一个NR-ZE391LG-W这个位置。
点击这些位置,得到其对应的XPATH
代码实现如下:


def clik_url(url):
    # 初始化WebDriver
    driver = webdriver.Chrome()
    # 导航到包含链接的网页
    driver.get(url)
	
	# 为了防止有的型号不包含说明书,不存在对应的xpath路径,出现错误,终止程序
	# 这里使用了try except
    try:
      
        # 找到说明书下载按钮的Xpath ='/html/body/div[5]/div/div[2]/div[1]/div/div[1]'
        click_element = WebDriverWait(driver, 5).until(
            EC.element_to_be_clickable((By.XPATH, '/html/body/div[5]/div/div[2]/div[1]/div/div[1]'))
        )
        # 点击说明书下载
        click_element.click()

        # 页面加载完成后会出现具体型号,比如图中的NR-ZE391LG-W,找到此位置
        res=WebDriverWait(driver, 5).until(
            EC.visibility_of_element_located((By.XPATH, '/html/body/div[5]/div/div[2]/div[1]/div/div[2]/ul/li/a'))
        )
        # 此位置包含了一个以.pdf为结尾的href链接,是我们需要找的。
        if res:
            new_url=res.get_attribute('href')
            # get_pdf(new_url)
            print(new_url)

            time.sleep(2)
            driver.quit()
            return new_url

        else:
            print("none")
            time.sleep(2)
            driver.quit()
            return None
    except:
        time.sleep(2)
        driver.quit()
        pass

此函数返回了pdf的具体链接,由此链接就可以直接获取到pdf文件

2.3 获取pdf文件

由以上得到的pdf链接,获取保存为pdf文件。例如:
https://home.panasonic.cn/support/attachments/auld/manual/NR-ZE391LG-W.pdf


def get_pdf(url,output_dir):
    '''
    url是一个后缀为.pdf的链接,点击就可以下载pdf文件,此函数保存pdf到output_dir路径
    :param url:
    :param output_dir:
    :return:
    '''
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # 下载文件
    try:
        response = requests.get(url, stream=True)
        response.raise_for_status()
    except:
        return

    # 提取文件名(这里需要根据你的URL结构或链接的href属性来提取)
    # 假设文件名是URL的最后一部分(不包括查询参数)
    filename = os.path.basename(urlparse(url).path)

    # 将文件保存到本地
    with open(os.path.join(output_dir, filename), 'wb') as f:
        for chunk in response.iter_content(1024):
            f.write(chunk)

        print(f'Downloaded: {filename}')

3. 整体流程和代码实现

def get_allurl(url):
    ······如上所示······
    return result_link

def get_pdf(url,output_dir):

    ······如上所示······
    

def clik_url(url):
    ······如上所示······
   return new_url

# 函数开始入口
def page_res(page_url,output_dir):
    
    # 1.点击到电饭煲的主页面,返回这个页面下所有的以.html结尾的网址
    prod_urls = get_allurl(page_url)
	
	# 2.遍历网址,进行pdf下载
    for i in range(len(prod_urls)):
        
        print(prod_urls[i])

        # 有一些.html的网页也不含pdf,发现含的都带有product字样,所以进行过滤
        if 'product' in str(prod_urls[i]):
          
          # 3.点击得到新出现的pdf链接
           pdf_url = clik_url(prod_urls[i])

           if pdf_url:
               # 4.进行pdf文件下载
               get_pdf(pdf_url, output_dir)
    print("本页下载已完成")

如果想要获取更多页面的冰箱型号,可以观察到不同页面的url是由规律的,直接for循环遍历页面就行了。

4.总结

1.使用获取所有链接再进行筛选的方式,代替了模拟用户点击以此定位具体位置,进行点击
2.在新打开的页面中没有直接暴露pdf链接,需要点击说明书下载按钮才能得到pdf链接,点击一次,显示pdf链接之后,并没有继续采用用户点击的方式,而是直接获取(这与网站有关,有点还是不会显示出来,只有点击才会出现)
因为没用采用点击,也不存在页面切换的问题。相比于全部Selenium模拟用户点击,少了许多步骤。

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

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

相关文章

N7745A Keysight 是德 多端口光功率计 简述

N7745A光功率计专为表征多端口光器件而设计,适用于多路复用器、PON分路器、波长选择开关(WSS)和ROADM等多端口器件的测试。它可以节省通道空间,通过LAN或USB连接进行并行编程,集成多种设备到单一设置,提高了…

用Vue3和ApexCharts打造交互式3D折线图

本文由ScriptEcho平台提供技术支持 项目地址:传送门 Vue.js 中使用 ApexCharts 构建交互式折线图 应用场景 ApexCharts 是一个功能强大的 JavaScript 库,用于创建交互式、可定制的图表。在 Vue.js 中,它可以通过 vue3-apexcharts 插件轻松…

JavaFX HTMLEditor

HTMLEditor控件是一个富文本编辑器,具有以下功能。 粗体斜体下划线删除线字体系列字体大小前景色背景颜色缩进项目符号列表编号列表对齐水平线复制文本片段粘贴文本片段 HTMLEditor类返回HTML字符串中的编辑内容。 创建HTML编辑器 import javafx.application.App…

docker安装使用

文章目录 docker产生的原因传统虚拟机容器化技术 docker组成安装docker镜像加速docker安装过程中遇到的问题以及解决办法Errors during downloading metadata for repository root_:Failed to set locale, defaulting to C.UTF-8 docker产生的原因 传统虚拟机 在不使用docker…

《Linux运维总结:基于ARM64架构CPU使用docker-compose一键离线部署alertmanager v0.27.0高可用集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面对不同的客户部署业务系统&#xff0…

基于SpringBoot+Vue农产品管理与销售APP设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

刚刚发布!这4本期刊已剔除SCI收录,附完整目录下载

科睿唯安于6月19日更新了SCIE、SSCI、AHCI、ESCI四大数据库最新收录期刊目录。 2024年第一版——2024年1月24日更新 2024年第二版——2024年2月19日更新 2024年第三版——2024年3月18日更新 2024年第四版——2024年4月15日更新 2024年第五版——2024年5月20日更新 2024年…

处于损害控制模式的微软表示,它将优先考虑安全性,而不是人工智能

处于损害控制模式的微软表示,它将优先考虑安全性,而不是人工智能 微软总裁布拉德史密斯(Brad Smith)周四在国会作证时表示,微软正在调整公司文化,将安全作为头等大事,并承诺安全将“比公司在人工智能方面的工作更重要”…

数字人源码部署该如何选对数字人源头工厂?

数字人作为AI产业的中流砥柱,其应用场景之广泛。从数字人口播、到直播到数字人克隆、到声音克隆、再至AI复活、数字人名片、数字人员工、数字人客服、3D息影舱智能交互、要知道这一切仅仅只是用了两年的时间,可见我国的AI技术取得突破性发展. 如果把时间…

KEIL5.39 5.40 fromelf 不能生成HEX bug

使用AC6 编译,只要勾选了生成HEX。 结果报如下错误 暂时没有好的解决办法 1.替换法 2.在编译完后用命令生成HEX

【Orange Pi 5与Linux内核编程】-理解Linux内核中的container_of宏

理解Linux内核中的container_of宏 文章目录 理解Linux内核中的container_of宏1、了解C语言中的struct内存表示2、Linux内核的container_of宏实现理解3、Linux内核的container_of使用 Linux 内核包含一个名为 container_of 的非常有用的宏。本文介绍了解 Linux 内核中的 contain…

如何用Vue3和ApexCharts打造引人注目的3D径向条形图

本文由ScriptEcho平台提供技术支持 项目地址:传送门 使用 ApexCharts 构建美观的 Vue.js 径向条形图 应用场景 径向条形图是一种用于可视化单一数据点及其与目标或理想值的关系的图表类型。它在显示进度、完成率或其他类似度量时非常有用。 基本功能 这段代码…

有了MES、ERP,质量管理为什么还需要QMS?

在制造业,质量管理始终是企业管理中永恒的主题。品质管理要想做得更好,企业必须掌握足够多、足够有用的数据和信息,实现质量管理信息化。很多中小企业也很困惑,是否有必要上线QMS质量管理系统? 一、为什么企业需要QMS的…

曾从钦:共同做大露酒产业蛋糕,共建露酒产业命运共同体

执笔 | 尼 奥 编辑 | 扬 灵 6月15日,由中国酒业协会主办、五粮液股份公司承办的以“文化焕新,价值绽放”为主题的第三届中国露酒T5峰会在四川省宜宾市召开,参会企业对当前露酒产业现状、结构性矛盾、品类价值表达等议题进行深入探讨和交…

SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件二(补充)

SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件二(补充) 如果你想在cmd命令窗口内看到程序运行,即点开弹出运行窗口,关闭时exe自动关闭。 需要再launch4j上进行如下操作: 这样转换好的exe就可以有控制台了…

如何解决input输入时存在浏览器缓存问题?

浏览器有时会在你输入表单过后缓存你的输入&#xff0c;有时候能提供方便。 但是在某些新建或新页面情况下出现历史的输入信息&#xff0c;用户体验很差。 解决方案 设置 autocomplete关闭 &#xff1a;<input type"text" autocomplete"off">增加…

一个轻量级的TTS模型实现

1.环境 python 版本 3.9 2.训练数据集 本次采用LJSpeech数据集&#xff0c;百度网盘下载地址 链接&#xff1a;https://pan.baidu.com/s/1DDFmPpHQrTR_NvjAfwX-QA 提取码&#xff1a;1234 3.安装依赖 pip install TTS 4.工程结构 5代码部分 decoder.py import torch f…

【ARM】如何通过Keil MDK查看芯片的硬件信息

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标&#xff1a; 解决在开发过程中对于开发项目所使用的的芯片的参数查看的问题 2、问题场景&#xff1a; 在项目开发过程中&#xff0c;经常需要对于芯片的时钟、寄存器或者一些硬件参数需要进行确认。大多数情况下是需…

视频监控管理平台智能边缘分析一体机安防监控平台离岗检测算法

在工业自动化和智能制造的背景下&#xff0c;智能边缘分析一体机的应用日益广泛。这些设备通常在关键岗位上执行监控、分析和数据处理任务。然而&#xff0c;设备的稳定运行至关重要&#xff0c;一旦发生故障或离岗&#xff0c;可能会导致生产线停滞甚至安全事故。因此&#xf…

被拷打已老实!面试官问我 #{} 和 ${} 的区别是什么?

引言&#xff1a;在使用 MyBatis 进行数据库操作时&#xff0c;#{} 和 ${} 的区别是面试中常见的问题&#xff0c;对理解如何在 MyBatis 中安全有效地处理 SQL 语句至关重要。正确使用这两种占位符不仅影响应用的安全性&#xff0c;还涉及到性能优化。 题目 被拷打已老实&…