python爬虫之爬取《书趣阁》小说教学

2020-11-10 10:10发布

前言: 这次的爬虫难度系数不大,相对于我上次讲解的课程了来说有很好的验证和过度的效果,但是却有几个较新的知识点。包含文本解码,封装方法,写入txt,链接拼接等等,这也是我选择《书趣阁小说》来教学的原因。特别是实现它的逻辑,可以用到很多的地方,这些都是可以带来的收获!


文章目录


视频教程: 爬取《书趣阁》小说
操作平台: python37, jupyter, 谷歌


1、请求服务器

1.1、分析网页

我们在请求服务器之前要先看一下这个网页的构造,我们可以看到它的信息全部都是通过html加载出来的,每一个url都可以对应一篇小说,所以我们只需要提取到该小说目录的所有链接就可以获取到没有个章节的内容了。


1.2、获取html文件

# 导入包import requests
url = "http://www.shuquge.com/txt/514/363448.html"reponse = requests.get(url)print (reponse.text)12345

在这里插入图片描述

1.3、解码

我这里用了一种万能的解码方式,可以对付大多数的乱码问题

#解码
reponse.encoding = reponse.apparent_encoding
print (reponse.text)

在这里插入图片描述


2、提取并保存信息

2.1、提取内容

在这里任然使用的lxml 来提取信息,主要提取它的名称,用来做txt文件的名称,并把内容保存进文件内

# 提取信息
from lxml import etree
#解析
etree_html = etree.HTML(reponse.text)
#提取标题
title = etree_html.xpath('//*[@id="wrapper"]/div[4]/div[2]/h1/text()')
print (title)
#提取内容
content = etree_html.xpath('//*[@id="content"]//text()') #现在还是数组形式,文本,字符串
text = "".join(content) #把数组转化为字符串,\r和\n换行
text

在这里插入图片描述

2.2、写入txt

现在使用相对路径的方式把它和代码保存在一个文件夹内,名称为第一章 若得来生重倚剑,屠尽奸邪笑苍天.txt

with open('./第一章 若得来生重倚剑,屠尽奸邪笑苍天.txt', 'a', encoding='utf-8') as file: #创建并打开一个文件
    file.write(text) #放进去内容,写入
    file.close() # 关闭123

2.3、封装函数的方法

简单方法封装可以写为:

#这个方法没有被执行,因为没有入口
def start():
    print ("啊啊啊啊啊啊")

# 没有数据返回类型
def funtion():
    print ("内容已经被执行")

# 有数据返回型
def get_info(b):
    a = b + 10
    return a
    
if __name__ =='__main__':
    funtion() #直接进入funtion()中执行
    c = get_info(5) #把5传到get_info()方法中,返回值赋给c
    print (c)

结果:

内容已经被执行1512

记忆点: start() 方法没有被执行是因为它没有被调用,所以没有执行;我们可以把方法理解为一个房子,它有一扇唯一的门 def funtion() ,我们要进入其中,必须要有对应的钥匙funtion() 才能进入;如果我们要带东西进去,那么必须要先告诉我们是否可以带东西进入?能带多少个?它的门可以为 get_info(b) ,钥匙就为 get_info(这里放要带的东西,多个用逗号分开) ,需要传出来的值可以用 return 传出,并找一个值接收,如上面的 c 。


3、爬取首页所有链接

  • 爬取首页链接方法和上面一样,虽然文字有乱码情况,但是我们不需要文本,只需要 href=" " 双引号中的内容,这部分没有乱码,不需要额外解码都可以;

  • 我们获取的 href 标签内容不是一个完整的链接,需要参考它原理完整链接自己拼接出来;

  • 把爬取到的每一个链接拼接完整后追加到一个数组中,用 return 把这个数组返回出来。

import requests
from lxml import etree

def get_link(index_url):
    index_html = requests.get(index_url).text    
    index_etree = etree.HTML(index_html)
    dd = index_etree.xpath('/html/body/div[5]/dl/dd')
    link_list = [] # 打包所有的练接
    for item in dd:
        href = "http://www.shuquge.com/txt/514/"+item.xpath('./a/@href')[0]
        link_list.append(href)
    return link_list #返回的东西,我要带走的

if __name__ =='__main__':
    index_url = "http://www.shuquge.com/txt/514/index.html" #文章首页链接
    links = get_link(index_url)
    for link in links:
        target_url = link
        print (target_url)

在这里插入图片描述

4、爬取所有章节

# 导入包
import requests
from lxml import etree

filePath = r"C:\Users\Youle\Desktop\爬取的小说\\" #本机的桌面路径,r表示原意,多加一个\表示转义

#这个方法下载并提取文字
def download_text(url):
    # 导入包
    reponse = requests.get(url)
    #解码,万能模式
    reponse.encoding = reponse.apparent_encoding
    #解析
    etree_html = etree.HTML(reponse.text)
    #提取标题
    title = etree_html.xpath('//*[@id="wrapper"]/div[4]/div[2]/h1/text()')
    print (title)
    #提取内容
    content = etree_html.xpath('//*[@id="content"]//text()') #现在还是数组形式,文本,字符串
    text = "".join(content) # 把数组转换为字符串,\r和\n都是换行符
    # 保存到txt文件,放到电脑桌面,绝对路径,r表示原意,\代表转义字符
    with open(filePath + title[0] + '.txt', 'a', encoding='utf-8') as file: #创建并打开一个文件
        file.write(text) #放进去内容,写入
        file.close() # 关闭
        
# 取到所有文章的链接        
def get_link(index_url):
    index_html = requests.get(index_url).text 
    index_etree = etree.HTML(index_html)
    dd = index_etree.xpath('/html/body/div[5]/dl/dd')
    link_list = [] # 打包所有的练接
    for item in dd:
        href = "http://www.shuquge.com/txt/514/"+item.xpath('./a/@href')[0] #拼接出完整的链接
        link_list.append(href)
    return link_list #返回的东西,我要带走的

if __name__ =='__main__':
    index_url = "http://www.shuquge.com/txt/514/index.html" #文章首页链接
    links = get_link(index_url)
    for link in links:
        target_url = link
        print ("这在爬取:", target_url)
        download_text(target_url) #带进去的东西

结果截屏:

在这里插入图片描述


作者:阿优乐扬

链接:https://blog.csdn.net/ayouleyang/article/details/105562499

来源:CSDN
著作权归作者所有,转载请联系作者获得授权,切勿私自转载。