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

news2024/11/14 19:08:54

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模拟用户点击,少了许多步骤。

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

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

相关文章

阻塞IO、非阻塞IO、IO多路复用和信号驱动IO简介

一、分类 在UNIX或Liunx下主要有4中IO模型 阻塞IO:最简单、最常用、效率最低 阻塞IO简介和代码示例-CSDN博客当进程执行读操作的时候,如果缓冲区有内容,则继续读取内容向下执行。缓冲区没内容,进程进入休眠态,直到缓冲区中再次…

老徐亲自带队死磕 30 天 IP 公众号价值写作, 邀请你一起玩

* 大家好,我是前端队长。前端程序员,2023年开始玩副业。做过AI绘画,公众号 AI 爆文,AI代写项目,累计变现五位数。 — 老徐的一人企业书籍提到一点:120、完全没基础的同学,玩副业,玩 …

springboot连接多个库

一个SpringBoot项目,同时连接两个数据库:比如一个是Mysql数据库,一个是oracle数据库(啥数据库都一样,连接两个同为oracle的数据库,或两个不同的数据库,只需要更改对应的driver-class-name和jdbc…

视觉SLAM14精讲——相机与图像3.2

视觉SLAM14精讲 三维空间刚体运动1.0三维空间刚体运动1.1三维空间刚体运动1.2李群与李代数2.1相机与图像3.1 视觉SLAM14精讲——相机与图像3.2 视觉SLAM14精讲畸变有关重投影误差缩放实际使用 畸变 相机畸变是相机镜头光学缺陷所致的缺陷, 在光学领域这种问题是没…

Apple Intelligence:一文详细解读苹果AI!

大家好,我是木易,一个持续关注AI领域的互联网技术产品经理,国内Top2本科,美国Top10 CS研究生,MBA。我坚信AI是普通人变强的“外挂”,所以创建了“AI信息Gap”这个公众号,专注于分享AI全维度知识…

更适合工程师和研究僧的FPGA专项培训课程

各位编程精英er~ 社区打造的FPGA工程师培训班上线后,有不少同学后台私信询问:“能不能出个那种专门针对某个知识点的课程呢?我想针对自己的薄弱点深入学习。” 贴心如我,当然会满足大家的学习需求啦。本周,社区FPGA专…

Anime Girls Pack

动漫女孩包 35个动画(就地)支持人形。 8情绪。 角色列表:原艾艾琪惠美子惠理文子星薰和子佳子奈子理子凛老师小樱老师津雨僵尸女孩01 下载:​​Unity资源商店链接资源下载链接 效果图:

《维汉翻译通》App的OCR识别技术难度怎么样?通过哪些优化措施来提高文字识别的准确率呢?

《维汉翻译通》App的OCR技术在处理不同字体和大小的文本时,采用了以下优化措施来确保高准确率: 多字体支持:OCR引擎能够识别多种字体样式,包括常见的印刷体和手写体,以及一些特殊的艺术字体。 自适应缩放&#xff1a…

Go使用https

一、服务端 1. 生成私钥和证书 安装OpenSSL windows安装OpenSSL生成CA证书创建证书 以上两个步骤,参考:Go http2 和 h2c 2. 代码 package mainimport ("log""net/http""time""golang.org/x/net/http2" )co…

JVM (二)类加载

一,类的生命周期 加载 连接 验证 准备 解析 初始化 使用 卸载 加载、验证、准备和初始化这四个阶段发生的顺序是确定的,而解析阶段则不一定; 类加载几个阶段按顺序开始,而不是按顺序进行或完成,通常都会交叉进…

2024 New Relic Java 生态系统报告

New Relic 发布了 2024 年度 Java 生态系统报告,数据来源于使用 New Relic 监控的线上 Java 应用。从这个报告中,我们可以看到 Java 发展的一些趋势。 在 Java 版本方面,新版本的使用率越来越高。Java 11 的使用率是 32.9%,Java 1…

Github 2024-06-12 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10PHP项目1PLpgSQL项目1C++项目1Ventoy: 100%开源的可启动USB解决方案 创建周期:1534 天开发语言:C协议类型:GNU General Public Licen…

软件架构风格探析

软件架构是系统设计的基石,它定义了不同组件、层次之间的交互和整合方式。选择恰当的架构风格对于构建高效、可维护以及可扩展的软件系统至关重要。本文将详细探讨几种关键的软件架构风格,包括数据流风格、仓库、调用返回、独立构件和虚拟机,…

课时152:项目发布_手工发布_方案解读

1.2.1 方案解读 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 案例需求 实现一套业务环境的项目发布流程,基本的网站架构效果如下:架构解读:负载均衡采用Nginx服务,基于请求内容进行…

18.3 HTTP服务器-响应不同类型的内容和请求、获取请求数据

1. 响应不同类型的内容 在向客户端返回响应时,服务器应根据客户端的具体需求,为其提供不同类型的内容。一些常见的内容类型包括: text/plain —— 纯文本格式 text/html —— HTML格式 application/json —— JSON格式 application/xml —…

Java多线程CompletableFuture使用

引言 一个接口可能需要调用N个其他服务的接口,这在项目开发中非常常见。如果是串行执行的话,接口的响应速度会很慢。考虑到这些接口之间有大部分都是无前后顺序关联的,可以并行执行。就比如说调用获取商品详情的时候,可以同时调用…

高效换热管

绕管式高效换热器 绕管换热器是一种结构紧凑,传热效率高的新型高效换热器。换热管按螺旋线形状交替缠绕在芯筒与外筒之间,相邻两层螺旋状换热管旋向相反,并采用一定形状的定距元件使之保持一定间距。层与层间换热管反向缠绕,极大…

解决python import时ModuleNotFoundError异常

文章目录 前言 一 import索引机制二 ModuleNotFoundError原因及其解决办法1. 模块,包名字错误2. 模块,包未导入或未安装3. 模块,包命名冲突4. 模块,包路径不在import索引范围内(常见且重点) 前言 在学习和使用python import xxx时…

“改进型”Howland 电流泵电路

“改进型”Howland 电流泵电路 “改进型”Howland 电流泵是一种使用差分放大器在分流电阻器 (Rs) 上施加电压的电路,从而产生能够驱动大范 围负载电阻的双极性(拉电流或灌电流)压控电流源。 设计注释 确保运算放大器的输入端(V…

Spring应用如何打印access日志和out日志(用于分析请求总共在服务耗费多长时间)

我们经常会被问到这样一个问题。你接口返回的好慢呀,能不能提升一下接口响应时间啊?这个时候我们就需要去分析,为什么慢,慢在哪。而这首先应该做的就是确定接口返回时间过长确实是在服务内消耗的时间。而不是我们将请求发给网关或…