初试爬虫【爬虫实验获取网络小说】

文章目录:

  • 重现实验
  • 实验环境
  • 实验目的
  • 实验阶段一:【获取小说某章信息】
  • 实验阶段二:【获取信息的有效内容】
  • 实验阶段三:【获取小说的所有目录及链接】
  • 实验阶段四:【获取主目录信息中的有效内容】
  • 实验阶段五:【获取整篇小说内容】
  • 注意 

 

重现实验:

  • 此文章是笔者想重现某博主的爬虫实验的过程中,出现的问题及处理方法,以及知识点
  • 原实验链接:https://blog.csdn.net/c406495762/article/details/78123502

实验环境:

  • windows 10
  • python3.5.1
  • python编辑器Geany

 


 

实验目的:

  •  使用爬虫技术下载笔趣阁中《一念永恒》小说

 实验阶段一:【获取小说某章信息】

  • 第一:使用浏览器打开《一念永恒》网页窗口,笔者使用的url为:https://www.biquge5200.cc/38_38857/15054739.html
  • 第二:进入到如下页面,同时检查该页面的源代码,小说内容的源代码部分截图,如下所示:

 

 

  •  第三:根据源代码编写python脚本获取此章小说信息
    • 获取条件:安装requests
      • pip install requests                  #以管理员身份打开CMD,并运行此命令;若报错,可将默认的超时时间调大,在笔者其他博文中有提到

 

  • 第四:运行以下脚本即可获得此章小说的内容  
    • # _*_ coding:UTF_8 _*_
      import requests
      if __name__ == '__main__':
          target = "https://www.biquge5200.cc/38_38857/15054739.html"
          req = requests.get(url=target)
          print(req.text)

       

    • 编码报错:
      print(req.text)改为:
      print((req.text).encode('gbk','ignore'))
      代码运行过程中报错处理
    • 效果如下图所示:  

    •  

       

 

 


 

 实验阶段二:【获取信息的有效内容】

  • 第一:由阶段一脚本中返回的信息截图可知,除了文章的内容外,还包括了很多不需要的东西,此阶段就是如何只获取有用的信息,剔除不用的信息
  • 第二:由下面截图可知,小说内容信息是从<div id="content"><p> 开始的,可通过下面的脚本获取正文内容,详细的原因叙述,可以参考博主借鉴的博文【博文在文章开头处】
  •  第三:编写脚本的前提条件:

pip install beautifulsoup4  #以管理员身份打开CMD,并运行此命令;若报错,可将默认的超时时间调大,在笔者其他博文中有提到
  • 第四:编写的脚本如下:
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup                                   
import requests
if __name__ == '__main__':
    target = "https://www.biquge5200.cc/38_38857/15054739.html"
    req = requests.get(url = target)
    html = req.text
    bf = BeautifulSoup(html,"html.parser")
    #print(req.text)
    texts = bf.find_all('div',id = 'content')
   print(texts[0].text.replace('\xa0'*8,'\t\n'))
  • 第五:脚本解析:
    1. 导入模块
    2. BeautifulSoup(html,"html.parser") #指定以"html.parser"格式读取html内容
    3. bf.find_all('div',id = 'content')  #查找id=“content”的div标签的所有内容
    4. print(texts[0].text.replace('\xa0'*8,'\t\n'))   #剔除正文内容中的空格或者</p><p>符号

 

  • 至此,我们通过爬虫获取了小说的某一章的内容了

 

实验阶段三:【获取小说的所有目录及链接】

  • 第一:打开小说的主目录,url为:https://www.biquge5200.cc/38_38857/
  • 第二:查看主目录网页的源代码,得到关键接入如下所示:

 

  •  编写获取主目录的脚本如下所示:
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests
if __name__ == '__main__':
    target = "https://www.biquge5200.cc/38_38857/"
    req = requests.get(url = target)
    html = req.text
    div_bf = BeautifulSoup(html,"html.parser")
    div = div_bf.find_all('div',id = "list")
    print(div[0])
  • 脚本获取结果如下所示:

 

 

 


 

