3.豆瓣图书短评 要求爬取豆瓣读书TOP250前2页的(50本)书籍的短评数据(包括书名、评论ID、短评内容),并存成Excel. 提示:scrapy库,构建新的requests对象,定义新的res
时间: 2024-11-04 10:11:49 浏览: 2
在Python中,你可以使用Scrapy库来爬取豆瓣图书的短评数据。首先,确保已经安装了Scrapy和相关的中间件如`lxml`和`pandas`,用于解析HTML和数据分析。以下是一个基本步骤:
1. **创建项目**:
使用命令行工具创建一个新的Scrapy项目:
```
scrapy startproject doubaotop250
```
2. **生成spider**:
进入项目文件夹,并生成一个新的spider:
```
cd doubaotop250
scrapy genspider doubook douban.com/top250
```
确保将spider名字和URL修改为你需要的。
3. **编辑Spider**:
打开刚刚生成的`douban.py`文件,设置开始抓取的URL(通常是第二页的URL),并定义解析函数。这里假设每一页有10本书,每本书包含标题和短评链接:
```python
import scrapy
class DouBookSpider(scrapy.Spider):
name = "doubook"
allowed_domains = ["douban.com"]
start_urls = ['https://book.douban.com/top250?start=0&limit=10'] # 修改为实际页面地址
def parse(self, response):
for book in response.css('.item'):
title = book.css('span[itemprop="name"]::text').get()
review_link = book.css('.reviewlink a::attr(href)').get()
# 创建新的请求获取短评
yield scrapy.Request(review_link, callback=self.parse_review, meta={'title': title})
def parse_review(self, response):
title = response.meta['title']
review_id = response.url.split('/')[-1]
content = response.css('.comment .short::text').get() # 假设短评内容在这CSS选择器下
yield {
'title': title,
'review_id': review_id,
'content': content,
}
# 如果还有更多评论,检查是否有“下一页”链接,若有则继续抓取
next_page = response.css('.next')
if next_page:
yield response.follow(next_page.css('a::attr(href)').get(), self.parse)
```
4. **保存到CSV或Excel**:
抓取完成后,使用`pandas`将数据转换为DataFrame并保存为Excel文件:
```python
import pandas as pd
def close_spider(spider, reason):
data = pd.DataFrame.from_dict(spider.crawled_data)
data.to_excel('douban_reviews.xlsx', index=False)
# 在settings.py中添加关闭回调
scrapy.exporters.CSVFeed exporter = CloseSpiderMiddleware(output=close_spider)
```
5. **运行爬虫**:
在命令行中运行爬虫,它会自动下载数据并存储为Excel文件:
```
scrapy crawl doubook -o douban_reviews.xlsx
```
注意:实际的网页结构可能会变化,所以你需要查看目标网站的HTML代码来调整CSS选择器。同时,频繁抓取可能会受到豆瓣服务器的限制,记得遵守网站的robots.txt规则和使用合适的延迟。
阅读全文