用 Python 爬取网页 PDF 和文档

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

1 爬取网页 PDF

以 https://reader.jojokanbao.cn/rmrb 上 PDF 的下载为例

1.1 在日历控件中输入时间

参考博客:selenium+Python(Js处理日历控件)
网页的日期框中可以直接输入日期
python爬取pdf网页,Python 应用,python
找到输入框对应的标签,根据 class name 进行内容清楚和输入(如果标签有 id 属性可以根据 id 进行输入框确定),代码如下

browser.find_element_by_class_name('el-input__inner').clear()
browser.find_element_by_class_name('el-input__inner').send_keys('1976-10-09')

python爬取pdf网页,Python 应用,python
输入日期后需要回车才能刷新页面,使用 selenium 模拟键盘事件参考博客:selenium-模拟键盘事件(回车、删除、刷新等)
实现代码如下

from selenium.webdriver.common.keys import Keys

browser.find_element_by_class_name('el-input__inner').send_keys(Keys.ENTER)

1.2 下载 PDF 文件

使用 selenium 下载 PDF 文件参考博客:python selenium 下载pdf文件
需要将简单的 browser = webdriver.Chrome() 替换为如下代码

# PDF 文件保存路径
down_load_dir = os.path.abspath(".")
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ['enable-automation'])
prefs = {
    "download.default_directory": down_load_dir,
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "plugins.always_open_pdf_externally": True
}
options.add_experimental_option('prefs', prefs)
options.add_argument("--disable-blink-features=AutomationControlled")
browser = webdriver.Chrome(options=options)

1.3 selenium 访问网站被反爬限制封锁

参考博客:python之selenium访问网站被反爬限制封锁解决方法
添加如下代码

browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})

1.4 完整代码

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from bs4 import BeautifulSoup
import os


url = 'https://reader.jojokanbao.cn/rmrb'

down_load_dir = os.path.abspath(".")
options = webdriver.ChromeOptions()
options.add_experimental_option("excludeSwitches", ['enable-automation'])
prefs = {
    "download.default_directory": down_load_dir,
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "plugins.always_open_pdf_externally": True
}
options.add_experimental_option('prefs', prefs)
options.add_argument("--disable-blink-features=AutomationControlled")
browser = webdriver.Chrome(options=options)

browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})

browser.get(url)

browser.find_element_by_class_name('el-input__inner').clear()
browser.find_element_by_class_name('el-input__inner').send_keys('1976-10-09')
# 输入完成后,敲击键盘上的回车键
browser.find_element_by_class_name('el-input__inner').send_keys(Keys.ENTER)
time.sleep(5)

data = browser.page_source
# print(data)
# 获取文档的下载链接
soup = BeautifulSoup(data)
body = soup.find('div', attrs={'class': 'el-col el-col-24 el-col-xs-24 el-col-sm-12 el-col-md-12 el-col-lg-12 el-col-xl-12'})
link = body.find_all("a")[0].get("href")
print(link)

# 有了开始对 options 的设置,这一步可以直接下载 PDF 文档
browser.get(link)
time.sleep(5)
browser.close()

2 爬取网页文档

以 https://www.laoziliao.net/rmrb/ 上的文档下载为例

2.1 遇到的问题

