帮我写代码爬取豆瓣读书Top250对应书籍的封面,并保存到数据文件book_top250.txt
时间: 2024-10-11 21:12:09 浏览: 36
为了帮助您完成这个任务,我们将使用Python的requests库来获取HTML内容,BeautifulSoup库来解析网页,以及PIL库来处理图片。由于豆瓣网站有反爬虫机制,可能需要设置User-Agent并添加一些延时以避免被封IP。这里给出一个基础的示例,需要注意的是实际操作前请确认是否遵守豆瓣的使用协议:
```python
import requests
from bs4 import BeautifulSoup
import time
from PIL import Image
# 豆瓣图书Top250页面URL
url = "https://book.douban.com/top250"
# 将结果保存的文本文件路径
output_file = 'book_top250.txt'
def save_cover(book_id, img_url):
response = requests.get(img_url, headers={'User-Agent': 'Mozilla/5.0'})
if response.status_code == 200:
with open(f'{book_id}.jpg', 'wb') as f:
f.write(response.content)
# 使用Image模块打开并验证图片大小,这里假设图片大小合理
try:
image = Image.open(f'{book_id}.jpg')
# 检查图片尺寸,根据实际情况调整
if image.size[0] > 200 and image.size[1] > 200:
image.save(f'{book_id}.jpg', quality=90) # 保存优化后的图片
else:
print(f"图片{book_id}尺寸不达标,已忽略")
except Exception as e:
print(f"处理图片{book_id}时发生错误:{e}")
else:
print(f"无法下载图片 {img_url}")
# 解析HTML获取每个书籍的信息
response = requests.get(url)
soup = BeautifulSoup(response.text, 'lxml')
for i, book in enumerate(soup.find_all('div', class_='pic')):
book_id = f'Top250_{i + 1}' # 假设书籍ID在列表中的位置上
cover_url = book.find('a')['href'].split('/')[-1]
save_cover(book_id, f'https://book.douban.com/{cover_url}')
# 将书名等其他信息也加入输出文件,这里仅演示了如何获取和保存封面
with open(output_file, 'w', encoding='utf-8') as f:
for i, book in enumerate(soup.find_all('div', class_='title')):
title = book.a.text
f.write(f"{book_id}: {title}\n")
print("图片抓取和保存完成,结果已保存到 book_top250.txt.")
阅读全文