爬取https://bbs.zol.com.cn/dcbbs/d15.html 该网站的图片要求将 ZOL论坛 > 摄影论坛 > 摄影作品论坛 > 动物植物论坛 该论坛模块下所有帖子的图片爬取回来,每个帖子一个文件夹(文件夹名使用帖子名命名),文件夹中存放该帖子中所有图片例如以上“八色鸫”帖子中只有一张图片,我们需要建一个名为“八色鸫”的文件夹,然后将帖子中的图片存入其中。图片文件命名可以使用数字编号。
时间: 2024-03-29 21:40:43 浏览: 131
爬取指定论坛下的所有帖子及其图片需要多级爬取。首先爬取论坛首页,然后获取每个子版块的链接,在子版块中爬取所有帖子的链接,最后在每个帖子页面中爬取所有图片链接。代码如下:
```python
import os
import requests
from bs4 import BeautifulSoup
# 论坛首页
url = 'https://bbs.zol.com.cn/dcbbs/d15.html'
# 请求头,模拟浏览器访问
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
# 发送请求并获取 HTML 文档
response = requests.get(url, headers=headers)
html_doc = response.text
# 使用 BeautifulSoup 解析 HTML 文档
soup = BeautifulSoup(html_doc, 'html.parser')
# 找到所有子版块的链接
forum_tags = soup.find_all('a', class_='forum')
# 遍历所有子版块,爬取帖子和图片
for forum in forum_tags:
forum_name = forum.text.strip() # 子版块名称
forum_url = forum['href'] # 子版块链接
# 发送请求并获取 HTML 文档
response = requests.get(forum_url, headers=headers)
html_doc = response.text
# 使用 BeautifulSoup 解析 HTML 文档
soup = BeautifulSoup(html_doc, 'html.parser')
# 找到所有帖子的链接
topic_tags = soup.find_all('a', class_='subject')
# 遍历所有帖子,爬取图片
for topic in topic_tags:
topic_name = topic.text.strip() # 帖子名称
topic_url = topic['href'] # 帖子链接
# 创建文件夹
folder_name = topic_name.replace('/', '_') # 防止帖子名称中包含 / 导致无法创建文件夹
if not os.path.exists(folder_name):
os.makedirs(folder_name)
# 发送请求并获取 HTML 文档
response = requests.get(topic_url, headers=headers)
html_doc = response.text
# 使用 BeautifulSoup 解析 HTML 文档
soup = BeautifulSoup(html_doc, 'html.parser')
# 找到所有图片的链接
img_tags = soup.find_all('img', class_='lazy')
# 遍历所有图片链接,下载并保存图片
for i, img in enumerate(img_tags):
img_url = img['data-original']
img_name = f'{i+1}.jpg'
with open(f'{folder_name}/{img_name}', 'wb') as f:
f.write(requests.get(img_url).content)
print(f'{img_name} saved successfully')
```
该代码会在当前目录下创建多个文件夹,每个文件夹对应一个帖子,文件夹名为帖子名称。帖子文件夹中存放该帖子的所有图片,图片文件名按照数字编号命名。为了防止文件夹名称中包含无法创建的特殊字符,代码中使用了字符串替换将 / 替换为 _。
阅读全文