其他分享
首页 > 其他分享> > 初学——爬取新笔趣阁案例最新

初学——爬取新笔趣阁案例最新

作者:互联网

这是作为新人小白的我第一次写博客,想想还是挺激动的。

首先写代码前,希望大家明白一件事。

代码的规范性。——————真的非常非常非常非常非常重要!

在这之前,我还没体会到代码规范的重要性,直到昨天,我收集项目实例的时候。——头都要大了

同样的需求,代码却千奇百怪,形形色色。我翻烂了github csdn都没找到能看懂的东东。

直到遇见它.......

作为一个爬虫萌新,分享要爬的当然是——————新笔趣阁啦

需求: 输入小说的ID实现爬取整本小说就是这串数字

ps:后面我用异步整出来 再分享异步操作

项目效果:

说再多不给人看都是耍流氓 来上效果

爬取的思路:

项目要用到的模块

import requests
import requests
from lxml import etree
from tqdm import tqdm  # 进度条模块

一、明确需求

先打开网址https://www.xbiquge.la/  随便打开一本小说的链接 任意打开一章节 我们来获取它的数据

# 构造请求头处理反爬 
headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    }
# 请求网页内容 赋值给response
response = requests.get('https://www.xbiquge.la/10/10489/4535761.html',headers=headers)
# 答应网页的文本内容
print(response.text)

咦,请求网页返回的数据出现了乱码,这就需要我们解码了

加一行代码自动解码

response.encoding = response.apparent_encoding

 

二、解析数据

我们需要的数据有了,接下来是不是要解析数据啦

解析数据 我这里采用的是xpath解析,当然你也可以采用re bs4 css解析

用标签选择器定位到我们需要的文章标题的内容

这里对应的便是标题的内容了

右键 copy  ----copy xpath

同理 我们再获取小说的的内容

需要注意 我们这里提取到的是小说的列表

 

# 构建解析对象
tree = etree.HTML(response.text)
# 小说标题
title = tree.xpath('//div[@class="bookname"]/h1/text()')[0]
# 小说内容 返回的是列表
content_list = tree.xpath('//*[@id="content"]//text()')
# 将小说列表转化为字符串的形式
content_str = ''.join(content_list)
print(title,content_str)
 

这里你打印字符串 可能会缺少东西  没错的蛤 写入文件就正常了

三 持久化存储

file_name = f"{novel_name}.txt"
# 一定要记得加后缀.txt mode 保存方式 a是追加保存 encoding是保存编码
with open(file_name,mode='a',encoding='utf-8') as f:
# 写入标题
    f.write(title)
# 写入换行
    f.write('\n')
# 写入小说内容
    f.write(content)

保存一章小说这样就写完了,那如何获取完整的小说呢

这里的参数此时不用注意 是函数的参数 后面看完整代码即可 讲的是思路

整本小说爬虫

既然知道怎么爬取单章节内容了,那你是不是知道所有章节的url 使用函数传参到爬取单章节内容的代码 是不是就可以爬取全部内容了

我们用xpath解析首页的html内容提取 所有小说的url和小说的名字

 

所有的单章的url地址都在 dd 标签当中,但是这个url地址是不完整的,所以爬取下来的时候,要拼接url地址。

前面的前缀名+href的内容

def get_all_url(html_url):
    # 调用请求网页函数 获取到的是某个小说的首页
    response = get_response(html_url)
    # 解析我们需要的小说章节标题 章节url内容
    # 构成解析对象
    tree = etree.HTML(response.text)
    # 首页的所有章节url
    all_url = tree.xpath('//*[@id="list"]/dl/dd/a/@href')
    # 小说的名字
    novel_name = tree.xpath('//*[@id="info"]/h1/text()')
    for url in tqdm(all_url):
        novel_url = 'https://www.xbiquge.la/'+url
        # 给get第一页函数传入参数 小说名字和链接
        get_one_novel(novel_name,novel_url)

tqdm的用法小伙伴们可以自行搜索学习 是一个进度条的效果

 

爬起整本小说代码

注释写的很详细 这是我结合很多大佬/很多案例总结出的,目前我认为的最优方法。

需要有python基础噢 有不懂得可以在下面交流讨论 

咱们下期见 ~~~~~

import requests

from lxml import etree
from tqdm import tqdm


def get_response(html_url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    }
    response = requests.get(url=html_url,headers=headers)
    response.encoding = response.apparent_encoding
    return response


def save(novel_name,title,content):
    """
    :param novel_name:
    :param title:
    :param content:
    :return:
    """
    file_name = f"{novel_name}.txt"
    # 一定要记得加后缀.txt mode 保存方式 a是追加保存 encoding是保存编码
    with open(file_name,mode='a',encoding='utf-8') as f:
        # 写入标题
        f.write(title)
        # 写入换行
        f.write('\n')
        # 写入小说内容
        f.write(content)


def get_one_novel(name,novel_url):
    # 小说章节内容获取 #调用请求网页数据函数
    response = get_response(novel_url)
    # 构建解析对象
    tree = etree.HTML(response.text)
    # 小说标题
    title = tree.xpath('//div[@class="bookname"]/h1/text()')[0]
    # 小说内容 返回的是列表
    content_list = tree.xpath('//*[@id="content"]//text()')
    content_str = ''.join(content_list)
    save(name,title,content_str)


def get_all_url(html_url):
    # 调用请求网页函数 获取到的是某个小说的首页
    response = get_response(html_url)
    # 解析我们需要的小说章节标题 章节url内容
    # 构成解析对象
    tree = etree.HTML(response.text)
    # 首页的所有章节url
    all_url = tree.xpath('//*[@id="list"]/dl/dd/a/@href')
    # 小说的名字
    novel_name = tree.xpath('//*[@id="info"]/h1/text()')
    for url in tqdm(all_url):
        novel_url = 'https://www.xbiquge.la/'+url
        # 给get第一页函数传入参数 小说名字和链接
        get_one_novel(novel_name,novel_url)


if __name__ == '__main__':
    novel_id = input('输入书名ID:格式:/15/15409/')
    url = f'https://www.xbiquge.la{novel_id}'
    get_all_url(url)

















 

 

 

 

标签:content,novel,name,url,response,爬取,初学,小说,笔趣
来源: https://blog.csdn.net/weixin_55469867/article/details/117185029