【Python】基于Python3的爬虫----是时候下本小说看看了!

是不是有的时候发现很多网站的书籍是不允许下载的,但在电脑上看或者网页上看又十分的不方便。最近在研究Python爬虫然后想着是否能够下载过来看看。下面我来看看如何下载。

成果图

【Python】基于Python3的爬虫----是时候下本小说看看了!_第1张图片

运行环境

  1. windows 系统
  2. Python 3.x版本
  3. 第三方库: requests、BeautifulSoup

主要流程

  1. 先找到要取得网页
  2. 观察要爬取的网页并解析,确定要提取的数据(用谷歌浏览器浏览,按下F12解析网页)
  3. 构造爬取的网页结构,写代码
  4. 爬取数据并将数据存储文本文件中

1、先找到要取得网页

req = requests.get(url = target)

2、观察要爬取的网页并解析,确定要提取的数据

不知道如何审查元素可以查看文章:爬虫技术必修课审查元素!

【Python】基于Python3的爬虫----是时候下本小说看看了!_第2张图片

不难发现,文章的所有内容都放在了一个名为div的“东西下面”,这个”东西”就是html标签。如下:

除了div字样外,还有id。仔细观察目标网站一番,我们会发现这样一个事实:id属性为nr1的div标签,独一份!这个标签里面存放的内容,是我们关心的正文部分。

确定要提取的数据是 nr1。

3、构造爬取的网页结构,写代码

html = req.text
bf = BeautifulSoup(html)
texts = bf.find_all('div', id = 'nr1')

find_all匹配的返回的结果是一个列表。提取匹配结果后,使用text属性,提取文本内容,滤除br标签。随后使用replace方法,剔除单回车,替换为双回车进行分段。这样是为了更美观,你可以直接使用,不需要替换。

texts[0].text.replace('\n','\n\n')

4、爬取数据并将数据存储文本文件中

#写文件
def writer(filename,title, text):
    write_flag = True
    with open(filename, 'a', encoding='utf-8') as f:
        f.write(title + '\n\n')
        f.writelines(text)
        f.write('\n\n')


整本书籍下载

这样我们就能把单独的一个章节下载下来并保持在文本中。但是一本书一般有很多章节要怎么处理呢?下面再来看下,如何下载一本书。

思路如下:

通过审查元素的方式获取到每一个章节的下载地址,然后再通过这个地址下载下来保存在文本中,这样就能下载全本书籍了。

1、审查元素

【Python】基于Python3的爬虫----是时候下本小说看看了!_第3张图片

确定要提取的数据是 class="book-list clearfix"。

2、构造爬取的网页结构,写代码,获取到各个章节地址

先匹配class属性为listmain的

3、通过各个地址循环下载各章节内容并保存

方法很简单,对Beautiful Soup返回的匹配结果a,使用a.get(‘href’)方法就能获取href的属性值,使用a.string就能获取章节名,

for each in a:
        print( each.string, each.get("href"))
        get_contents(each.get("href"), "正念.txt", each.string)

遇到问题

1、空值问题

【Python】基于Python3的爬虫----是时候下本小说看看了!_第4张图片

解决方法:加上try.....except 错误机制跳过tr空值

    try:
        writer(filename, title, texts[0].text.replace('\n','\n\n'))
    except IndexError:
        print('index error')
        pass

其他阅读

推荐阅读:【Python】揭秘知乎最受欢迎的 98 本书!唯有阅读来报之!

结束语

是不是很简单,大家也赶紧动手来写一个你爬虫小程序吧。下面是源码,欢迎留言指正不足的地方。

# -- coding: UTF-8 --
from bs4 import BeautifulSoup
import requests

class downer:
    def __init__(self):
        self.target = 'https://www.luoxia.com/zhengniandeqiji/'

    #输入地址
    def input_url(self):
        path = input('请输入 url:')
        if path:
            print ("-------输入了网址:%s-------" %path)
            pass
        else:
            path='http://tieba.baidu.com/p/6127945649'
            print ("-------使用默认网址:%s-------" %path)
        return path;
    
    #写文件
    def writer(self,filename,title, text):
        write_flag = True
        with open(filename, 'a', encoding='utf-8') as f:
            f.write(title + '\n\n')
            f.writelines(text)
            f.write('\n\n')
    
    #获取单个网址
    def print_txt(self):
        #target = 'http://www.biqukan.com/1_1094/5403177.html'
        req = requests.get(url = self.target)
        html = req.text
        bf = BeautifulSoup(html)
        texts = bf.find_all('div', class_ = 'book-list clearfix')
        a_bf = BeautifulSoup(str(texts[0]))
        a = a_bf.find_all('a')
        
        for each in a:
            print( each.string, each.get("href"))
            self.get_contents(each.get("href"), "正念.txt", each.get('title'))
    
    def get_contents(self,target, filename = 'aaa.txt', title='xxx'):
        req = requests.get(url = target)
        html = req.text
        bf = BeautifulSoup(html)
        texts = bf.find_all('div', id = 'nr1')
        #texts = bf.find_all('div', id="content")
        try:
            #print(texts[0].text)
            self.writer(filename, title, texts[0].text.replace('\n','\n\n'))
        except IndexError:
            print('index error')
            self.get_contents(target, filename, title)
            pass

if __name__ == '__main__':
    downering = downer()
    downering.print_txt()
    #downering.get_contents('https://www.luoxia.com/zhengniandeqiji/97401.htm')
    input('输入任意键退出')

欢迎大家关注我们的公众号,每天学一点技术。如果觉得有用给点个赞,谢谢!!

å¨è¿éæå¥å¾çæè¿°

- END -

你可能感兴趣的:(python,Python专栏,Python,小说下载,requests,BeautifulSoup)