赞
踩
学习的原文文档
pip install beautifulsoup4
我用的是笔趣看 下载网文标志性的小说斗破苍穹
例如斗破苍穹目录地址 里面有全部章节的目录并且附带文章连接,这个给后续工作提供极大的便利
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import requests,sys
res = requests.get('https://www.biqukan.cc/article/4138/')
html = res.text
print(html)
看图可以正确拿到网页数据
有了这些数据之后就需要解析,浏览器开发者模式里面更直观
可以看到整个目录的文章都包含在div.mu_contain>ul.mulu_list>li>a
也就是说我们只要将爬取的文本解析成html,然后根据标签解析ul中class为mulu_list的文章就可以
#解析UL标签
bf_ul = BeautifulSoup(html,'html.parser')
ul = bf_ul.find_all('ul',class_='mulu_list')
print(ul)
然后再解析一次拿到ul标签中的a标签
#解析li中的a
bf_a = BeautifulSoup(str(ul[0]),'html.parser')
a = bf_a.find_all('a')
print(a)
遍历一下a标签,string拿到a标签文本,通过get a标签的href属性拿到链接
for item in a:
print(item.string,item.get('href'))
这样获取目录的内容就完成
原理同上,解析网页中对应文章的标签正文标签为div.chapter-content
解析正文
res = requests.get('https://www.biqukan.cc/article/4138/2267695.html')
html = res.text
# 解析标签为div.chapter-content
bf = BeautifulSoup(html,'html.parser')
texts = bf.find_all('div',class_='chapter-content')
# 正则表达式剔除多余的空格
texts = texts[0].text.replace('\xa0'*8,'\n\n')
print(texts)
到这里就能解析小说文章的内容了
将上面的两个方法组合一下,遍历目录的时候爬取每一章节的文本
# -*- coding:UTF-8 -*- from bs4 import BeautifulSoup import requests,sys """ 下载笔趣看小说《斗破苍穹》 """ class downloader(object): #定义参数 def __init__(self) -> None: self.server = 'https://www.biqukan.cc/' # 网站根节点 self.target = 'https://www.biqukan.cc/article/4138/' # 斗破苍穹章节目录 self.names = [] # 章节名 self.urls = [] # 章节链接 self.nums = 0 # 章节计数 #解析下载章节的URL def getDownloadUrl(self): res = requests.get(url = self.target) #获取网页目标数据 html = res.text #获取网页页面内容 #解析标签为ul.mulu_list>li>a #解析ul ul_bf = BeautifulSoup(html,'html.parser') ul = ul_bf.find_all('ul',class_='mulu_list') #解析li中的a标签 a_bf = BeautifulSoup(str(ul[0]),'html.parser') a = a_bf.find_all('a') # 获取总章节数 用于接下来的遍历 self.nums = len(a) # 遍历存储章节对应的目录及链接 for item in a: self.names.append(item.string) # 章节名字 self.urls.append(self.target+item.get('href')) #章节路径 #解析正文 def getContent(self,target:str): res = requests.get(url = target) html = res.text # 解析标签为div.chapter-content bf = BeautifulSoup(html,'html.parser') texts = bf.find_all('div',class_='chapter-content') # 正则表达式剔除多余的空格 texts = texts[0].text.replace('\xa0'*8,'\n\n') return texts # 写入文件 def saveFiles(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.getDownloadUrl() print('下载《斗破苍穹》') for i in range(dl.nums): dl.saveFiles(dl.names[i],'斗破苍穹.txt',dl.getContent(dl.urls[i])) sys.stdout.write("下载进度:%.3f%%" % float(i/dl.nums)+'\r') sys.stdout.flush() print("下载完成")
单线程爬取速度较慢,最好是晚上放着跑就行了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。