网站首页 > 基础教程 正文
一次爬多篇文章,逻辑是先从主网址爬到每篇文章的网址,再从各个网址处爬取文章,很简单的静态网页爬取,不需考虑反扒问题。话不多说,直接案例说话。
实例:从https://www.biquge.com.cn/book/24032/,爬取小说的全部章节的内容。
实现方法:requests 访问 + BeautifulSoup解析
1、目标网址是静态网页,浏览网址和数据网址相同,可直接使用。
import requests # 导入requests库
from bs4 import BeautifulSoup # 导入BeautifulSoup库
url = ''https://www.biquge.com.cn/book/23341/'' # 准备好目标网址
2、requests 访问网址获得网页
打开浏览器控制台,查看Network下的Response发现有我们需要用的章节的标题和链接,用requests访问网址,就是为了获取下图中response界面下红框的内容。
requests 访问网址代码:
import requests
from bs4 import BeautifulSoup
url = ''https://www.biquge.com.cn/book/23341/''
response= requests.get(url) # requests访问网址,获得的内容放入response
获得的内容放入response变量(自定义,可随意取)里。
3、BeautifulSoup解析网页获得内容
用BeautifulSoup解析response变量里的内容,方法为:
import requests
from bs4 import BeautifulSoup
url = ''https://www.biquge.com.cn/book/23341/''
response= requests.get(url)
soup = BeautifulSoup(response.content, 'lxml') # BeautifulSoup解析response里的内容,放入soup里
现在网页内容已经被赋值到变量soup了,此时若打印s,会得到上面图2红框的内容。
4、解析内容爬取小说名,并用其创建一个文件夹,以备放后面下载的小说正文
通过在response里查找,我们发现标题在图3如下位置有出现:
booktitle = soup.find('h1').text
if not os.path.isdir(booktitle): # 判断当前文件夹下是否存在和小说名同名的文件夹
os.makedirs(booktitle) # 若不存在,则创建小说同名文件夹
5、继续用BeautifulSoup解析soup内容,获得章节标题及网址
继续在图2response里查找,发现章节信息都在dd标签下的a标签里,如图5:
提取章节标题和链接代码:
import requests
from bs4 import BeautifulSoup
......
......
dd = soup.find_all('dd')
for i in range(len(dd)):
title = dd[i].find('a').text # 获得章节名
chap_url = dd[i].find('a')['href'] # 获得章节链接
print(title, ': ", chap_url) # 临时打印查看效果如下图
5、循环遍历访问章节链接,获得小说正文
通过上面的操作,我们获得了每一章节页面的具体网址链接,继续用requests访问链接,就能获得小说的网页页面,接着用BeautifulSoup解析获得小说内容。我们可用简单方法,快速找到小说内容所在位置:在小说页面正文区域右键单击,选择“检查”或“审查元素”,会自动弹出浏览器控制台并高亮显示的正文在网页页面里的位置,分析确定提取参数即可。
通过上面的操作,我们能轻松的找到小说文本在网页里的位置,并能知道两个参数,标签:'div';id:'content',然后通过这两个参数提取出小说文本。
import requests
from bs4 import BeautifulSoup
......
......
for i in range(len(dd)):
if i == 2: # 临时设置只看第3篇文章的打印效果,用于调试
title = dd[i].find('a').text
chap_url = dd[i].find('a')['href']
response1 = requests.get('https://www.biquge.com.cn' + chap_url) #访问链接
soup1 = BeautifulSoup(response1.content, 'lxml') # 获得网页
text = soup1.find('div', id='content').text #解析网页获得小说正文
print(text) # 试打印看效果
6、保存结果
f = open(path + '/' + title + '.txt', 'a+', encoding='utf-8') # 设置章节标题为文件名
f.write(text) # 写入小说正文
至此,代码完成,能放心下载了。
7、运行效果
我们在完整代码里,设置一次性下载100章节的代码,来看看下载的效果。完整代码:
import requests, os
from bs4 import BeautifulSoup
url = 'https://www.biquge.com.cn/book/23341/'
response = requests.get(url)
soup = BeautifulSoup(response.content, 'lxml')
booktitle = soup.find('h1').text
if not os.path.isdir(booktitle): # 判断当前文件夹下是否存在和小说名同名的文件夹
os.makedirs(booktitle) # 若不存在,则创建小说同名文件夹
dd = soup.find_all('dd')
for i in range(len(dd)):
if i < 100:
title = dd[i].find('a').text
chap_url = dd[i].find('a')['href']
response1 = requests.get('https://www.biquge.com.cn' + chap_url)
soup1 = BeautifulSoup(response1.content, 'lxml')
text = soup1.find('div', id='content').text
f = open(booktitle + '/' + title + '.txt', 'a+', encoding='utf-8')
f.write(text)
print("正在下载《 {} 》...... {} / {} ".format(title, i+1, len(dd)))
else:
break
print('本次共下载 {} 章, 保存地址:{}'.format(i, os.getcwd() + '\\' + booktitle + '\\'))
运行效果:
猜你喜欢
- 2024-11-02 零基础学习Python,看完这10个案例,让你快速上手掌握Python语言
- 2024-11-02 分享Python20个练手经典案例(附答案)
- 2024-11-02 想从零开始学 Python?这些实践案例你绝不能错过
- 2024-11-02 百看不如一练!247个python实战案例
- 2024-11-02 python集合常见运算案例解析(内含实用小工具)
- 2024-11-02 Python零基础入门的两个经典案例,资深程序员都会经历的过程
- 2024-11-02 练手的70个超火python小项目,小编建议收藏哦,送你们玩去吧
- 2024-11-02 分享3个干货满满的Python实战项目,点赞收藏
- 2024-11-02 十年Python大牛花了三天总结出来的python基础知识实例,超详细
- 2024-11-02 这是我见过最好的python100道练习题(附带答案链接)
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- 单例 (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)