【科研数据获取】将仅支持在线浏览的国家标准下载到本地并保存为pdf文件

时间:2024-09-30 18:07:48

将仅支持在线浏览的国家标准下载到本地并保存为pdf文件

  • 1 需求
  • 2 需求解析
  • 3 需求实现
  • 5 文件使用小技巧

本文声明: 文章的梳理只是为了方便自己进行标准的下载,研究学习之用,方便保存代码,不用作其它用途。

手动反爬虫,禁止转载:原博地址 /lys_828/article/details/118079959

 知识梳理不易,请尊重劳动成果,文章仅发布在****网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息
  • 1

1 需求

有时候在写文章或者做项目的时候,经常需要一些国家的法律法规作为支撑,因此对于很多搞管理的小伙伴对于国家标准全文公开系统就会很熟悉,特别是一些最新更新的法规标准,但是有些强制性国家标准仅支持在线阅读,有时候不再电脑前面或者断网工作是需要用到这些标准,于是就有了想把文件下载到本地需求
在这里插入图片描述

2 需求解析

注意事项:

这种法律标准会有很多网站进行注册账号或者冲会员积分进行购买(这种行为是侵权的),但是需要注意对于法律法规的使用,国家标准全文公开系统网站中对使用要求有着特别声明,如下。
在这里插入图片描述
实现思路: 找到对应标准的预览文件,然后分页进行截图生成pdf文件,最后将各pdf文件汇总生成整个标准

需要安装第三方的模块: selenium,pypdf2,pyscreenshot。其中第一个模块是进行人为模拟浏览器操作,具体的安装和使用可以参照【window下Selenium介绍、安装以及简单调试】【mac下Selenium介绍、安装以及简单调试】,第二个模块进行pdf文件的操作,第三个模块是进行屏幕截图的操作并保存文件

3 需求实现

(1)首先导入要使用到的python模块

from selenium import webdriver
import  warnings
warnings.filterwarnings('ignore')
import time
import os
import pyscreenshot
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

(2)确定要下载的国家标准,比如这个肥料标识 内容和要求,当前查看时还是属于只能在线预览
在这里插入图片描述
(3)打开目标网址,然后最大化窗口后刷新

browser = webdriver.Chrome(r'C:\Program Files\Google\Chrome\Application\')
browser.get('http://c./bzgk/gb/showGb?type=online&hcno=A56EA988D46AF4575B36E0585E44D220')

browser.maximize_window()
browser.refresh()
  • 1
  • 2
  • 3
  • 4
  • 5

输出结果为:(注意左上角显示正在受控制,需要等待所有界面都加载完毕)
在这里插入图片描述
(4)获取所有页码,调整截图页面的大小

total_page_num = browser.find_element_by_xpath('//*[@]').text.split('/ ')[-1]
total_page_num
  • 1
  • 2

输出结果为:
在这里插入图片描述
然后将界面调整至自适应位置

browser.find_element_by_xpath('//*[@]').click()
  • 1

输出结果为:(上面的标签就是定位“适合页面”所在的位置)
在这里插入图片描述
然后就是确定这个页面在电脑窗口的位置,这里有个小技巧:利用qq或者微信截图,将鼠标从最左上方拖拉至文件的左上角,这样就能得到文件的最初位置,如下,其中的POS就是对应的初始位置(大致确定,然后可以截取一个后看看结果进行微调)
在这里插入图片描述
文件结束的位置的操作也是相同的定位方式,由此就能找到要截图文件所在电脑中的具体位置

(5)分页截图,保存pdf文件

由于要保存文件,所以养成一个好习惯,当会生成多个文件的时候,先创建一个单独的文件夹进行文件的保存

if not os.path.exists('测试'):
    os.mkdir('测试')
  • 1
  • 2

然后就开始进行逐页点击,逐页保存,由于直接加载完成后就是第一页,所以就先执行逐页保存,保存完毕后再点击下一页,依次进行循环

for i in range(int(total_page_num)):
    im = pyscreenshot.grab(bbox = (634,148,1270,1039))
    im.save(f'测试\demo{i}.pdf')#直接整成pdf
    browser.find_element_by_xpath('//*[@]').click()
  • 1
  • 2
  • 3
  • 4

输出结果如下:(很完美的将所有的页面的内容均进行截屏下载为pdf文件了)
在这里插入图片描述
(6)进行pdf文件合并

from PyPDF2 import PdfFileReader,PdfFileWriter

pdf_writer = PdfFileWriter()
for page in range(int(total_page_num)):
    pdf_reader = PdfFileReader("测试/demo{}.pdf".format(page))
    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))
    
