quotes.py
# -*- coding: utf-8 -*- import scrapy from tutorial.items import QuoteItem class QuotesSpider(scrapy.Spider): # name用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字 name = 'quotes' # 允许爬取的域名 allowed_domains = ['quotes.toscrape.com'] # start_urls包含了Spider在启动时进行爬取的url列表。 start_urls = ['http://quotes.toscrape.com/'] ''' parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。 ''' def parse(self, response): quotes = response.css('.quote') for quote in quotes: item = QuoteItem() # extract_first() 获取列表的第一个元素 item['text'] = quote.css('.text::text').extract_first() item['author'] = quote.css('.author::text').extract_first() # extract()获取所有列表 item['tags'] = quote.css('.tags .tag::text').extract() yield item next = response.css('.pager .next a::attr(href)').extract_first() # urljoin()将相对url构造成绝对url url = response.urljoin(next) ''' scrapy.Request构造请求 url:请求连接 callback:回调函数 ''' yield scrapy.Request(url=url, callback=self.parse)
items.py
import scrapy class QuoteItem(scrapy.Item): text = scrapy.Field() author = scrapy.Field() tags = scrapy.Field()
pipeline.py
from scrapy.exceptions import DropItem class TextPipeline(object): def __init__(self): self.limit=50 def process_item(self, item, spider): if item['text']: if len(item['text']) >= self.limit: item['text'] = item['text'][0:self.limit].rstrip() + '....' return item['text'] else: return DropItem('Missing Text') import pymongo class MongoPipeline(object): def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db # 通过crawler拿到全局配置的每个配置信息 @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DB') ) def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = pymongo.MongoClient(self.mongo_db) def process_item(self, item, spider): ''' __name__, 如果是放在Modules模块中,就表示是模块的名字; 如果是放在Classs类中,就表示类的名字 ''' name = item.__class__.__name__ self.db[name].insert(dict(item)) return item def close_spider(self, spider): self.client.close()
在setting中加入:
ITEM_PIPELINES = { 'tutorial.pipelines.TextPipeline': 300, 'tutorial.pipelines.MongoPipeline': 400, } MONGO_URI = 'localhost' MONGO_DB = 'tutorial'