Python基础爬虫爬取网站内容转化为pdf

首先需要下载一些必要的pip库

pip install requests
pip install beautifulsoup4
pip install pdfkit

下载wkhtmltopdf,这个工具作用就是将HTML转化为pdf的核心软件

下载链接:链接 

下载位置最好固定在一个没有中文的位置,这样可以省去许多麻烦。 我的位置如下

 

 程序源代码如下(GUI)

#htmltopdf.py

import tkinter as tk
from tkinter import messagebox, filedialog
import requests
from bs4 import BeautifulSoup
import pdfkit
import os

current_dir = os.path.dirname(os.path.abspath(__file__))
path_wkhtmltopdf = os.path.join(current_dir, 'datas', 'bin', 'wkhtmltopdf.exe')
# 检查路径是否存在,这里主要是为相对路经,到时候好直接打包程序

if not os.path.exists(path_wkhtmltopdf):
    raise FileNotFoundError(f"Cannot find wkhtmltopdf executable at: {path_wkhtmltopdf}")

# 创建 pdfkit 配置
config = pdfkit.configuration(wkhtmltopdf=path_wkhtmltopdf)

# 定义检查网站可访问性的函数
def check_url():
    url = url_entry.get()
    try:
        response = requests.get(url)
        if response.status_code == 200:
            messagebox.showinfo("成功", "网站可访问!")
        else:
            messagebox.showerror("错误", "网站不可访问,状态码:" + str(response.status_code))
    except Exception as e:
        messagebox.showerror("错误", f"无法访问该网站,错误信息:{e}")


# 定义检查网站编码的函数
def get_encoding():
    url = url_entry.get()
    try:
        response = requests.get(url)
        encoding = response.apparent_encoding  # 自动检测网页编码
        encoding_entry.delete(0, tk.END)
        encoding_entry.insert(0, encoding)
        messagebox.showinfo("成功", f"检测到网站编码为:{encoding}")
    except Exception as e:
        messagebox.showerror("错误", f"无法获取编码,错误信息:{e}")


# 定义转换为 PDF 的函数
def generate_pdf():
    url = url_entry.get()
    div_query = div_entry.get()
    output_encoding = pdf_encoding_entry.get()

    # wkhtmltopdf 配置路径
    current_dir = os.path.dirname(os.path.abspath(__file__))
    path_wkhtmltopdf = os.path.join(current_dir, 'datas', 'bin', 'wkhtmltopdf.exe')
    # 检查路径是否存在,这里主要是为相对路经,到时候好直接打包程序
    
    config = pdfkit.configuration(wkhtmltopdf=path_wkhtmltopdf)

    # 爬取网页内容
    try:
        response = requests.get(url)
        response.encoding = encoding_entry.get()  # 使用用户输入的编码
        html_content = response.text
        soup = BeautifulSoup(html_content, 'html.parser')
        div_content = soup.find(**eval(div_query))  # 使用 eval 将输入的字典转为 Python 表达式
        if div_content is None:
            messagebox.showerror("错误", "未找到目标 div 内容")
            return
        html_str = str(div_content)

        # 选择保存位置和文件名
        file_path = filedialog.asksaveasfilename(defaultextension=".pdf", filetypes=[("PDF files", "*.pdf")],initialfile="htmlto.pdf")
        if not file_path:
            return

        # 生成 PDF
        options = {
            'encoding': output_encoding,
            'enable-local-file-access': None
        }
        pdfkit.from_string(html_str, file_path, configuration=config, options=options)
        messagebox.showinfo("成功", f"PDF 文件成功保存到:{file_path}")
    except Exception as e:
        messagebox.showerror("错误", f"生成 PDF 失败,错误信息:{e}")


# 创建主窗口
root = tk.Tk()
root.title("网页转PDF工具")

# 第一行:输入网址
tk.Label(root, text="输入网址:").grid(row=0, column=0, padx=10, pady=5)
url_entry = tk.Entry(root, width=50)
url_entry.grid(row=0, column=1, padx=10, pady=5)
tk.Button(root, text="检查网址", command=check_url).grid(row=0, column=2, padx=10, pady=5)

# 第二行:编码检测
tk.Label(root, text="网页编码:").grid(row=1, column=0, padx=10, pady=5)
encoding_entry = tk.Entry(root, width=50)
encoding_entry.grid(row=1, column=1, padx=10, pady=5)
tk.Button(root, text="检测编码", command=get_encoding).grid(row=1, column=2, padx=10, pady=5)

# 第三行:输入要爬取的div
tk.Label(root, text="输入div选择器:").grid(row=2, column=0, padx=10, pady=5)
div_entry = tk.Entry(root, width=50)
div_entry.grid(row=2, column=1, padx=10, pady=5)
tk.Label(root, text="示例: {'class': 'main-warpper'}").grid(row=2, column=2, padx=10, pady=5)

# 第四行:输入PDF编码
tk.Label(root, text="PDF文件编码:").grid(row=3, column=0, padx=10, pady=5)
pdf_encoding_entry = tk.Entry(root, width=50)
pdf_encoding_entry.insert(0, 'UTF-8')  # 默认设置为UTF-8
pdf_encoding_entry.grid(row=3, column=1, padx=10, pady=5)

# 最后一行:生成PDF按钮
tk.Button(root, text="生成PDF", command=generate_pdf).grid(row=4, column=1, padx=10, pady=20)

# 启动主循环
root.mainloop()

具体步骤 

代码如上应该不需要更该,一下是具体步骤,步骤对了代码就不会报错 ,注意:htmltopdf.py就是我们的Python程序,位置最好和我差不多

 

