使用Scrapy采集《豆瓣读书 Top 250》的图书数据,items.py,子目录文件,要求采集每本图书的数据,包括图书名、评分、作者、出版社和出版年份
时间: 2023-06-10 11:06:00 浏览: 55
首先,在 Scrapy 项目中创建一个名为“douban”的爬虫,然后在 items.py 文件中定义一个名为“BookItem”的类,包括以下字段:
```python
import scrapy
class BookItem(scrapy.Item):
title = scrapy.Field()
rating = scrapy.Field()
author = scrapy.Field()
publisher = scrapy.Field()
pub_year = scrapy.Field()
```
接着,在 Spider 中使用 Scrapy 的选择器和 XPath 表达式来提取数据。首先需要在 start_requests 方法中生成请求:
```python
class DoubanSpider(scrapy.Spider):
name = 'douban'
allowed_domains = ['book.douban.com']
start_urls = ['https://book.douban.com/top250']
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse)
```
然后,在 parse 方法中使用选择器和 XPath 表达式来提取数据:
```python
def parse(self, response):
books = response.xpath('//tr[@class="item"]')
for book in books:
item = BookItem()
item['title'] = book.xpath('.//div[@class="pl2"]/a/@title').extract()
item['rating'] = book.xpath('.//span[@class="rating_nums"]/text()').extract()
item['author'] = book.xpath('.//div[@class="pl"]/text()').extract()
item['publisher'] = book.xpath('.//p[@class="pl"]/text()')[0]\
.re(r'(?<=\/).*(?=\/)')[0].strip()
item['pub_year'] = book.xpath('.//p[@class="pl"]/text()')[0]\
.re(r'\d{4}')[0]
yield item
```
其中,books 是一个选择器对象,包含了网页中所有的书籍信息。然后,对于每一本书,创建一个新的 BookItem 对象,并使用 XPath 表达式从选择器中提取数据。对于出版社和出版年份,需要使用正则表达式来进一步提取。
最后,可以使用 Scrapy 的命令行工具来运行爬虫,并将结果保存到一个 JSON 文件中:
```
scrapy crawl douban -o books.json
```