如何用python抓取网页小说(最新更新210809)

如何用python抓取网页小说

210809更新在前,经过一年多的时间,我再次捡起这串代码,发现不适用了????!!!这是一件十分尴尬的事情,所以最近在着手更新代码,其实总结来,大概是因为爬虫过快,占用的资源太过了,导致网站十分容易崩溃,然后各家就开始了自己的防爬优化攻略,想要在盗版小说网站上投机也变得十分艰难,当然,我所写的程序仅供学习之用,大家还是多多支持正版的好,毕竟作者码字不易。

前言(小白可看,大神忽略)

在学习python的过程中,总能遇到各种难题。不断尝试至代码完全可以使用,是学习编程语言的必经之路,在写正文之前,我希望看到这个开头的自学者无论遇到任何困难都不要灰心,办法总比困难多,坚持下去终归能成为一个合格的编程者。

说明

我是一个python自学者,资料来源比较杂乱,程序写好之后发现根本记不清哪几个是在什么地方截取的了,在此声明,如有侵权或需要注明代码来源,请联系我,如果有什么错误的地方,欢迎各位大佬批评指正,若是有更佳的代码,欢迎与我交流。

起因

个人比较爱看小说,看着看着觉得广告太多,毕竟各个网站为了能够赚钱就要插入广告,久而久之觉得特别烦,正好在学python编程,就想着四处搜搜代码看看能不能编出来一个抓取小说的代码,网上这种代码也是比较多的,我也试过很多,但是搞来搞去都不能用,没办法只好自己摸索了。

工具介绍

python3.7.4(必须)

注明给新手:我用的版本是3.7.4,比较新的版本了,用起来还是比较顺手的,如果电脑上安装的是2.X.X的版本,那么千万不要全部参考本代码,python2和python3版本是有很大区别的,相关资料可以到网上查阅,本文不过多论述。
requests_html

Notepad++(非必需)

在某本python编程用书上面发现的工具,用起来还是比较顺手的,个人有个人习惯,不过多作为要求,若IDLE用着顺手也可以用IDLE

PowerShell(非必需)

与上面相同,据说用这个是为了习惯编程脱离程序编辑器,个人没有太大感觉,也是用习惯了。

win10系统(非必需)

我用的win10系统,在win10系统中IE浏览器可以直接查看html的开发源代码,比较方便

准备工作(小白参考,大神忽略)

下载安装requests_html,安装方法如下:
1.打开cmd或者Power Shell;
2.输入pip install requests_html;
3.下载开始,等待下载安装完成。
就这么简单,操作就这么两步,切记不需要进行多余的操作,如果中途显示需要升级安装包什么的,那就请移看其他文章,在这里不做关于安装的其他赘述。

正文(代码在此)

编写一个新程序,总是要面临一波三折,网上参考代码总会有些纰漏,个人难免要思考如何去编写才能更加简单的完成一个程序。首先我先试验了如何获取某一章小说的代码。

from requests_html import HTMLSession
url = "https://www.luoqiuzw.com/book/85083/33749410.html"
session = HTMLSession()
information = session.get(url)#网页读取
text = information.html.text
num1 = text.index("无广告")+3#建议针对性的先看一下text中存储文本的属性,然后确定所要截取的文本位置范围,本篇中无广告和章节错误中间正好是小说的文本内容
num2 = text.index("章节错误")
text_fir = text[num1:num2]
print(text_fir)

注意:开始执行代码时,浏览器中不能打开该网页,否则同时打开一个网页python会返回404问题,而不是我们需要的内容。
这是在PowerShell中,先执行python进入python编辑器中后执行的结果,显然这几行代码就可以完成截取操作了。(小白建议)在测试自己所需要的短行代码中,单步执行可以简单有效的看到每一步的执行结果,就拿本次代码来说,我可以在执行完text=information.html.text之后输入text,看看text中有什么。
在这里插入图片描述
之后,我的思路是如何去获取每一章小说的网址,在目录页进行单步操作,查看HTML的源代码,把网页存到表格里可不可以呢?于是,我就有了获取网址的第一套代码。

from requests_html import HTMLSession
import xlwt#在基础安装包中是没有这个模块的,需要下载,下载步骤和requests_html模块相似,执行pip install xlwt即可,这是表格的相关模块,有兴趣可以网上去查阅一下

class Write_xlx():
    """存储小说的网页链接表格"""
    
    def __init__(self,roud1,roud2):
        self.roud1 = roud1 #第一列
        self.roud2 = roud2#第二列

	def write_in(self):
        xls = xlwt.Workbook()
        sht1 = xls.add_sheet('Sheet1')
        for num1 in range(len(self.roud1)):
            sht1.write(num1,0,self.roud1[num1])
            
        for num2 in range(len(self.roud2)):
            sht1.write(num2,1,self.roud2[num2])
            
        xls.save('F:\python3.7\my_text\小说抓取\小说3.xls')
        print('连接存储完成')

class Read_HTML():
    def __init__(self):
        self.url = "https://www.luoqiuzw.com/book/85083/"#这是落秋中文网一本小说的目录页
    def Read_link(self):
        session = HTMLSession()
        information = session.get(self.url)#网页读取
        rel = 'div#list'#这个和HTML网页的定位有关系,想要进行更了解的可以网上查阅相关资料简单介绍见下文注解
        name = information.html.find(rel,first = True).text#网页内容转换为文本格式
        links = information.html.find(rel,first = True).absolute_links#获取网页中所包含的全部网址
        print('连接制作完成')
        return name.split('\n'), str(links).split(',')

