python 爬虫实战 | 下载一本小说

该文介绍了Python爬虫的基本步骤,包括从指定网页抓取小说目录页的链接,使用BeautifulSoup解析HTML,获取章节链接,并对每个章节页面进行内容提取,存储到本地文件。文中还提到了处理中文乱码的方法以及模拟用户行为防止被封的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 爬虫几个主要部分

  • 根据链接获取页面信息
  • 从页面信息获取需要的信息:正则匹配,bs4,xpath等
  • 保存:文件、数据库

最难得就是中间匹配部分,要针对每个网站的内容特点和要获取的信息综合选择合适的匹配策略。

其他重要方面:

  • 中文乱码怎么处理:主动设置编码格式
  • 如果需要很多页面,还要获取这些页面的链接列表。
  • 防止被屏幕:加header头,加随机访问间隔
  • 验证码:这个没办法

2. 爬虫实战

目的:爬取一本小说。先从目录页获取链接列表,再从每个页面获取文本,保存到本地文件。
环境:python3,jupyter notebook

(1) 获取url列表

import requests
import re
from bs4 import BeautifulSoup
import time,random

# 从目录页,获取链接列表
page="https://www.27k.net/read/63021"
headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
}
respose=requests.get(page, headers);
assert respose.status_code==200,'Error: requests.get'

soup=BeautifulSoup(respose.text,"lxml")
arr=soup.find_all("ul", attrs={"id":"chapterList"})[0].find_all("a")
arr

输出:
[<a href="/read/63021/24610005.html">第1章</a>,
 <a href="/read/63021/24610006.html">第2章</a>,
 <a href="/read/63021/24610007.html">第3章</a>,
...

(2) 从一个页面获取内容并保存

import requests
import re
from bs4 import BeautifulSoup
import time,random

# 为防被封,不能高频访问:模拟用户的点击间隔
def pause(seconds=2):
    #随机时间段后[2s,12s]执行
    pause=seconds+3*random.random()
    print('  sleep '+str(pause) + "second \n")
    time.sleep(pause)


def write2file(url):
    #1. get response
    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
    }
    respose=requests.get(url, headers);
    assert respose.status_code==200,'Error: requests.get'


    #2. get info
    soup=BeautifulSoup(respose.text,"lxml")
    patterns=soup.find_all("div","txtnav")[0]

    #3. write to file
    fw=open('novel.txt','a');

    i=0
    for item in patterns:
        i=i+1
        if i<3: #过滤掉前面重复信息
            continue
        text=item.string
        if None != text:
            if text.strip() != "": #跳过全是空格的行
                #print("  "+text)
                text=re.sub("章\s{14}", "章\n", text)
                fw.write("  "+text)
    fw.write("\n\n\n");
    fw.close();

# #url0="https://www.27k.net/read/63021/%s.html"
# i=0
# for i in range(0,1):

#     url=url0 % str(24610005+i);
#     print(i, url)
#     write2file(url)
#     pause(1);

# print("end")

(3) 应用到批量url中

i=0
for ele in arr:
    i =i +1
    url ="https://www.27k.net" +ele.get("href")
    print(i, url)
    write2file(url)
    pause(1);

print("end") #284

等待程序运行结束(因为设置了随机等待时间,该示例需要几十分钟),就能在工作目录看到一个 txt 文件。
根据原网页,为该txt手动添加一些头尾信息,保存到手机,就可以阅读了。

比手动一个一个复制粘贴省力多了,还不容易出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值