现如今,我想每一个人都会需要从互联网上获取资料,这篇文章抛砖引玉,谈谈自己的方式。要理解本文所有内容,需要你掌握一定的技术水平。至少需要具备 HTML 与 Python 的基础知识。一旦你掌握了,即可触类旁通,利用这些知识解决你工作时些许问题。下面就正式开始吧,所有代码均有注释。

本文用到了一些第三方库,分别是利用 requests 获取网页内容,利用 BeatifulSoup 清洗内容,利用 Click 构建命令行工具。当然,要用这些第三方库首先要安装一下。安装命令如下:

pip install click
pip install requests
pip install beautifulsoup4

安装好了之后,就可以引入这些库,接着就开始愉快的编写代码了。这里以爬取百度文档内容为例讲解。

import click
import requests
from bs4 import BeautifulSoup

# 请求头
headers = {"User-agent": "Baiduspider"}


def get_html_content(url: str) -> str:
    """获取网页中的内容

    Parameters
    ----------
    url : str
        网页链接

    Returns
    -------
    str
        返回网页内容,此时内容包含 HTML 标签等信息
    """

    # 通过网页链接获取内容有概率会出现问题,因此这里使用 try 试着获取内容,如果页面链接有错将会报错误
    try:
        # raw_html 为请求之后返回的所有内容,即整个网页源代码
        raw_html = requests.get(url, headers=headers, timeout=30)
        # 查看访问是否有错误,如果有将会报错,并终止代码执行
        raw_html.raise_for_status()
        raw_html.encoding = raw_html.apparent_encoding
        # 没有错误则返回网页内容
        return raw_html.text
    except:
        # 如果出现错误,返回空字符串
        raise ValueError("发生错误!")


def parse_paragraph_content(raw_html: str) -> list:
    # 从获取的内容中提取出段落,并作为列表返回
    if not raw_html:
        raise ValueError("内容为空,没有获取到任何内容!")

    # 定义一个列表用于接收清洗之后的内容。
    p_list = []

    # 利用标准库中的解析器解析内容,你也可以使用 html5lib 作为解析器。
    soup = BeautifulSoup(raw_html, "html.parser")

    # 添加标题到列表中
    p_list.append(soup.title.string)

    # 循环出网页内容中指定标签属性下面的所有内容
    # 如果你需要爬取其他网页的内容,只要改下面这行代码应该就可以了。
    for div in soup.find_all("div", attrs={"class": "bd doc-reader"}):
        # 将内容添加当列表的后面
        print(div.get_text())
        p_list.extend(div.get_text().split("\n"))

    # 清除掉列表中的空白内容
    p_list = [c for c in p_list if str(c).strip() != ""]
    # 清洗内容所有的换页符,在 Python 中 "\f" 相当于 "\x0c"
    p_list = [c.replace("\x0c", "") for c in p_list]
    return p_list


def create_doc_file(p_list: list, path: str = "document.txt") -> None:
    """创建文档

    Parameters
    ----------
    p_list : list
        接收 parse_paragraph_content 函数中清洗之后的数据
    path : str, optional
        文档路径, by default "document.txt"
    """

    with open(path, "w", encoding="utf-8") as file:
        for str in p_list:
            file.write(str)
            file.write("\n")


@click.command()
@click.option("--url", prompt="文档链接", help="输入百度文库链接!")
@click.option("--path", default="document.txt", help="文档名")
def main(url: str, path: str) -> None:
    # 利用命令行的方式执行代码
    raw_html = get_html_content(url)
    p_list = parse_paragraph_content(raw_html)
    create_doc_file(p_list, path)


if __name__ == "__main__":
    main()

声明:本文所叙述的所有内容,仅作为学习,不可用于商业及违法行为。后果自负。

看看效果。欢迎点赞,转发。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。