if __name__ == '__main__':
#这行代买可以简单的解释为,只有直接调用这个程序,这个代买才会运行,若在其它的程序中进行from操作,这个“函数”是不会被执行的
    read_html=Read_HTML()
    name,links = read_html.Read_link()
    write_xlx = Write_xlx(name,links)
    write_xlx.write_in()
    print('完成')

注解:在目录页右击某一章节小说,在选项中找到检查元素,就可以看到元素的所在位置,详情请自己查阅资料
在这里插入图片描述
执行之后,我发现我需要的中文部分和网页部分在表格中不对应,无奈只能放弃了这个操作,转换思路。那就不存内容,直接打开网页截取内容,我这么跟自己说,然后马上就出现了我的第三套代码,这套代码修修改改,变成了现在的最终版代码。

from requests_html import HTMLSession
#抓取相关文本
import xlwt

class setting():
    """存储网页,关键词等基础信息"""
    
    def __init__(self):
        self.url='https://www.luoqiuzw.com/book/85083/'
        self.top_word = '无广告'
        self.top_word_num=3
        self.low_word = '章节错误'
        self.title_word1 = '奈何公主想嫁我 > '
        self.low_word_num= len(self.title_word1)
        self.title_word2 = '加入书签'
        self.filename = 'F:\python3.7\my_text\小说抓取\stroy.txt'

class write_xlx():#写入表格供代码参考,用以检查错误
    def __init__(self,roud1,roud2):
        self.roud1 = roud1 #第一列
        self.roud2 = roud2#第二列
    
    def write_in(self):
        xls = xlwt.Workbook()
        sht1 = xls.add_sheet('Sheet1')
        for num1 in range(len(roud1)):
            sht1.write(num1,0,roud1[num1])
        for num2 in range(len(roud2)):
            sht1.write(num2,1,roud2[num2])
        xls.save('./小说1.xls')

class stroy():
    def __init__(self, url, top_word, top_word_num, low_word, low_word_num, title_word1 , title_word2):
        self.adress = url[2:-1]
        self.word1 = title_word1
        self.word2 = top_word
        self.word3 = top_word_num
        self.word4 = low_word
        self.word5 = low_word_num
        self.title_word2 = title_word2
        #print(self.adress)
        session = HTMLSession()
        self.all_word = session.get(self.adress)
        self.all_word_text = self.all_word.html.text
    def find_text_title(self):
    #截取题目部分
        num1 = self.all_word_text.index(self.word1)+self.word5
        num2 = self.all_word_text.index(self.title_word2)
        title = self.all_word_text[num1:num2]
        num3 = int((len(title))/2-1)
        title = title[0:num3]
        #print(title)
        #print('题目截取完成')
        return title
        
    def find_word(self):
    #截取内容部分
        text = self.all_word_text[(self.all_word_text.index(self.word2)+self.word3):
                                (self.all_word_text.index(self.word4))]
        #print(text)
        #print('文本查询完成')
        return text

def poen(find_text_title , find_word,m,link):
    """所选内容转换为文本"""        
    f = open(find_text_title, 'a')
        
    in_text = find_text_title + '\n' + find_word
    try:
        f.write(in_text)
    except UnicodeEncodeError:
        f.write(link)
        print(str(m)+'一次错误报告')
    f.close()

#自动更换截取更多网页内容
class Read_HTML():
    def __init__(self, url):
        self.url = url
        
    def Read_link(self):
        session = HTMLSession()
        information = session.get(self.url)
        #print(self.url)
        #print(information)
        inf1 = information.html.find('div#list',first = True)
        #print(inf1)
        links = inf1.absolute_links
        print('连接制作完成')
        return str(links).split(',')

def Main():
    time =0
    Setting=setting()
    read_html = Read_HTML(Setting.url)
    links = read_html.Read_link()
    for i in range(10):#多次随机抓取,补充遗漏的内容
        for m in range(len(links)):
            if m == 0 or m == len(links) :
                continue
            else:
                Story = stroy(links[m], Setting.top_word, Setting.top_word_num, 
                        Setting.low_word, Setting.low_word_num, Setting.title_word1,Setting.title_word2)
                #print(links[m])
                poen(Story.find_text_title() , Story.find_word(),time+1,links[m])
                time=time+1
                print('共产生'+str(time) +'个文件')

Main()

最终版的程序能够成功完成截取任务,但在截取过程中,总会漏掉一些部分,只能通过重复不断读取来补充遗漏的章节,在代码中可以看到很多被注释掉的部分,那些部分是我用来检测代码输出,从而判断代码中哪里有问题,有兴趣的可以自己看看。

反思

程序中还是有些不足的,就比如不能把所有章节整合到同一个文档当中,但是我很喜欢现在这种模式,所以就没有再继续敲代码进去了,有兴趣的可以继续尝试。

后记

程序的编写过程远比我描述起来复杂得多,在这过程中不断报错不断更正(我是菜鸟级别)中间有过玩脱了,为了解决一些报错误信网上的一些说法,结果下载了破坏性软件,最后电脑黑屏不得不系统重装,但最后完成整个编程还是很开心的,有付出终会有收获,别的不说,我终于可以开心的看小说了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值