likes
comments
collection
share

这是 Python,而这是你熟悉的网站

作者站长头像
站长
· 阅读数 33

这是一篇关于爬虫的文章,当然这篇文章并不是教大家去写爬虫程序,当然有兴趣的也可以学习一下有关爬虫和反爬虫的知识。

另外我还搭建了个网站,此次爬取文章的目的就是为了丰富网站的内容。防止我那弱不禁风、一碰即碎的网站被不怀好意之人给噶了,所以网址我就不透露给大家了。

1. 寻找目标

2. 分析网页

首先我们要获取的是文章的数据,所以我们随便点击一篇文章,并开启开发者工具,点击刷新,点击网络(Network)选项卡中,然后点击 Fetch/XHR,这样我们能指定获取的是通过 Fetch 或者是 XHR 来发起的请求。

这是 Python,而这是你熟悉的网站

而首页的随机推送正好符合我们的需求,所以下面我们还要爬取首页的内容。

在首页打开开发者面板,点击刷新,在网络(Network)选项卡中,在过滤器输入框中输入 recommend_all_feed 关键词,我们可以找到这样一条信息。它的响应内容与主页上的推荐文章对应。这就是我们要找的请求,应该重点关注。

这是 Python,而这是你熟悉的网站

观察返回的数据结构。其中有文章的 ID、还有摘要,以及作者的信息。返回的文章的总条数为 20 条,多出来的两条是因为插入了 item_type: 14 的这两条数据,这个我们应该将其忽略。

这是 Python,而这是你熟悉的网站

3. 编写爬虫

首先是爬取首页的随机推送文章数据。我下面这段代码是 GPT 生成的,稍作修改得到的。

def getArticleInfo():
    response = requests.post(url=url, params={
        "aid": 2608,
        "uuid": 7308645204243498534,
        "spider": 0,
    }, json={
        "client_type": 2608,
        "cursor": "0",
        "id_type": 2,
        "limit": 20,
        "sort_type": 200
    })

    # 检查请求是否成功
    if response.status_code == 200:
        data = json.loads(response.content)
        infos = data["data"]
        ids = []
        for i in range(0, len(infos)):
            if infos[i]["item_type"] != 2:
                continue
            info = infos[i]["item_info"]["article_info"]

            # 获取文章的标题、ID 和摘要
            ids.append({
                "title": info["title"],
                "article_id": info["article_id"],
                "brief_content": info["brief_content"],
            })
        return ids
    else:
        # 请求失败,打印错误信息
        print(f'请求失败,状态码:{response.status_code}')

在上面出现了三个字段,是我们通过分析后端接口返回的 JSON 数据得出的,其中 brief_content 是文章的摘要。

获取到了文章的 ID 之后,我们还要再请求获取文章数据的接口。由于文章的内容是在 HTML 标签中的,所以我们也只能获取到带有 HTML 标签的内容,因为我们通常会将其渲染在浏览器中进行浏览,同时为了保持文章的格式。

def getArticleContent(article_id):
    response = requests.get(url=f'{article_url}{article_id}', json={
        "cursor": "0",
        "id_type": 2,
        "item_id": str(article_id),
        "limit": 15,
        "referer": "",
        "user_id": "1442193974505742"
    })

    soup = BeautifulSoup(response.content, 'lxml')

    article_tag = soup.find(id="article-root")
    if article_tag is None:
        raise Exception("爬虫被发现了!")
    article_all_tags = article_tag.find_all(True)

    # 遍历文档中的所有标签
    for tag in article_all_tags:  # True 表示匹配所有标签
        # 遍历标签的所有属性
        for attr in list(tag.attrs):
            # 检查属性名是否以 'data-' 开头
            if attr.startswith('data-'):
                # 删除以 'data-' 开头的属性
                del tag[attr]

    return str(article_tag)

解释一下,其中在返回的 HTML 文档中有一个 id 为 article-root 的标签,这个标签是文章的内容的根标签,我们直接保存这个标签及下的子标签即可。

另外你还会看到删除 data- 开头的属性的代码,这是因为这些属性在我们的网页中并没有用处。因为我们的并不具备原网页的 css 或 script,并不能使其发挥作用。

获取到文章数据后,你可以将其保存到数据库中或者直接将返回的 HTML 文档写入到本地的 HTML 文件中进行保存。

下面是源代码,稍作修改即可运行

转载自:https://juejin.cn/post/7359077619726680105
评论
请登录