码迷,mamicode.com
首页 > 其他好文 > 详细

scrapy之小试身手

时间:2018-04-19 00:36:26      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:依次   color   orm   mongo   parse   exception   join()   pipeline   一个   

要爬取的网址是:http://quotes.toscrape.com/

磕磕绊绊的写完了

spiders

import scrapy
from kkk.items import *

class QuoteSpider(scrapy.Spider):
    name = quote
    allowed_domains = [quotes.toscrape.com/]
    start_urls = [http://quotes.toscrape.com//]

    def parse(self, response):
        quotes = response.css(.quote)
        for quote in quotes:               #这是一个很好的方向,页面由重复的构造组成是,拿到大的框架组成的列表,然后循环,依次拿每个框架内的详细信息,yield。
            item = QuoteItem()                 #
            text = quote.css(span.text::text).extract_first()
            author = quote.css(small.author::text).extract_first()
            tags = quote.css(div.tags > a.tag::text).extract()
            item[text] = text
            item[author] = author
            item[tags] = tags
            yield item
        url = response.css(li.next > a::attr(href)).extract_first()
        next_url = response.urljoin(url)                           # response.urljoin()
        yield scrapy.Request(url=next_url,callback=self.parse)     # yield Request对象

 

  Pipeline

  收获:

   1 这里都是类,完全可以定义__init__,完全可以把一些数据 添加到其静态属性。 

import pymongo
from scrapy.exceptions import DropItem

class QuotePipeline1(object):
    def __init__(self):
        self.limit = 40
    def process_item(self,item,spider):
        if item:
            if len(item[text])>self.limit:
                item[text] = item[text][:self.limit]+...
            return item
        else:
            return DropItem({}扔掉.format(item))

class QuotePipeline2(object):
    def __init__(self,uri,port,db):
        self.uri = uri
        self.port = port
        self.db = db
    @classmethod
    def from_crawler(cls,crawler):                             # from_crawler(cls,crawler) 类方法,可以从settings中获取 值。
        mongo_uri = crawler.settings.get(MONGO_URI)
        mongo_port = crawler.settings.get(MONGO_PORT)
        mongo_db = crawler.settings.get(MONGO_DB)
        return cls(
            mongo_uri,
            mongo_port,
            mongo_db,
        )
    def process_item(self,item,spider):
        name = item.__class__.__name__                # __class__.__name__返回的是 这个数据的 类 的名成。即在items 中定义的 class QuoteItem():
        self.db[name].insert(dict(item))
        return item
    def open_spider(self,spider):
        self.client = pymongo.MongoClient(self.uri,self.port)
        self.db = self.client[self.db]
    def close_spider(self,spider):
        self.client.close()

 

scrapy之小试身手

标签:依次   color   orm   mongo   parse   exception   join()   pipeline   一个   

原文地址:https://www.cnblogs.com/654321cc/p/8878669.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!