初步实现 python 爬取小说,实现不规则页面的翻页爬取

在写爬虫的时候,我们会遇到有的网页链接是不规则的。今天我写爬虫练习的时候,就遇到了这个情况。后来我发现用 lxml 可以很好的去出链接,然后我灵光一闪,就去试了试,果然。把每次找到的链接传给一个成员变量保存,这样就可以直接在下次爬取的时候调用这个变量去访问下一个要爬取的页面了

复制代码
# -*- coding = utf-8 -*-
# @Time : 2021/11/1 17:19
# @Author : 海绵摆摆嘉心糖
# @File : 笔趣阁_一剑独尊.py
# @Software : PyCharm
import time

import requests
import os
from lxml import etree

name = "牛马小说_一剑独尊/"
url_end = "/book/4652/1.html"


def main():
    # 定义首页的 URL
    baseurl = "https://www.biquge7.com"
    get_data(baseurl)


def get_data(baseurl):
    global url_end
    for i in range(2535):
        url = baseurl + url_end
        # 调用请求函数获取网页信息
        html = get_html(url)
        # 对返回的信息进行解析
        xml = etree.HTML(html)
        # 获取章节标题
        h1_title = xml.xpath('.//div[@class="book reader"]/div[@class="content"]/h1[@class="wap_none"]/text()')
        # 获取下一页的链接
        next_href = xml.xpath('.//div[@class="book reader"]/div[@class="content"]/div[@class="Readpage pc_none"]/a[@class="Readpage_down js_page_down"]/@href')
        # 获取正文内容
        text = xml.xpath('//*[@id="chaptercontent"]/text()')
        if not os.path.exists(name):
            print(f"没有{name}这个目录,正在创建>>>>>>>>>")
            os.mkdir(name)
        with open(f"{name}{h1_title[0]}.txt", "w", encoding="utf-8") as file_obj:
            for t in text:
                file_obj.write(f"{t}\n")
        print(f"{h1_title[0]}的爬取已完成,正在进入下一章的爬取>>>>>>>>>>>>>")
        url_end = next_href[0]
        # 休眠一秒后执行
        time.sleep(1)


def get_html(url):
    # 头部信息,告诉服务器你是以什么样的身份去访问它
    user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
    # 定义头部信息
    headers = {"User-Agent": user_agent}
    # 定义一个字符串变量,用来接收网页信息
    html = " "
    try:
        # 用 get 的方式请求网页
        response = requests.get(url=url, headers=headers)
        # 如果出现异常主动报出异常
        response.raise_for_status()
        # 解码
        html = response.content.decode("utf-8")
    except requests.RequestException as e:
        # 打印异常信息
        print(e)
    return html


if __name__ == '__main__':
    main()
    print("end>>>>>")
复制代码

 

posted on   一颗蛋50斤  阅读(1262)  评论(4编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示