zoukankan      html  css  js  c++  java
  • 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的方法,都可以在网上查得到,所以本例并未对其具体用法进行说明;
    • 本例只是一个小测试,所以还存在一些问题,比如爬到一半断网,重新爬取的时候又得从头开始,还有本例使用的是单任务,效率没有多任务高,这些问题改进就由各位去做了,本例主要目的只是展现爬取小说网的思路。
  • 相关阅读:
    IDEA导入项目后,导入artifacts 方法 以及 Spring的配置文件找不到的解决方法
    Tomcat8中如何内存溢出,如何增大内存?
    SpringSecurity-权限关联与控制
    学习黑马教学视频SSM整合中Security遇到的问题org.springframework.security.access.AccessDeniedException: Access is denied
    SSM项目中,关于Test类中不能使用Autowired注入bean的问题
    spring mvc绑定参数之 类型转换 有三种方式:
    maven缺失ojdbc6解决方案 :Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错
    学习SpringMVC 文件上传 遇到的问题,403:returned a response status of 403 Forbidden ,409文件夹未找到
    【转】Linux环境搭建FTP服务器与Python实现FTP客户端的交互介绍
    Protocol buffers--python 实践 简介以及安装与使用
  • 原文地址:https://www.cnblogs.com/daigua/p/9080109.html
Copyright © 2011-2022 走看看