前言
本文将以最简单粗暴的方式让你了解写python爬虫的基本流程【下载《笔趣阁》网络小说《伏天氏》
】,涉及到内库或第三方库的基本方法不会详细讲解,如有需要可关注留言(根据情况考虑专门写一篇爬虫常用库的讲解),也可自行查阅。【本文只针对未入门且想了解python爬虫的小伙伴】
网络爬虫简介
网络爬虫
,也叫网络蜘蛛(Web Spider)。它根据网页地址(URL)爬取网页内容,而网页地址(URL)就是我们在浏览器中输入的网址。
比如:https://www.baidu.com/,就是一个URL。在讲爬虫实战之前,我们需要先了解写爬虫的必备技能:
审查元素(如果了解过HTML,可忽略这部分内容)。
准备工作
- python安装(强烈推荐Anaconda,如果需要请关注微信公众号:机器学习与Python编程,后台回复Anaconda即可)
- urllib库是python内置的,无需安装,只要安装了Python就可以使用这个库。requests、Beautiful Soup库是第三方库,需要我们自己pip install requests、pip install Beautiful Soup4来安装(这时候如果安装Anaconda的好处就来了,这两个库都不需要单独安装!!)。
牛刀小试
- 第一步,获取第一章的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)
以下是运行结果:
这就是第一章的html信息了。如何把我们需要的内容从这些众多的html标签中提取出来呢?接着往下看。。。
- 第二步:提取正文
仔细观察网站源码,我们可以发现: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匹配的返回的结果是一个列表
运行结果如下:
可以看到,我们已经匹配到了所有正文内容,并进行了分段。而要想下载整本小说,就需要获取每个章节的链接,下面我们继续。。。。
Python爬虫实例
- 分析:通过审查元素,我们发现可以发现,这些章节都存放在了class属性为panel panel-default的div标签下。也就是说每章的链接放在了class属性为panel panel-default的div 标签下的a标签中。具体位置是html->body->div->dl->dd->a的href属性中。先匹配class属性为panel panel-default的div标签,再匹配a标签。
- 有了前面的铺垫,接下来我贴出完整的代码,如果依然有不明白的地方,欢迎以任何方式联系我交流。
# -*- 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编程')
接下来等着下载完就好了。如果只是为了学习,那么下载个几章看看效果也就OK了。
希望这篇文章能对你入门爬虫有一定的帮助,后面也会继续在公众号和博客上更新一些关于机器学习与Python编程的文章。若觉得有那么一点帮助,欢迎支持下下,谢谢!!
如有问题,欢迎留言。如有错误,欢迎指正,感谢!