python 爬取免费小说

爬取笔趣阁小说

类似笔趣阁这类无验证,不用登陆的网页爬取数据是相当简单的了,在获取到网页后抓取想要的数据就可以了。

初步想法

在爬取数据前首先要想好需要做些什么,有了大致的想法后才能有效的完成:

  1. 首先需要获取到想要爬取的网站,这里的网站为http://www.xbiquge.la
  2. 在进入网站后选取自己想看的小说后获取小说所有的章节名称以及每章节的url在这里我想看的是斗罗大陆Ⅰ,url:http://www.xbiquge.la/1/1710/
  3. 在获取到每一个章节的url后,我就需要对每一个url都去发起请求来获取每一章节下的文本内容。

三种获取章节名和url的方法

1)BeautifulSoup模块
在这里插入图片描述
由于不怎么会用bs4来获取,对于<dd><a>content</a></dd>这样的标签不会简便的获取方法所以写的比较复杂,还是以自己的喜好为主。

2)正则获取
在这里插入图片描述
相比于bs4的标签直接获取来说,正则可能是最简便的方法,但同时也是最难的方法。

3)etree.HTML()
etree.Html()可以用来解析html文档的字符串格式对象,讲字符串转变成_Element对象,方便使用xpath来抓取想要的数据。具体参考链接:
https://blog.csdn.net/u012067766/article/details/79903455
在这里插入图片描述

获取每一章内容

在获得所有章节url后只需要对每一个url都去做一次请求就可以了,完整的代码如下:

import requests

from tqdm import tqdm
from lxml import etree
from fake_useragent import UserAgent

#这里的user_agent是用的模拟火狐浏览器,可以直接用打开的浏览器中的ua替代
ua = UserAgent()

class biquge():
    def __init__(self):
        self.start_url = 'http://www.xbiquge.la'
        self.next_url = 'http://www.xbiquge.la/1/1710/'
        self.header = {
                "Connection": "keep-alive",
                'User-Agent': ua.random,
            }

    def parse_url(self, url):
        response = requests.get(url, headers=self.header, timeout=5,
                                verify=False).content.decode()
        return response

    def save(self, name, data):
        with open(name + ".txt", 'a', encoding='utf-8') as f:
            f.writelines(data + '\n')

    def url_list(self):
        res = []
        response = self.parse_url(self.next_url)
        html = etree.HTML(response)
        part_list = html.xpath('//div[@id="list"]/dl/dd/a/text()')
        url_list = html.xpath('//div[@id="list"]/dl/dd/a/@href')
        for part, url in zip(part_list, url_list):
            if '新书' not in part:
                new_url = self.start_url + url
                res.append(part + ',' + new_url)
        return res

    def run(self):
        data = self.url_list()
        for k in tqdm(range(len(data))):
            i = data[k].split(',')
            response = self.parse_url(i[1])
            html = etree.HTML(response)
            passage = html.xpath('//div[@id="content"]/text()')
            self.save('斗罗大陆Ⅰ', i[0]+'\n')
            for j in passage:
                j = j.strip()
                self.save('斗罗大陆Ⅰ', j)

if __name__ == '__main__':
    xs = biquge()
    xs.run()

当然了,在爬虫的世界里还存在着各种各样的难关,也需要各种方法去提升爬取的效率,希望这篇文章对你有帮助。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值