Python爬虫篇(二):小说那点事儿

​●前言

      前面咱们初步了解了爬虫的步骤以及bs4,并且学习了如何批量爬取图片,想必各位都对爬虫有了基本的了解,当然在学习爬虫之前,还是建议先掌握好python基础,并且对html,css,js以及ajax等知识有一些基本的了解,然后就可以愉快的爬了,好了,回归正题,今天我们来看看如何爬取小说。

●全球高武

      给大家安利一本名为《全球高武》的小说,正版出自起点中文网,常常高居榜一,内容非常得劲,可惜收费,这篇文章就教大家如何白嫖,当然有能力的小伙伴还是建议支持下正版,毕竟作者创作不易,没能力的话就跟着我一起白嫖吧。

在这里插入图片描述

●准备工作

1.背景介绍

      网站:笔趣阁
      https://www.biduo.cc
      笔趣阁,一个无广告无弹窗的优质盗版小说网站,但是只支持在线浏览,并不支持下载和打包,今天就教大家如何下载这里的小说。

2.安装bs4和lxml

pip install beautifulsoup4   # cmd安装BeautifulSoup4
或者
easy_install beautifulsoup4
pip install lxml  # 安装lxml解释器

●小试牛刀

1.分析网页,构造章节链接

      进入笔趣阁官网,搜索书名,进入目录页
在这里插入图片描述
      F12调试,定位目录位置,找到章节链接
在这里插入图片描述

      模拟请求,并解析页面,获取名为list的div内容

from bs4 import BeautifulSoup
import requests
​
url = 'https://www.biduo.cc/biquge/14_14141/'
res = requests.get(url=url, timeout=30)
html = res.text
bf = BeautifulSoup(html, 'lxml')
div = bf.find_all('div', id='list')
print(div)

在这里插入图片描述
      我们可以看到章节的链接和章节名都获取到了,下面我们把它们提取出来并存放在列表里供后续使用

server = 'https://www.biduo.cc'  # 主域名,拼接章节链接使用
a_bf = BeautifulSoup(str(div[0]), 'lxml')
a = a_bf.find_all('a')
names = []
urls = []
for each in a:
    names.append(each.string)
    urls.append(server + each.get('href'))
print(names)
print(urls)

在这里插入图片描述

2.根据章节链接解析章节内容

      上面我们获取了所有的章节名称及其链接,接着我们来获取每一章的具体内容,先以第一章为例:https://www.biduo.cc/biquge/14_14141/c4280483.html

      和上面一样,定位内容所在div,解析一下

from bs4 import BeautifulSoup
import requests
​
url = 'https://www.biduo.cc/biquge/14_14141/c4280483.html'
res = requests.get(url=url, timeout=30)
html = res.text
bf = BeautifulSoup(html, 'lxml')
div = bf.find_all('div', id='content')
print(div)

在这里插入图片描述
      获取里面的文本内容

texts = div[0].text  # .replace('\xa0' * 4, '\n\n')
print(texts)

在这里插入图片描述
      我们可以看出每一行内容之间是四个空格隔开了,把它们替换成换行符格式化下

texts = div[0].text.replace('\xa0' * 4, '\n\n')
print(texts)

在这里插入图片描述
      接下来就是把我们获取到的内容保存下来了。

3.保存小说

texts = div[0].text.replace('\xa0' * 4, '\n\n')
path = '全球高武.txt'
with open(path, 'a', encoding='utf-8') as f:
    f.write(texts)
    f.close()

4.完整代码

      整合一下,加上下载进度和保存内容的格式化等

from bs4 import BeautifulSoup
import requests
import sys
​
​
class GetNovel(object):
    """
    笔趣阁小说下载
    """def __init__(self, targets, paths, titles):
        self.server = 'https://www.biduo.cc'
        self.target = targets
        self.path = paths
        self.title = titles
​
    def geturls(self):
        res = requests.get(url=self.target, timeout=30)
        html = res.text
        bf = BeautifulSoup(html, 'lxml')
        div = bf.find_all('div', id='list')
        a_bf = BeautifulSoup(str(div[0]), 'lxml')
        a = a_bf.find_all('a')
        names = []
        urls = []
        for each in a:
            names.append(each.string)
            urls.append(self.server + each.get('href')) # 构造完整链接
        return names, urls
​
    @staticmethod
    def gettexts(url):
        res = requests.get(url=url, timeout=30)
        html = res.text
        bf = BeautifulSoup(html, 'lxml')
        div = bf.find_all('div', id='content')
        texts = div[0].text.replace('\xa0' * 4, '\n\n')
        return texts
​
    def main(self):
        print('准备下载小说......')
        names, urls = self.geturls()
        for name, url in zip(names, urls):
            texts = self.gettexts(url)
            with open(self.path, 'a', encoding='utf-8') as f:
                f.write('\xa0' * 20 + name + '\n')
                f.write(texts)
                f.write('\n\n')
                sys.stdout.write(self.title + '正在下载中,[进度]:%.3f%%' % float(((names.index(name) + 1) / (len(names)))) + '\r')
                sys.stdout.flush()
​
​
if __name__ == "__main__":
    index = input('请输入书籍编号,编号获取方式,访问https://www.biduo.cc,点开书籍,biquge/后面即是编号')
    target = 'https://www.biduo.cc/biquge/' + index + '/'
    path = input('请输入保存文件路径及名称,如'r'C:\Users\Administrator\Desktop'',默认桌面输入1')
    if path == '1':
        path = r'C:\Users\Administrator\Desktop'
    title = input('请输入小说名称,如 全球高武')
    novel = GetNovel(target, path + '\\' + title + '.txt', title)
    novel.main()

      效果图和结果:
在这里插入图片描述
在这里插入图片描述

●后记

      还是之前那句话,做一个文明的spider,满足自己的需求即可,切勿给别人服务器造成过大的压力,大家好才是真的好!

      对python感兴趣的朋友们可以关注本公众号,会不定时更新一些python基础、网络爬虫、数据分析等知识,也欢迎大家前来探讨交流,公众号加星标,不迷路!

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值