Python 利用Selenium爬取嵌入网页的PDF(web embedded PDF)

这篇具有很好参考价值的文章主要介绍了Python 利用Selenium爬取嵌入网页的PDF(web embedded PDF)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:

在下载欧洲专利局Global Dossier中的专利审查文件时,想到可以利用Python批量下载,省去一些重复劳动的时间。以下载一篇美国专利(US2021036638A1)的审查档案为例,该专利的审查档案地址为:European Patent Register

探索记录:

初涉Python,本人是个纯纯的小白,爬虫也是看入门书籍了解到了皮毛😅,因此也是走一步看一步,出现问题自己慢慢在网上找答案。经过大量试错,最终总结了下方的探索历程,要是有大佬能够看出有啥更方便的渠道,还望不吝赐教。

1.Ajax异步加载应对方式:

进入审查档案网址European Patent Register,按F12打开开发者工具后,发现文件位置处于<tbody>下的<tr标签中>

python爬取pdf网页,selenium,pdf,python,爬虫

 但是采用request+beautifulsoup模块的方式解析网站时,并不能正确地解析出该网站的内容。经过在网上的查找,应该是这个网站采用了Ajax技术异步加载,也就是我们要解析的内容不是网页原本存在的,而是后期加载进网页中的,简单的request+beautifulsoup的组合拳无法解析ajax加载的内容(个人浅薄的理解,英语专业的我也不知道Ajax技术具体是啥😤,本段解释仅供参考。)

那么,如何解析Ajax加载的内容呢?又经过查询,Ajax的请求位置可以通过开发者工具中的【网络】查看。实际加载的部分就是下图红框的部分。

python爬取pdf网页,selenium,pdf,python,爬虫

 双击打开后,可以看到它请求的网址是:https://register.epo.org/retrievetoc?apn=US.201916968098.A&d-16544-s=0&d-16544-o=1&lng=en

 python爬取pdf网页,selenium,pdf,python,爬虫

打开这个网址后,可以看到里面的内容是这样的python爬取pdf网页,selenium,pdf,python,爬虫

 此时我们再用request+beautifulsoup就可以解析这个网站啦✌。

2.利用Selenium下载嵌入网页的PDF

解析网站后,我遇到了第二个问题,即这个网站中的文件链接并不是以'.pdf'结尾的链接,也就是我无法用request.get()的方式来直接访问下载PDF。于是我又进入了疯狂查找相关信息阶段。

python爬取pdf网页,selenium,pdf,python,爬虫

 最后,我发现Stack Overflow中有大量的关于此类PDF下载的处理方法,其中大多数都是采用禁用谷歌浏览器的“PDF Viewer”并设置PDF总是在外部打开的方式下载嵌入网页的PDF(web embeded PDF)。于是我也依样画葫芦,照着站内大佬的代码修改了一下(原代码网址:Downloading a PDF using Selenium, Chrome and Python - Stack Overflow)。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

def download_pdf(url):
	download_dir=r'文件下载地址'
	chrome_options = Options()
	chrome_options.add_experimental_option('prefs',  {
    	"download.default_directory": download_dir,	
    	"download.prompt_for_download": False,
    	"download.directory_upgrade": True,
    	"plugins.always_open_pdf_externally": True	#PDF始终在外部打开
    	}
	)
	#chrome_options.add_experimental_option('detach', True)  #webdriver打开浏览器后保持开启,一般用于测试出错用
	driver = webdriver.Chrome(options=chrome_options)
	driver.get(url)

url=r"https://register.epo.org/documentView?number=US.202217672556.A&documentId=LL16AX4LGREENX1"
download_pdf(url)

 运行上述代码后,我得到了如下网页:

python爬取pdf网页,selenium,pdf,python,爬虫

 捏麻的这不还是不行嘛👿。PDF Viewer确实被禁用了,但是没有像我想象的一样PDF文件会直接下载到我指定的文件夹中。当然也有可能是我后面少了一些代码导致没有下载文件。于是我又开始查了。

3.爬虫之Iframe

上方网页中我看到了正中间醒目的【打开】按钮,我点击了一下发现直接就开始下载PDF文件了。自然而然我想到能不能用webdriver的click()来触发下载按钮。

python爬取pdf网页,selenium,pdf,python,爬虫

在开发者工具中按钮对应的id是"open-button",于是我写了下方代码:

 driver.find_element(by=By.ID,value='open-button').click()

结果出现了no such element: Unable to locate element:的报错。

怎么会事呢?我继续百度一下,然后找到了下面老哥的文章。

Python Selenium 元素定位正确,但始终报找不到元素错误Message: no such element: Unable to locate element: {“method“:xxx}_番茄Salad的博客-CSDN博客

大佬文章中提到了iframe,解释说“如果有嵌套的iframe的话,需要一层一层的从主页面逐层进入了。” iframe这不就是我上面网页button标签的父标签名嘛,因此我在代码前加入了大佬提到的driver.switch_to.frame("myIframe")。果然后面的代码顺利运行。至此在欧专局爬取PDF审查档案的目标就算成功了。至于文件命名及遍历下载可以在最初的ajax网页中分析文件名来实现。在此就不赘述了。

总结:

首先,是上述代码的汇总:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

