Python3中BeautifulSoup爬取笔趣阁小说网

1.背景

  一般我们进行小说网的爬取,大致思路都是先获取小说网页的html内容,然后使用正则表达式找到对应的章节以及其对应的url。BeautifulSoup是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree)。 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作。使用BeautifulSoup来爬取小说网,将大大减少正则表达式的使用,提高效率。

2.代码解析

2.1导包

2.2函数获取html页面的内容

  向函数传入一个url,函数会构造一个url请求,向目标url发送请求并获取响应对象,然后读取获得的内容,再返回。

2.3函数获取小说的章节目录

  向函数传入一个html页面的内容,这里传入应该是具体小说的首页,也就是有章节目录的那个页面,函数获取章节目录页面的内容后,先构建一个soup对象,紧接着运用soup对象里面的方法,分别获取小数的标题和章节名称以及其对应的url,最后以字典的形式返回。

2.4函数获取小说的文本内容

  向函数传入以章节名称和对应的url为键值对的字典和小说标题,函数遍历这个字典,调用gain_html_content 函数获得小说的html页面的内容,然后构建soup对象,并直接找到小说文章内容的标签,并获取其中的文本信息,最后调用write2file函数,写入本地txt文件。

2.5将小说内容写入本地文件

  这个就没啥好说的了,直接将小说文本内容,写入本地。

2.6代码总览

  1. # -*- coding: utf-8 -*-  
  2. # @Time    : 2018/5/21 09:08  
  3. # @Author  : daigua  
  4. # @File    : 12-笔趣-beautifulsoup.py  
  5. # @Software: PyCharm  
  6.     
  7.     
  8. from bs4 import BeautifulSoup  
  9. import re  
  10. import urllib.request  
  11. import os  
  12.     
  13.     
  14. def gain_html_content(url):  
  15.     """获取网页的html内容 
  16.         url:url地址 
  17.         content:返回的面内容 
  18.     """  
  19.     构建  
  20.     headers = {  
  21.         "User-Agent""Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36"  
  22.     }  
  23.     request = urllib.request.Request(url, headers=headers)  
  24.     发送请求  
  25.     response = urllib.request.urlopen(request)  
  26.     读取文件  
  27.     content = response.read().decode('utf-8')  
  28.     return content  
  29.     
  30.     
  31. def get_chapter(content):  
  32.     先构建一个soup对象  
  33.     soup = BeautifulSoup(content, "lxml")  
  34.     获取小说的标题  
  35.     title = soup.title.string  
  36.     找到小的内容(是在div标签里面,并且这个div标签的id"list"  
  37.     content = soup.find("div", id="list")  
  38.     获取章节列表,列表里面的内容都是标签对  
  39.     chapter_list = content.find_all("a", attrs={"style": "", "href": re.compile(r"/.*\.html")})  
  40.     一个空的字典,用于存放章名称和对应url键值对  
  41.     chapter_dict = dict()  
  42.     for x in chapter_list:  
  43.         file_name = x.string  
  44.         file_url = x.attrs["href"]  获取a标签中href属性里面的  
  45.         chapter_dict[file_name] = "https://www.xs.la" + file_url  
  46.     将章字典,和标题返回  
  47.     return chapter_dict, title  
  48.     
  49.     
  50. def get_text(chapter_dict, title):  
  51.     for name, url in chapter_dict.items():  
  52.         获取页面内容  
  53.         content = gain_html_content(url)  
  54.         soup_text = BeautifulSoup(content, "lxml")  
  55.         new_content = soup_text.find("div", id="content")  
  56.     
  57.         获取soup对象中的文本信息text  
  58.         new_content = new_content.get_text()  
  59.         调用写入本地的函数  
  60.         write2file(title, name, new_content)  
  61.     
  62.     
  63. def write2file(title, file_name, content):  
  64.     """将小写入本地文件"""  
  65.     print("%s中。。。" % file_name)  
  66.     direction = title + "/" + file_name  
  67.     if not os.path.exists(title):  
  68.         os.mkdir(title)  
  69.     with open(direction + ".txt"'w') as f:  
  70.         f.write(content)  
  71.     print("%s!" % file_name)  
  72.     
  73.     
  74. def main():  
  75.     获取页面内容  
  76.     tar_url = input("请输入小说网址:")  
  77.     content = gain_html_content(tar_url)  
  78.     获取 名字:url 字典和小说标题  
  79.     dict1, title = get_chapter(content)  
  80.     获取小说内容,并写入本地txt文件  
  81.     get_text(dict1, title)  
  82.     
  83.     
  84. if __name__ == "__main__":  
  85.     main()  

4.一些说明

  • 本例中用到一些BeautifulSoup的方法,都可以在网上查得到,所以本例并未对其具体用法进行说明;
  • 本例只是一个小测试,所以还存在一些问题,比如爬到一半断网,重新爬取的时候又得从头开始,还有本例使用的是单任务,效率没有多任务高,这些问题改进就由各位去做了,本例主要目的只是展现爬取小说网的思路。

猜你喜欢

转载自www.cnblogs.com/daigua/p/9080109.html