这个datas就是安装了 wkhtmltopdf这个软件的位置,如图,我只是把本来叫wkhtmltopdf的这个文件夹名字改为了datas

 开始打包程序

这个时候就可以打包python代码为一个exe可执行文件了,我们可以为这个exe文件增加一个图标(不是必须的,看自己),最好放在python程序同一个文件夹里,或者和它同级的文件夹下的文件夹内,比如我是在同级创建了一个imgs文件夹,如图

在里面弄一个图片文件,文件后缀改为.ico (图标作用的) ,我这个是logo.ico

这个时候可以开始打包了,打包之前安装pyinstaller库,方法

pip install pyinstaller

 打包方法:在python文件处输入图cmd

按下enter键,进入cmd

输入打包指令:

 注意:后面的-i ./imgs/logo.ico 不是必要的,如果你不想要图标,这个就不是必须的。

我的指令如下

pyinstaller -D -w htmltopdf.py -i ./imgs/logo.ico

 后续操作

现在还不行,接着移动文件位置,把之前python文件位置的datas文件夹移动到打包后的html_to_pdf\html_to_pdf\dist\htmltopdf\_internal文件里面,如下2张图片

开始使用

打开html_to_pdf\html_to_pdf\dist\htmltopdf\htmltopdf.exe文件,这就是我们的可执行文件

说明一下:这个有部分html是用不了的,比如csdn就难搞,一般还是可以

使用教程

以爬取百度百科里的湖南大学为例,我们爬取黑色线条以内的内容,黑色的叉叉不用

首先,在浏览器里按下F12

按下这个定位键,如图

 

 在网站出选中我们要用的界面,如图,再单击鼠标左键即可定位到html代码,如画黑线的地方

将网站复制下载,如

湖南大学_百度百科

再将那个定位的div复制下来

<div class="mainContent_ZCTL5">

 把它改为{'class':'mainContent_ZCTL5'},放入软件,如下

点击生成pdf,随便保存在一个位置,保存好后,成果如下(比较接近网站)

 网站内容如下

大差不差。哈哈

新人投稿,欢迎批评指正

<think>好的,用户问的是Python爬虫爬取的数据类型,我需要详细解释常见的几种类型,并且用例子说明。首先,用户可能是刚开始学爬虫,需要了解数据的基本类型,方便后续处理。 首先,文本数据应该是最常见的,比如HTML、JSON、XML。HTML是网页结构,用BeautifulSoup解析。JSON常用于API,转成字典处理。XML虽然不如以前流行,但仍有使用,可以用lxml或ElementTree解析。 然后是二进制数据,比如图片、视频、PDF。这些需要以字节流保存,比如用requests库的content属性获取,然后写入文件。用户可能需要处理下载文件的情况,这部分要说明清楚。 结构化数据,比如表格,用pandas直接提取表格数据转成DataFrame,方便分析。非结构化数据,比如文本中的信息,需要正则表达式或自然语言处理来提取,这部分用户可能需要进一步学习的建议。 数据存储部分,用户可能想知道爬下来后怎么存,可以提到数据库、CSV、Excel等,但具体方法可能需要另讲,这里简单带过。 需要确保例子准确,比如用requests.get获取响应,区分text和content,json()方法的应用。注意提醒用户遵守网站规则,避免法律问题,这部分虽然不是数据类型,但属于注意事项,有必要提及。 总结时,分点列出类型,每种类型的特点和处理方式,帮助用户清晰理解。可能用户后续会根据数据类型选择不同的处理工具,所以这部分信息对他们很重要。</think>Python爬虫爬取的数据主要有以下几种类型,我将从处理方式和结构特点两方面为你解析: 1. **文本类数据** - **HTML文本**:最常见的数据类型,通过`requests`库获取原始HTML响应,需用`BeautifulSoup`或`lxml`解析 ```python import requests from bs4 import BeautifulSoup response = requests.get('https://example.com') html = response.text # 获取文本内容 soup = BeautifulSoup(html, 'html.parser') ``` - **JSON数据**:常见于API接口,可直接转换为Python字典 ```python api_data = requests.get('https://api.example.com/data').json() ``` - **XML数据**:处理方式类似HTML,但需要特定解析器 ```python import xml.etree.ElementTree as ET xml_data = ET.fromstring(response.content) ``` 2. **二进制数据** - 图片文件:`jpg/png/gif`等格式 - 音视频文件:`mp3/mp4`等格式 - 文档文件:`pdf/docx`等格式 ```python # 下载图片示例 img_data = requests.get('https://example.com/image.jpg').content with open('image.jpg', 'wb') as f: f.write(img_data) ``` 3. **结构化数据** - 表格数据:可通过`pandas`直接解析HTML表格 ```python import pandas as pd tables = pd.read_html(html) ``` - 数据库格式数据:JSON/CSV等标准化格式 4. **非结构化数据** - 自然语言文本:需要NLP技术处理 - 混杂数据:需用正则表达式提取 ```python import re emails = re.findall(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', html) ``` **数据存储方式**: - 临时存储:内存中的列表/字典 - 持久化存储:数据库(MySQL/MongoDB)、文件(CSV/Excel)、云存储 **处理要点**: 1. 注意字符编码(常用utf-8) 2. 处理反爬机制(验证码、频率限制) 3. 遵守`robots.txt`协议 4. 数据清洗(去重、缺失值处理) 实际案例:爬取电商网站时可能同时获得 - HTML中的商品描述(文本) - JSON格式的价格信息(结构化数据) - 商品图片(二进制) - 用户评论(半结构化数据) 掌握这些数据类型特征后,可以选择合适的解析库(如`BeautifulSoup`/`Scrapy`/`Selenium`)和存储方案,建议从简单的文本数据入手,逐步处理复杂数据类型。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值