爬取多本小说

标签: 爬虫进化之路  python

目标网站

笔趣阁全部小说栏的小说
网址:http://www.xbiquge.la/xiaoshuodaquan/
页面解析

爬取流程:

1. 请求网站拿到数据,抽取小说名创建文件夹,抽取小说链接

解析网页发现,所有的书和其连接都是在相同在相同的标签下,极大的降低了我们爬取不同类别小说的难度,爬取书名以后需要将书名作为文件名,以便于之后本书章节的存储。
在这里插入图片描述实现代码如下:

    def start_requests(self):
        # 1. 请求网站拿到数据,抽取小说名创建文件夹,抽取小说链接
        start_url = "http://www.xbiquge.la/xiaoshuodaquan/"
        response = requests.get(start_url)
        html = etree.HTML(response.text)
        name_list = html.xpath("//div[@class='novellist']/ul/li/a/text()")
        url_list = html.xpath("//div[@class='novellist']/ul/li/a/@href")
        for shu_name,shu_url in zip(name_list,url_list):
            if os.path.exists(shu_name) == False:
                os.mkdir(shu_name)
            self.requests_zhang(shu_name,shu_url)

2. 请求小说拿到数据,抽取章名、文章链接

网页解析时发现,网址和书名都是正确的,但是在输出调试的时候发现,文章名变成了乱码,仔细想‘utf-8’是可以解析中文,不应该发生乱码的,想着应该是自己程序默认编码和文章的编码格式不同。做了个简单的调试,发现确实不一样,又进行了编码的转换。之后函数设计时,有一个**巧点:记录书的名称,以便之后文章存储时找到文件的位置。**实现代码如下:

    def requests_zhang(self,shu_name,shu_url):
        # 2. 请求小说拿到数据,抽取章名、文章链接
        response = requests.get(shu_url)
        #乱码 header显示编码格式是ISO-8859-1 内容的格式是utf-8 需要修改代码格式
        response.encoding='utf-8'
        # print(response.encoding) #没定义编码格式的时候,header显示的编码格式
        # print(response.apparent_encoding) #内容实际采用的编码格式
        # print(response.headers) #查看头标签内容
        html = etree.HTML(response.text)
        zhang_name_list = html.xpath('//div[@id="list"]/dl/dd/a/text()')
        zhang_url_list =html.xpath('//div[@id="list"]/dl/dd/a/@href')
        for zhang_name,zhang_url in zip(zhang_name_list,zhang_url_list):
            self.requests_data(zhang_name,zhang_url,shu_name)

3. 请求文章拿到文章内容,创建文件保存到相应文件夹

爬取文章内容,解析网页
在这里插入图片描述解析网页结构发现,章节名可以轻松获得,但是章节连接并不完整,进入章节以后再查看链接栏的连接,
在这里插入图片描述发现其实章节的链接是可以拼接出来的,如此一来,便可以获得每个文章的章节了,之后便是将章节的内容抓取下来,以‘txt’的形式进行存储。以为这样就算完了吗?爬取的过程中出现了这样的错误

  • FileNotFoundError: [Errno 2] No such file or directory: '烂柯棋缘\第230章…

后面的文件名还很长,遇见这个错误,很是奇怪,将文件名和部分代码抽出来调试发现,文件其实并没有创建成功,原因经试验证明,是文件名字太长了,所以将文件名截断,获取了合理的长度,以为没事了,然后又出现错误,

  • FileNotFoundError: [Errno 2] No such file or directory: '亏成首富从游戏开始\第117章 如何扭转风评(1/1.txt’

这次并不是文件长度的问题了,根据文件名的格式,发现了疑似问题的原因,应该是后面1/1.txt时解析错误,文件名称方式不对,试着尝试着修改了下代码,果然截取以后就没问题了,这部分的代码实现如下:

        def requests_data(self,zhang_name,zhang_url,shu_name):
        # 3. 请求文章拿到文章内容,创建文件保存到相应文件夹
        data_url = 'http://www.xbiquge.la'+zhang_url
        response = requests.get(data_url)
        response.encoding='utf-8'
        html = etree.HTML(response.text)
        content = "\n".join(html.xpath('//div[@id="content"]/text()'))
        zhang_name = zhang_name[0:16].split('(')[0]
        print(zhang_name)
        file_name = shu_name + '\\' + zhang_name + '.txt'
        print("正在存储文件:"+file_name)
        with open(file_name,"a",encoding='utf-8') as f:
            f.write(content)

最后实现的全部代码如下,需要的可以自行拿去练手哦()

import requests
from lxml import etree
import os

class Spider(object):
    def start_requests(self):
        # 1. 请求网站拿到数据,抽取小说名创建文件夹,抽取小说链接
        start_url = "http://www.xbiquge.la/xiaoshuodaquan/"
        response = requests.get(start_url)
        html = etree.HTML(response.text)
        name_list = html.xpath("//div[@class='novellist']/ul/li/a/text()")
        url_list = html.xpath("//div[@class='novellist']/ul/li/a/@href")
        for shu_name,shu_url in zip(name_list,url_list):
            if os.path.exists(shu_name) == False:
                os.mkdir(shu_name)
            self.requests_zhang(shu_name,shu_url)


    def requests_zhang(self,shu_name,shu_url):
        # 2. 请求小说拿到数据,抽取章名、文章链接
        response = requests.get(shu_url)
        #乱码 header显示编码格式是ISO-8859-1 内容的格式是utf-8 需要修改代码格式
        response.encoding='utf-8'
        # print(response.encoding) #没定义编码格式的时候,header显示的编码格式
        # print(response.apparent_encoding) #内容实际采用的编码格式
        # print(response.headers) #查看头标签内容
        html = etree.HTML(response.text)
        zhang_name_list = html.xpath('//div[@id="list"]/dl/dd/a/text()')
        zhang_url_list =html.xpath('//div[@id="list"]/dl/dd/a/@href')
        for zhang_name,zhang_url in zip(zhang_name_list,zhang_url_list):
            self.requests_data(zhang_name,zhang_url,shu_name)

    def requests_data(self,zhang_name,zhang_url,shu_name):
        # 3. 请求文章拿到文章内容,创建文件保存到相应文件夹
        data_url = 'http://www.xbiquge.la'+zhang_url
        response = requests.get(data_url)
        response.encoding='utf-8'
        html = etree.HTML(response.text)
        content = "\n".join(html.xpath('//div[@id="content"]/text()'))
        zhang_name = zhang_name[0:16].split('(')[0]
        print(zhang_name)
        file_name = shu_name + '\\' + zhang_name + '.txt'
        print("正在存储文件:"+file_name)
        with open(file_name,"a",encoding='utf-8') as f:
            f.write(content)

if __name__ == '__main__':
    spider = Spider()
    spider.start_requests()
版权声明:本文为du346568978原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/du346568978/article/details/105911033