当前位置:   article > 正文

【Python爬虫零基础入门项目】之网络小说爬取并下载_if self.server in each.get('href')

if self.server in each.get('href')

作者|Panda
来源|机器学习与Python编程

前言

本文将以最简单粗暴的方式让你了解写python爬虫的基本流程【下载《笔趣阁》网络小说《伏天氏》】,涉及到內库或第三方库的基本方法不会详细讲解,如有需要可关注留言(根据情况考虑专门写一篇爬虫常用库的讲解),也可自行查阅。【本文只针对未入门且想了解python爬虫的小伙伴】

网络爬虫简介

网络爬虫,也叫网络蜘蛛(Web Spider)。它根据网页地址(URL)爬取网页内容,而网页地址(URL)就是我们在浏览器中输入的网址。
比如:https://www.baidu.com/,就是一个URL。在讲爬虫实战之前,我们需要先了解写爬虫的必备技能:
审查元素(如果了解过HTML,可忽略这部分内容)。

准备工作

  1. python安装(强烈推荐Anaconda,如果需要在机器学习与Python编程后台回复Anaconda即可)
  2. urllib库是python内置的,无需安装,只要安装了Python就可以使用这个库。requests、Beautiful Soup库是第三方库,需要我们自己pip install requests、pip install Beautiful Soup4来安装(这时候如果安装Anaconda的好处就来了,这两个库都不需要单独安装!!)。

牛刀小试

  1. 第一步,获取第一章的HTML信息。URL:https://www.jupindai.com/book/87/27486785.html
    代码如下
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 28 14:57:15 2020
@author: Acc²
"""
import requests
if __name__ == "__main__":
#爬取<伏天氏>第一章
    url = "https://www.jupindai.com/book/87/27486785.html"
    req = requests.get(url)
    req.encoding = req.apparent_encoding #避免中文乱码
print(req.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

以下是运行结果:
在这里插入图片描述
这就是第一章的html信息了。如何把我们需要的内容从这些众多的html标签中提取出来呢?接着往下看。。。

  1. 第二步:提取正文
    仔细观察网站源码,我们可以发现:class属性为panel-body的div标签唯一。这个标签里面存放的内容,是我们需要的部分。这样,我们就可以使用Beautiful Soup提取我们需要的内容了,代码如下:
# -*- coding: utf-8 -*-
"""
Created on Sat Mar 28 14:57:15 2020
@author: Acc²
"""
import requests
from bs4 import BeautifulSoup
if __name__ == "__main__":
#爬取<伏天氏>第一章
    url = "https://www.jupindai.com/book/87/27486785.html"
    req = requests.get(url)
    req.encoding = req.apparent_encoding #避免中文乱码
    html = req.text
    bf = BeautifulSoup(html)
#获得html信息中所有class属性为panel-body的div标签
    texts = bf.find_all('div', class_ = 'panel-body')
#提取匹配结果后,使用text属性,提取文本内容,滤除br标签。随后使用replace方法,剔除空格,替换为回车进行分段。 
#在html中是用来表示空格的。replace('\xa0'*8,'\n\n')就是去掉八个空格符号,并用回车代替
print(texts[0].text.replace('\xa0'*8,'\n\n')) # find_all匹配的返回的结果是一个列表

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

运行结果如下:在这里插入图片描述
可以看到,我们已经匹配到了所有正文内容,并进行了分段。而要想下载整本小说,就需要获取每个章节的链接,下面我们继续。。。。

Python爬虫实例

1.分析:通过审查元素,我们发现可以发现,这些章节都存放在了class属性为panel panel-default的div标签下。也就是说每章的链接放在了class属性为panel panel-default的div 标签下的a标签中。具体位置是html->body->div->dl->dd->a的href属性中。先匹配class属性为panel panel-default的div标签,再匹配a标签。
2. 有了前面的铺垫,接下来我贴出完整的代码,如果依然有不明白的地方,欢迎以任何方式联系我交流。

# -*- coding:UTF-8 -*- 
from bs4 import BeautifulSoup 
import requests, sys 
"""
类说明:下载《笔趣阁》网络小说《伏天氏》
"""
class downloader(object):
    def __init__(self):
        self.server = 'https://www.jupindai.com/'
        self.target = 'https://www.jupindai.com/book/87.html'
        self.names = []            #章节名
        self.urls = []            #章节链接
        self.nums = 0            #章节数    
        """
    	函数说明:获取下载链接
   	"""
    def get_download_url(self):
        req = requests.get(url = self.target)
        req.encoding = req.apparent_encoding #转为utf-8编码
        html = req.text
        div_bf = BeautifulSoup(html)
        div = div_bf.find_all('div', class_ = 'panel panel-default')
        a_bf = BeautifulSoup(str(div))
        a = a_bf.find_all('a')
        self.nums = len(a[4:])     #剔除不必要的章节,并统计章节数(根据需要修改)
        for each in a[4:]:
            self.names.append(each.string)
            self.urls.append(self.server + each.get('href'))    """
    函数说明:获取章节内容
    Parameters:
        target - 下载连接(string)
    Returns:
        texts - 章节内容(string)
    """
    def get_contents(self, target):
        req = requests.get(url = target)
        req.encoding = req.apparent_encoding #转为utf-8编码
        html = req.text
        bf = BeautifulSoup(html)
        texts = bf.find_all('div', class_ = 'panel-body')
        texts = texts[0].text.replace('\xa0'*8,'\n\n')
        return texts    
        """
    	函数说明:将爬取的文章内容写入文件
    	Parameters:
    	name - 章节名称(string)
        path - 当前路径下,小说保存名称(string)
        text - 章节内容(string)
    	"""
    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):
        dl.writer(dl.names[i], '伏天氏.txt', dl.get_contents(dl.urls[i]))
        sys.stdout.write("  已下载:%.3f%%" %  float(i/dl.nums*100) + '\r')
        sys.stdout.flush()
    print('《伏天氏》下载完成。欢迎关注微信公众:机器学习与Python编程')
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

在这里插入图片描述
接下来等着下载完就好了。如果只是为了学习,那么下载个几章看看效果也就OK了。
希望这篇文章能对你入门爬虫有一定的帮助,后面也会继续在公众号和博客上更新一些关于机器学习与Python编程的文章。若觉得有那么一点帮助,欢迎支持下下,谢谢!!
如有问题,欢迎留言。如有错误,欢迎指正,感谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/825102
推荐阅读
相关标签
  

闽ICP备14008679号