整体实现思路和爬取小说(https://blog.csdn.net/mycsdn5698/article/details/133465660)的一样,实现过程中遇到了一些问题:
(1)BeautifulSoup 怎样获取标签间文本内容
获取标签的某个属性,例如 a 标签的 href 属性,代码如下

data = requests.get(url = url, headers = headers)
data.encoding = 'UTF-8'
soup = BeautifulSoup(data.text, 'html.parser')
body = soup.find('div', attrs={'id': 'month_box'})

for item in body.find_all('a'):
    link = item.get("href")
    print(link)

获取标签间的文本内容
如果标签属性较少,则可以使用正则提取,例子及其代码如下
python爬取pdf网页,Python 应用,python

findTitle = re.compile(r'<h3 class="card-title text-center text-danger">(.*?)</h3>',re.S)

for card in soup.find_all('div', class_="card mt-2"):
    # 提取标题
    card_title = re.findall(findTitle, str(card))[0]
    print(card_title)

如果标签属性较多,则可以参考博客:beautifulsoup怎样获取标签间文本内容,例子及其代码如下
python爬取pdf网页,Python 应用,python

data = requests.get(url = news_link, headers = headers)
data.encoding = 'UTF-8'
soup = BeautifulSoup(data.text, 'html.parser')
for context in soup.find_all('div', class_="card mt-2"):
    # 提取标题
    news_title = context.find('h2').string
    print(news_title)

(2)将 br 标签替换为换行符
例子如下
python爬取pdf网页,Python 应用,python
方法一:使用 get_text()
缺点:br 标签会变成一些空格,而不是换行

for news_context in context.find_all('div', class_="card-body lh-lg"):
    tmp_context = news_context.get_text()
    print(tmp_context)

方法二:参考博客 https://blog.csdn.net/u012587107/article/details/80543977
缺点:str(news_context) 的使用导致 div 标签出现,且 <br> 变成了 <br/>

for news_context in context.find_all('div', class_="card-body lh-lg"):
    tmp_context = (str(news_context).replace('<br>','\n')).replace('<br/>','\n')
    # str(news_context) 的使用导致 <div class="card-body lh-lg"> 和 </div> 也出现了
    tmp_context = (tmp_context.replace('<div class="card-body lh-lg">','')).replace('</div>','')
    # 新闻标题的第一行前是俩Tab,将其替换为四个空格
    tmp_context = tmp_context.replace('  ','    ')
    print(tmp_context)

2.2 完整代码

注意:ANSI 编码的文本在 kindle 打开会有部分乱码,UTF-8 编码的不会

import requests
import re
import time
from bs4 import BeautifulSoup

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'}

findTitle = re.compile(r'<h3 class="card-title text-center text-danger">(.*?)</h3>',re.S)


url = "https://www.laoziliao.net/rmrb/1946-06"

# 获取该月内所有日报的链接
data = requests.get(url = url, headers = headers)
data.encoding = 'UTF-8'
soup = BeautifulSoup(data.text, 'html.parser')
body = soup.find('div', attrs={'id': 'month_box'})

for item in body.find_all('a'):
    link = item.get("href")
    # print(link)
    
    # 根据 link 创建每天报纸的 TXT
    # 提取最后一个斜杠后面的字符
    last_slash_index = link.rfind("/")
    if last_slash_index != -1:
        TXT_name = link[last_slash_index + 1:]
        TXT_name = TXT_name.replace("-", "")
    print(TXT_name)
    # ansi 编码用 kindle 打开有乱码
    with open("./TXTs/"+TXT_name+".txt", "w", encoding='utf-8') as f:
        # 访问每天的报纸
        data = requests.get(url = link, headers = headers)
        data.encoding = 'UTF-8'
        soup = BeautifulSoup(data.text, 'html.parser')
    
        # 每一版的内容都放在 class="card mt-2" 的 div 中
        for card in soup.find_all('div', class_="card mt-2"):
            # 提取标题
            card_title = re.findall(findTitle, str(card))[0]
            f.write(card_title + '\n')
            # print(card_title)
        
            # 提取新闻链接
            news = card.find_all('a')
            news_link = news[0].get('href')
            if "#" in news_link:
                index = news_link.index("#")
            news_link = news_link[:index]
            print(news_link)
            time.sleep(1)

            # 访问当天的每一版新闻,每一条新闻都放在 class="card mt-2" 的 div 中
            data = requests.get(url = news_link, headers = headers)
            data.encoding = 'UTF-8'
            soup = BeautifulSoup(data.text, 'html.parser')
            for context in soup.find_all('div', class_="card mt-2"):
                # # 提取标题
                # news_title = context.find('h2').string
                # print(news_title)
                # 提取新闻内容,存放在 class="card-body lh-lg" 的 div 中
                for news_context in context.find_all('div', class_="card-body lh-lg"):
                    # 把<br>换成换行符
                    tmp_context = (str(news_context).replace('<br>','\n')).replace('<br/>','\n')
                    # str(news_context) 的使用导致 <div class="card-body lh-lg"> 和 </div> 也出现了
                    tmp_context = (tmp_context.replace('<div class="card-body lh-lg">','')).replace('</div>','')
                    # 新闻标题的第一行前是俩Tab,将其替换为四个空格
                    tmp_context = tmp_context.replace('  ','    ')
                    f.write(tmp_context + '\n')
                    # print(tmp_context)
            f.write('\n\n')

3 一些资源推荐

除了上述两个作为例子的网站,还有 时光印记经典珍藏系列,可以免费查看部分资料,全部资料的话是收费的。文章来源地址https://www.toymoban.com/news/detail-758256.html

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

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

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

相关文章

  • 【python脚本系列】python脚本2——PDF转word文档

    只需2行代码,轻松将PDF转换成Word 机器学习算法那些事 2023-05-05 18:58 发表于广东 编辑:数据分析与统计学之美 可将 PDF 转换成 docx 文件的 Python 库。该项目通过 PyMuPDF 库提取 PDF 文件中的数据,然后采用 python-docx 库解析内容的布局、段落、图片、表格等,最后自动生成 docx 文

    2024年02月02日
    浏览(48)
  • 如何利用python将pdf文档转为word?

    1.前言 有些时候,我们需要将pdf文档转换为word文档进行处理,但市面上的一些pdf软件往往需要付费才能使用。那么作为一名技术人员,如何才能实现pdf转word自由? 2.准备工作 提前安装好python的环境,并且安装对应的第三方包: 3.实现方法 3.1 convert方法 3.2 parse方法 3.3 仅转换其

    2024年02月13日
    浏览(50)
  • chatgpt赋能python:Python如何将PDF转换为Word文档

    在现代电脑使用的日常工作中,PDF格式的文档已经变得很普遍。这种文件格式十分方便,但是有时候可能需要将PDF文件转换为Word文档。幸运的是,Python提供了多种方法来实现这个目标。 PDF文档在保留格式和结构方面表现得很好,而且通常具有较小的文件大小。但是,在某些

    2024年02月08日
    浏览(59)
  • Python应用开发——爬取网页图片

    当我们需要从网页上面下载很多图片的时候,一个一个手动保存实在是太累人了。那么有没有批量下载的办法呢? 答案是有的,Python爬虫就可以完美的做到这一点,而且作为一个Python的初学者,我可以很负责任的告诉你,这门语言入门挺简单的,特别是对于那些有其他编程语

    2024年02月02日
    浏览(48)
  • python脚本——批量将word文档转换成pdf文件

    语言:python 3 用法:点击运行后,弹出窗口选择word文档所在文件夹,程序运行后对 该文件夹下所有的word文件 全部转换成pdf文件,生成的pdf文件名字与原wrod文件相同。 如运行中报错,需要自行根据报错内容按照缺失的库 例如: 完整代码如下:

    2024年02月11日
    浏览(64)
  • python读取word/pdf文档,指定文字内容和图片

    任务要求: 将每页需要的内容读取出来放到不同的文件夹,找出含有指定内容的页面创建文件夹,然后把相关的内容和图片放进去。 pdf 读起来比较方便, 按页码读取文件:

    2024年02月12日
    浏览(66)
  • 使用Python将Word文档转换为PDF的方法

    摘要: 文介绍了如何使用Python编程语言将Word文档转换为PDF格式的方法。我们将使用python-docx和pywin32库来实现这个功能,这些库提供了与Microsoft Word应用程序的交互能力。 正文: 在现实生活和工作中,我们可能会遇到将Word文档转换为PDF格式的需求。PDF格式具有广泛的应用,可

    2024年02月14日
    浏览(64)
  • python之PyPDF2:操作PDF文档示例详解

    PyPDF2是一个用于处理PDF文档的Python库。它提供了一系列的功能,使我们能够读取、修改和创建PDF文件。本文将详细介绍PyPDF2库的使用示例,包括读取文档信息、提取文本内容、合并和拆分文档以及添加水印等操作。 首先,我们需要安装PyPDF2库。可以使用以下命令使用pip安装:

    2024年02月11日
    浏览(47)
  • jquery将网页html文档导出为pdf图片

    2024年02月21日
    浏览(32)
  • python实现pdf双页文档转png图片,png图片裁剪为左右两等分,再合并为新的pdf单页文档

    现有pdf双页文档如下: 现按照以下页码次序对pdf双页文档进行裁剪和拼接,其中有两点需要特别注意,一是封面页只裁剪中间部分,二是文档是从右往左的顺序排版的

    2024年02月09日
    浏览(60)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包