with open("", "wb") as out:
    pdf_writer.write(out)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

输出结果为:(最终将所有的pdf文件进行合并完成了,只有一个小问题就是文件的清晰度有所衰减)
在这里插入图片描述
可能是由于截图保存pdf导致文件清晰度衰减了,然后也尝试了直接将截图的结果保存为png图片的格式,然后再通过其它的方式转为pdf,最后结果发现通过商用软件把png图片或者python程序将png图片转为pdf文件都是最开始直接存pdf文件的结果一致,主要是中间截图生成图片的清晰度衰减了,并不是转pdf过程中衰减了

#这一部分是测试的
for i in range(int(total_page_num)):
    im = pyscreenshot.grab(bbox = (634,148,1270,1039))
    im.save(f'测试\demo{i}.png')
    doc = fitz.open()
    imgdoc = fitz.open(f'测试\demo{i}.png')
    pdfbytes = imgdoc.convertToPDF()
    imgpdf = fitz.open("pdf", pdfbytes)
    doc.insertPDF(imgpdf)
    doc.save( f'测试\demo{i}.pdf')
    doc.close()
    browser.find_element_by_xpath('//*[@]').click()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

验证如下,使用合适页面进行截图效果
在这里插入图片描述
使用200%显示截图效果如下,答案很明显,下面的清晰度要高很多,但是调整到200%就不方便进行按页进行截图的操作
在这里插入图片描述
4 全部代码

from selenium import webdriver
import  warnings
warnings.filterwarnings('ignore')
import time
import os
import pyscreenshot

browser = webdriver.Chrome(r'C:\Program Files\Google\Chrome\Application\')
browser.get('http://c./bzgk/gb/showGb?type=online&hcno=A56EA988D46AF4575B36E0585E44D220')

browser.maximize_window()
browser.refresh()

total_page_num = browser.find_element_by_xpath('//*[@]').text.split('/ ')[-1]
total_page_num

browser.find_element_by_xpath('//*[@]').click()

if not os.path.exists('测试'):
    os.mkdir('测试')

for i in range(int(total_page_num)):
    im = pyscreenshot.grab(bbox = (634,148,1270,1039))
    im.save(f'测试\demo{i}.pdf')#直接整成pdf
    browser.find_element_by_xpath('//*[@]').click()

from PyPDF2 import PdfFileReader,PdfFileWriter

pdf_writer = PdfFileWriter()
for page in range(int(total_page_num)):
    pdf_reader = PdfFileReader("测试/demo{}.pdf".format(page))
    for page in range(pdf_reader.getNumPages()):
        pdf_writer.addPage(pdf_reader.getPage(page))
    
with open("", "wb") as out:
    pdf_writer.write(out)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

5 文件使用小技巧

其实很多的非编辑的文件都可以使用这种方式,就是利用截图文字识别的功能,平时使用的就是有道翻译,自带的有截屏翻译,选中想要编辑的内容,有道翻译会自动进行中文进行英文的转换,这时候不用管它,点击下面的右角的编辑原文
在这里插入图片描述
就可以跳到对应的原文编辑了,这种方式还是每每操作屡试不爽的感觉,真的很好用,然后就可以把框里面的中文复制粘贴到word文档中了,perfect!
在这里插入图片描述
至此,文章就梳理完毕,完结撒花✿✿ヽ(°▽°)ノ✿