Python爬取小说教程详解

前言

 免责声明:
1、本项目爬取的网站数据仅用于学习交流目的,不用于任何商业用途。
 2、我们尊重原网站的版权和知识产权,不会对爬取的数据进行任何形式的篡改、传播或用于非法用途。
3、爬取行为严格遵守我国相关法律法规,如有侵犯原网站权益,请及时与我们联系,我们将立即停止爬取行为并删除相关数据。
4、本项目不对因使用爬取数据导致的任何损失或损害承担责任。
5、请使用者遵守本免责声明,如有违反,后果自负。

 

准备工作

在开始之前,请确保你的电脑已安装Python环境,并安装了以下库:

  • requests:用于发送HTTP请求。
  • re:用于正则表达式匹配。

下面正式开始教程。

1. 发送请求

首先,我们需要向目标网站发送请求,获取网页内容。这里我们使用requests库。

import requests

# 伪装成浏览器,防止被网站识别为爬虫
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
}
url = 'https://www.99htxt.com/kan/768629/'
res = requests.get(url, headers=headers)

这里我们设置了一个请求头User-Agent,目的是伪装成浏览器,防止被网站识别为爬虫。

2. 提取书名

接下来,我们使用正则表达式提取书名。

import re

book_name_list = re.findall('<h1 class="booktitle">(.*?)</h1>', res.text)
book_name = book_name_list[0]
print(book_name)

这里我们使用了re.findall()方法,第一个参数是正则表达式,用于匹配书名的位置,第二个参数是网页源代码。findall()方法会返回一个列表,我们取第一个元素即为书名。

3. 提取目录名

同样地,我们使用正则表达式提取目录名。

title_all = []
title_list = re.findall('title="魂穿三国,成为最强前夫哥? (.*?)">第', res.text)

for title in title_list:
    if '章' in title:
        title_all.append(title)

这里我们同样使用re.findall()方法,匹配目录名。然后通过一个循环,将包含“章”的目录名添加到列表中。

4. 提取正文路径

接下来,我们需要提取正文所在的路径。

text_path = re.findall('<a href="/c/768629/(.*?)" title="魂穿三国,成为最强前夫哥? 第', res.text)

这里我们使用re.findall()方法,匹配正文路径。

5. 组装正文地址

以前5章为例,如想爬取所以内容使用5的位置换成len(title_all),我们将目录名和正文路径组合成完整的正文地址。

text_url_dict = {}
for i in range(5):
    text_url_dict[title_all[i]] = f'https://www.99htxt.com/c/768629/{text_path[i]}'

这里我们使用一个字典来存储目录名和对应的正文地址,打印出的内容如下。

{'第1章 我是刘备老婆的前夫哥?': 'https://www.99htxt.com/c/768629/1354243/', '第2章 雒阳城巧遇': 'https://www.99htxt.com/c/768629/1354248/', '第3章 曹家孟德': 'https://www.99htxt.com/c/768629/1354253/', '第4章 太常刘焉': 'https://www.99htxt.com/c/768629/1354257/', '第5章 古之恶来': 'https://www.99htxt.com/c/768629/1354262/'}

为了方便查看可写成如下:

for k, v in text_url_dict.items():
    print(k, v)

6. 保存内容到txt文件

最后,我们将这5章内容保存到txt文件中。

with open('./contant.txt', 'w+', encoding='utf-8') as f:
    for k, v in text_url_dict.items():
        res = requests.get(v, headers=headers)
        text = re.findall('data-id="0">(.*?)</p></dd></div>', res.text, re.S)[0]
        text = text.replace('</p><p> ', '')
        text = text.replace('</p></dd><dd data-id=', '')
        text = text.replace('<p>', '')
        f.write(k)
        f.write(text)

这里我们使用with open()语句打开一个文件,然后遍历字典,发送请求获取正文内容,使用正则表达式提取正文,最后将目录名和正文写入文件。

7. 所有代码如下:

import re, requests

# 如果爬取过程中遇到403这种情况,增加请求头试试,伪装成浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'}
url = 'https://www.99htxt.com/kan/768629/'
res = requests.get(url, headers=headers)
# print(res.text)

# 提取书的名字
book_name_list = re.findall('<h1 class="booktitle">(.*?)</h1>', res.text)
book_name = book_name_list[0]
print(book_name)

# 提取目录名
title_all = []
title_list = re.findall('title="魂穿三国,成为最强前夫哥? (.*?)">第', res.text)
print(title_list)

for title in title_list:
    if '章' in title:
        title_all.append(title)
# print(title_all)

# 提取正文路径
text_path = re.findall('<a href="/c/768629/(.*?)" title="魂穿三国,成为最强前夫哥? 第', res.text)
# print(text_path)

# print(len(title_all))
# 组装正文地址{目录:url},
# 以前5章为例,如想爬取所以内容使用5的位置换成len(title_all)
text_url_dict = {}
for i in range(5):
    text_url_dict[title_all[i]] = f'https://www.99htxt.com/c/768629/{text_path[i]}'
print(text_url_dict)
for k, v in text_url_dict.items():
    print(k, v)

# 将这5章存到txt中
with open('./contant.txt', 'w+', encoding='utf-8') as f:
    for k, v in text_url_dict.items():
        print(k)
        print(v)
        res = requests.get(v, headers=headers)
        text = re.findall('data-id="0">(.*?)</p></dd></div>', res.text, re.S)[0]
        # 替换到没用的内容
        text = text.replace('</p><p> ', '')
        text = text.replace('</p></dd><dd data-id=', '')
        text = text.replace('<p>', '')
        print(text)
        f.write(k)
        f.write(text)

存到text中的样式如下

注意事项

在尝试爬取网页时遇到403错误通常意味着服务器理解了你的请求,但是拒绝执行它,这可能是由于服务器设置了反爬虫机制。以下是一些处理403错误的常见方法:

  1. 修改User-Agent: 服务器可能会封锁那些看起来像是爬虫的请求。你可以通过修改请求头中的User-Agent来伪装成浏览器。

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
    res = requests.get(url, headers=headers)
    
  2. 使用代理: 如果服务器根据IP地址封锁了你的请求,你可以使用代理来绕过这个限制。

    proxies = {
        'http': 'http://10.10.1.10:3128',
        'https': 'http://10.10.1.10:1080',
    }
    res = requests.get(url, proxies=proxies)
    
  3. 降低爬取速度: 如果你的请求速度过快,服务器可能会认为你在进行攻击。可以设置延时来降低爬取速度。

    import time
    time.sleep(1)  # 等待1秒
    res = requests.get(url)
    
  4. 检查Referer: 有些网站会检查请求的Referer头部,确保请求是从它们的网页发出的。

    headers = {
        'Referer': 'https://www.99htxt.com/'
    }
    res = requests.get(url, headers=headers)
    
  5. 处理Cookies: 有些网站需要特定的Cookies才能访问。

    jar = requests.cookies.RequestsCookieJar()
    jar.set('name', 'value', domain='www.99htxt.com')
    res = requests.get(url, cookies=jar)
    
  6. 检查网站robots.txt: 在爬取之前,先检查网站的robots.txt文件,了解哪些路径是允许爬取的。

  • 50
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值