一个非常优质的个人博客文章抓取 -- 安志合

一个非常优质的个人博客文章抓取 -- 安志合

redballoon
2022-10-09 / 0 评论 / 14 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年02月20日,已超过36天没有更新,若内容或图片失效,请留言反馈。

介绍;

逛GitHub时发现的一个博客,网站文章数量很多,内容也很友好.python学习基础到进阶都有,案例都是通俗易懂的.

环境使用:

  • Python 3.8
  • Pycharm

模块使用:

import requests
from fake_useragent import UserAgent
import os.path
from lxml import etree
import re

实现思路:

  1. 定位想要获取的内容页面,F12 打开开发者工具,判断要请求的下一页的链接地址规律
  2. 确认要爬取的信息页面后,requests发送请求,获取响应结果
  3. 这里我用xpath来提取文章内容的链接和标题信息
  4. 再次请求,获取响应
  5. 解析响应内容,因为是获取文章内容html的数据,这里我换re了,比较方便些
  6. 自定义一个html的<!DOCTYPE>骨架页面,可以外部定义一个文件再引用 通过format传递html的数据
  7. 保存文件到指定文件夹就好了

代码如下:

# -*- coding:utf-8 -*-
# @Author:🎈RedBalloon
# @Time:2022/10/9-8:43
# @File:spider.py

import requests
from fake_useragent import UserAgent
import os.path
from lxml import etree
import re

for page in range(1, 3):  # 获取的页数 1-2
    url = f'https://chegva.com/tag/python/page/{page}/'
    headers = {
        'User-Agent': UserAgent().random,
    }
    requests.packages.urllib3.disable_warnings()
    response = requests.get(url=url, headers=headers, verify=False)
    response.encoding = response.apparent_encoding
    html = response.text
    #初始化etree对象
    dom_tree = etree.HTML(html)
    # 定位文章的内容(同提取 li元素一样)
    articles = dom_tree.xpath('//*[@id="content"]/article')
    # print(articles)
    for contents in articles:
        links = contents.xpath('./header/h2/a/@href')[0]
        titles = contents.xpath('./header/h2/a/text()')[0]
        # 因为 xpath 解析出是以列表返回,通过取下标来转为字符串
        # print(titles, links)
        # 请求获取到的文章页的链接
        detail_page = requests.get(links, headers=headers).text
        # 通过re提取需要的html数据
        info_data = re.findall(r'</a></span></header>(.*?)<div class="open-message"', detail_page, re.S)[0]
        info_html = info_data.replace('    ', '')

        # 自己新建一个文件
        import html
        html_data = html.html_info.format(title=titles, article=info_data)
        # 创建文件夹来保存
        folder_name = 'python基础'
        html_data_path = f'{folder_name}\\'
        if not os.path.exists(html_data_path):
            os.mkdir(html_data_path)

        with open(html_data_path + titles + '.html', mode='w', encoding='utf-8')as f:
            f.write(html_data)
        print(f'保存完毕******{titles}******')

这是自定义的 html

html_info = """<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{title}</title>
</head>
<body>
{article}
</body>
</html>
"""

运行结果:

Snipaste_2022-10-09_16-32-37.png
Snipaste_2022-10-09_16-33-15.png

0

评论 (0)

取消