def download_pdf(url):
	download_dir=r''
	chrome_options = Options()
	chrome_options.add_experimental_option('prefs',  {
    	"download.default_directory": download_dir,	
    	"download.prompt_for_download": False,
    	"download.directory_upgrade": True,
    	"plugins.always_open_pdf_externally": True	#PDF始终在外部打开
    	}
	)
	chrome_options.add_experimental_option('detach', True)  #webdriver打开浏览器后保持开启
	driver = webdriver.Chrome(options=chrome_options)
	driver.get(url)
	driver.switch_to.frame("myIframe")	#由于PDF始终在外部打开,打开PDF文件地址后不会显示PDF,而会出现“打开”按钮,该按钮在iframe中。本句将driver转到Iframe中
	driver.find_element(by=By.ID,value='open-button').click()	#定位Iframe中的按钮标签,并点击下载

再叠个甲:本人为Python新手,使用python主要是为了方便个人工作,并不是专业的编程人员。代码编写可能会有形式不规范的地方,望各位观众海涵。

最后再感谢一下番茄Salad老哥提供的Iframe解决方法。本来是没打算写这种班门弄斧的文章的,但是国内论坛上好像没有免费的对该类问题比较综合的回答,故写了一下,也方便自己日后参考。文章来源地址https://www.toymoban.com/news/detail-744661.html

到了这里,关于Python 利用Selenium爬取嵌入网页的PDF(web embedded PDF)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python使用Selenium Webdriver爬取网页所有内容

    有时候,我们在用urllib或者requests库抓取页面时,得到的html源代码和浏览器中看到的不一样。这将是我们面临的一个非常常见的问题。现在网页越来越多地采用Ajax、前端模块化工具来构建,整个网页可能都是由JavaScript渲染出来的,也就是说原始的HTML代码可能就是一个空壳,

    2023年04月08日
    浏览(49)
  • Python爬虫|使用Selenium轻松爬取网页数据

    1. 什么是selenium? Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样。支持的浏览器包括IE,Firefox,Safari,Chrome等。 Selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用

    2024年02月04日
    浏览(58)
  • python爬虫实战 scrapy+selenium爬取动态网页

    最近学习了scrapy爬虫框架,想要找个目标练练手。由于现在很多网页都是动态的,因此还需要配合selenium爬取。本文旨在记录这次学习经历,如有疑问或不当之处,可以在评论区指出,一起学习。 对scrapy不了解的同学可以阅读这篇文章 爬虫框架 Scrapy 详解,对scrapy框架介绍的

    2024年02月07日
    浏览(83)
  • 华纳云:Python中如何使用Selenium爬取网页数据

    这篇文章主要介绍“Python中如何使用Selenium爬取网页数据”,在日常操作中,相信很多人在Python中如何使用Selenium爬取网页数据问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中如何使用Selenium爬取网页数据”的疑惑有所帮助!接下

    2024年02月07日
    浏览(69)
  • 20230908_python练习_selenium模块爬取网页小说练习

    霍比特人小说爬取,使用 selenium 模块调用谷歌浏览器,无界面模式爬取小说网站信息,将数据按照每次2000字符在mysql中保存。

    2024年02月07日
    浏览(59)
  • Python网络爬虫逆向分析爬取动态网页、使用Selenium库爬取动态网页、​编辑将数据存储入MongoDB数据库

    目录 逆向分析爬取动态网页 了解静态网页和动态网页区别 1.判断静态网页  2.判断动态网页  逆向分析爬取动态网页 使用Selenium库爬取动态网页 安装Selenium库以及下载浏览器补丁 页面等待  页面操作 1.填充表单 2.执行JavaScript 元素选取 Selenium库的find_element的语法使用格式如下

    2024年02月15日
    浏览(119)
  • python通过selenium爬取网页信息,python获取浏览器请求内容,控制已经打开的浏览器

    背景:通过python中直接get或者urlopen打开一些有延迟加载数据的网页,会抓取不到部分信息。 1. 命令行打开chrome,并开启调试端口 (前提,找到chrome安装目录,找到chrome.exe所在路径,添加到环境变量中,例如我的是C:Program FilesGoogleChromeApplication) remote-debugging-port指定远程调试

    2024年02月16日
    浏览(81)
  • python爬虫进阶篇:Scrapy中使用Selenium模拟Firefox火狐浏览器爬取网页信息

    接着上一篇的笔记,Scrapy爬取普通无反爬、静态页面的网页时可以顺利爬取我们要的信息。但是大部分情况下我们要的数据所在的网页它是动态加载出来的(ajax请求后传回前端页面渲染、js调用function等)。这种情况下需要使用selenium进行模拟人工操作浏览器行为,实现自动化

    2024年02月04日
    浏览(78)
  • python利用selenium获取网页head中的title

    工作中有批量获取网页head中title的应用场景,实践中遇到了一些问题,以此记录一下。 通过检查发现网页的head中的title确实有文本,但是使用selenium的driver.title提取到了空字符串’’ 接着使用driver.find_element(By.XPATH, ‘/html/head/title’).is_displayed(),得到False,说明title被隐藏了

    2024年02月13日
    浏览(45)
  • selenium爬取网页内容,对网页内容进行点击

    所需要的库 首先明确所要爬取的网页,选择调用方法,增加无界面模式的无头参数,然后调用,获取网址,使页面放大,为最大化窗口 获取数据运用XPATH函数,将获取的数据作为item,运用XPATH函数获取,   模仿人点击下一页,运用 for语句,每10个一点,停留5秒 同样寻找下一

    2024年01月17日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包