赞
踩
作者|Panda
来源|机器学习与Python编程
本文将以最简单粗暴的方式让你了解写python爬虫的基本流程【下载《笔趣阁》网络小说《伏天氏》
】,涉及到內库或第三方库的基本方法不会详细讲解,如有需要可关注留言(根据情况考虑专门写一篇爬虫常用库的讲解),也可自行查阅。【本文只针对未入门且想了解python爬虫的小伙伴】
网络爬虫
,也叫网络蜘蛛(Web Spider)。它根据网页地址(URL)爬取网页内容,而网页地址(URL)就是我们在浏览器中输入的网址。
比如:https://www.baidu.com/,就是一个URL。在讲爬虫实战之前,我们需要先了解写爬虫的必备技能:
审查元素(如果了解过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标签中提取出来呢?接着往下看。。。
# -*- 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.分析:通过审查元素,我们发现可以发现,这些章节都存放在了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编程')
接下来等着下载完就好了。如果只是为了学习,那么下载个几章看看效果也就OK了。
希望这篇文章能对你入门爬虫有一定的帮助,后面也会继续在公众号和博客上更新一些关于机器学习与Python编程的文章。若觉得有那么一点帮助,欢迎支持下下,谢谢!!
如有问题,欢迎留言。如有错误,欢迎指正,感谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。