使用scrapy采集豆瓣读书评分在9分以上的图书数据,要求采集每本图书的数据,包括图书名、评分、作者、出版社和出版年份。将获取的信息保存为本地的XML格式文件。要求写出具体代码
时间: 2024-10-08 15:03:11 浏览: 37
使用Scrapy抓取豆瓣读书评分在9分以上的图书数据并保存为XML文件,首先需要安装Scrapy库,然后创建一个新的Scrapy项目,并配置好爬虫。以下是一个基本的步骤和代码示例:
1. **安装依赖**
如果还未安装Scrapy,可以在命令行输入`pip install scrapy`。
2. **创建新项目**
打开终端或命令提示符,创建一个新的Scrapy项目:
```
scrapy startproject douban_books
```
3. **进入项目目录**
```
cd douban_books
```
4. **创建一个新的Spider**
在`spiders`文件夹下创建一个名为`book_spider.py`的文件,并添加以下代码:
```python
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from bs4 import BeautifulSoup
class BookSpider(CrawlSpider):
name = 'book_spider'
allowed_domains = ['book.douban.com']
start_urls = ['https://book.douban.com/top250']
rules = (
Rule(LinkExtractor(allow=r'/subject/\d+/'), callback='parse_book', follow=True),
)
def parse_book(self, response):
book_data = {}
# 解析HTML结构找到相关信息
soup = BeautifulSoup(response.text, 'lxml')
title = soup.find('span', class_='title').text
rating = soup.find('span', property='v:average')['content'] # 评分
author = soup.select_one('.info > a.author').text
publisher = None # 豆瓣上可能没有明确的出版社信息,这里暂为空
pub_year = None # 同样没有直接的年份信息,可以尝试提取书籍简介里的时间点,但不一定准确
if publisher or pub_year:
book_data['出版社'] = publisher
book_data['出版年份'] = pub_year
book_data['书名'] = title
book_data['评分'] = rating
yield {
'url': response.url,
'book_info': book_data,
}
# 如果存在更多链接,继续抓取
next_page = response.css('a.next::attr(href)').get()
if next_page is not None:
yield response.follow(next_page, self.parse_book)
```
5. **运行爬虫**
在项目根目录下运行爬虫:
```
scrapy crawl book_spider
```
6. **保存数据**
Scrapy默认会将结果存储在CSV文件中。如果你希望保存为XML格式,可以在项目的`settings.py`中更改`FEED_FORMAT`:
```python
FEED_FORMAT = 'xml'
```
然后在Spider中修改`yield`语句为:
```python
yield {'book_info': book_data}.to_xml('books.xml', encoding='utf-8')
```
7. **注意**
- 实际操作可能会遇到反爬策略(如验证码),需要处理或使用代理IP。
- 获取具体的出版社和出版年份信息可能需要更复杂的解析逻辑,这取决于网站的具体布局和变化。
- 由于版权原因,爬取数据用于个人学习目的即可,商业用途需遵守相关规定。