实验阶段四:【获取主目录信息中的有效内容】

  • 第一:由阶段三实验截图可知,返回的主目录信息包含了一些不需要的内容,而我们目标是获取每一章的章节名及其链接;通过观察可知符合条件的每一条信息均有"a"字符
  • 第二:获取脚本如下:
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests
#import html5lib
if __name__ == '__main__':
    target = "https://www.biquge5200.cc/38_38857/"
    req = requests.get(url = target)
    html = req.text
    div_bf = BeautifulSoup(html,"html.parser")
    div = div_bf.find_all('div',id = "list")
    a_bf = BeautifulSoup(str(div[0]),"html.parser")
    a = a_bf.find_all('a')
    for each in a:
        print(each.string, each.get('href'))
  • 第三:脚本返回的结果为:

 

 

 【章节顺序错乱,这问题笔者暂时未找到原因及处理方法,但不影响后面的小说获取】


 

实验阶段五:【获取整篇小说内容】

  • 第一:整合代码
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests,sys,time

"""
类说明:下载《笔趣看》网小说《一念永恒》
Parameters:
    无
Returns:
    无
Modify:
    2019-12-21
"""
class downloader(object):

    def __init__(self):
        self.target = 'https://www.biquge5200.cc/38_38857/'                     #小说的主目录URL
        self.names = []            #存放章节名
        self.urls = []            #存放章节链接
        self.nums = 0            #章节数

    """
    函数说明:获取下载链接
    Parameters:
        无
    Returns:
        无
    Modify:
        2019-12-22
    """
    def get_download_url(self):
        req = requests.get(url = self.target)
        html = req.text
        div_bf = BeautifulSoup(html,"html.parser")
        div = div_bf.find_all('div', id = "list")
        a_bf = BeautifulSoup(str(div[0]),"html.parser")
        a = a_bf.find_all('a')
        self.nums = len(a[9:])                                #剔除不必要的章节,并统计章节数,根据情况
        for each in a[9:]:
            self.names.append(each.string)
            self.urls.append(each.get('href'))

    """
    函数说明:获取章节内容
    Parameters:
        target - 下载连接(string)
    Returns:
        texts - 章节内容(string)
    Modify:
        2019-12-22
    """
    def get_contents(self, target):
        req = requests.get(url = target)
        html = req.text
        bf = BeautifulSoup(html,"html.parser")
        texts = bf.find_all('div',id = 'content')
        texts = texts[0].text.replace('\xa0'*8,'\n\n')
        return texts

    """
    函数说明:将爬取的文章内容写入文件
    Parameters:
        name - 章节名称(string)
        path - 当前路径下,小说保存名称(string)
        text - 章节内容(string)
    Returns:
        无
    Modify:
        2019-12-22
    """
    def writer(self, name, path, text):
        write_flag = True
        with open(path, 'a', encoding='utf-8') as f:
            f.write(name + '\n')
            f.writelines(text)
            f.write('\n\n')


if __name__ == '__main__':
    dl = downloader()
    dl.get_download_url()
    print("《一念永恒》开始下载:")
    for i in range(dl.nums):
        time.sleep(0.1)                                #此处是笔者根据自身环境加入的,因为文件写入太快,脚本老是报错
        #print(dl.urls[i])
        try:                                       #此处是冗余操作
            dl.writer(dl.names[i],'一念永恒.txt',dl.get_contents(dl.urls[i]))
            sys.stdout.write("已下载:%.3f%%" % float(i/dl.nums*100) + "\r")
        except IndexError:
            continue
        sys.stdout.flush()
    print("《一念永恒》下载完成")
  • 效果:

 

 

 

 

 

 

 

 

 

  • 至此,我们就能通过简单爬虫获取一部小说了

 

 【注意】

UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). 
This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, 
it may use a different parser and behave differently.

用户警告:没有指定解析器,所以自动采用了HTML解析器。这不是一个问题,但是如果你在其他系统或虚拟环境下运行该代码,可能采用其他的解析器,导致不同的运行结果

解决办法:指定HTML解析器

BeautifulSoup(res.text, "html.parser")
posted @ 2019-12-22 01:04  弈虫  阅读(858)  评论(0)    收藏  举报