Scrapy框架基本使用

一 :创建scrapy项目

scrpay startproject  xxx

二:创建Spider

例如创建一个名为quotes的,爬取http://quotes.toscrape.com 的spider

scrapy genspider quotes quotes.toscrape.com

查看生成的文件 quotes.py

# -*- coding: utf-8 -*-
import scrapy

from tutorial.items import QuoteItem


class QuotesSpider(scrapy.Spider):
    name = 'quotes' #项目唯一名字,用来区分不同的spider
    allowed_domains = ['quotes.toscrape.com'] # 
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        pass

name ,它是每个项目唯一的名字,用来区分不同的 Spider


allowed domains ,它是允许爬取的域名,如果初始或后续的请求链接不是这个域名下的,则请求链接会被过滤


start_urls ,它包含了 Spider 在启动时爬取的 url 列表,初始请求是由它来定义的 parse ,它是 Spider 一个方法 默认情况下,被调用时 start_urls 里面的链接构成的请求完 成下载执行后,返回的响应就会作为唯一的参数传递给这个函数 该方法负责解析返回的响 应、提取数据或者进一步生成要处理的请求

三:创建item

Item 是保存爬取数据的容器,它的使用方法和字典类似 不过,相比字典, Item 多了额外的保护机制,可以避免拼写错误或者定义字段错误

创建 Item 需要继承 scrapy.Item 类,并且定义类型为 scrapy.Field 字段 观察目标网站,我们可以获取到到内容有 text author tags 定义 Item ,此时将 items.py 修改如下

# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class QuoteItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    text = scrapy.Field()
    author = scrapy.Field()
    tags = scrapy.Field()
    pass

四:解析Response,以及后续Requests

解析网站,并且进行翻页操作,用到了css选择器

# -*- coding: utf-8 -*-
import scrapy

from tutorial.items import QuoteItem


class QuotesSpider(scrapy.Spider):
    name = 'quotes' #项目唯一名字,用来区分不同的spider
    allowed_domains = ['quotes.toscrape.com'] #
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        quotes = response.css('.quote')
        for quote in quotes:
            item = QuoteItem()
            item['text'] = quote.css('.text::text').extract_first()
            item['author'] = quote.css('.author::text').extract_first()
            item['tags'] = quote.css('.tags .tag::text').extract()
            yield item

        next = response.css('.pager .next a::attr(href)').extract_first()
        url = response.urljoin(next)
        yield scrapy.Request(url=url,callback=self.parse)
url :它是请求链接
callback :它是回调函数 当指定了该回调函数的请求完成之后,获取到响应,引擎会将该响应作为参数传递给这个回调函数 回调函数进行解析或生成下个请求,回调函数如上文的parse()所示

五:运行并保存文件

scrapy carwl quotes

scrapy crawl quotes -o quotes.json 支持多种格式

六:使用pipelines

如果想进行更复杂的操作,如将结果保存到 MongoDB 数据库,或者筛选某些有用的Item ,可以定义Item Pileline来实现item Pipeline 为项目管道 Item 生成后,它会自动被送到 Item Pipeline 进行处理,我们常用 Item Pipeline 来做如下操作 
清理 HTML 数据 
验证爬取数据,
检查爬取字段 
查重井丢弃重复内容
 
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
from scrapy.exceptions import DropItem
import pymongo

class TextPipeline(object):
    def __init__(self): #长度限制判断
        self.limit = 50

# proces_item()方法必须返回包含数据的字典或者item对象,或者抛出drop_item异常
# process_item()方法必须有两个参数,一个参数是item,每次Spider生成的Item都会作为参数传递过来。另一个参数就是spider,就是Spider实例

    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
        else:
            return  DropItem('Missing Text') # text不存在 直接舍弃

# MongoPieline类实现了API定义的另外几个方法
# from_crawler。它是一个类方法,用@classmethod标识,是一种依赖注入的方式,它的参数就是crawler,通过crawler
# 我们可以拿到全局配置的每个配置信息。


class MongoPipeline(object): #保存到数据库

    def __init__(self,mongo_url,mongo_db): #定义全局变量
        self.mongo_url = mongo_url
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls,crawler):
        return cls(                                             #返回构造函数的调用
            mongo_url= crawler.settings.get('MONGO_URL'),       #从setting中调取
            mongo_db = crawler.settings.get('MONGO_DB')
        )

    def open_spider(self,spider):          #爬虫启动时需要进行的操作 mongodb初始化对象的声明
        self.client = pymongo.MongoClient(self.mongo_url)
        self.db = self.client[self.mongo_db]

    def process_item(self,item,spider):  # 插入数据库的操作
        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': 301,
}
MONGO_url = 'localhost'
MONGO_DB = 'tutorial'

 

 

如有疑问添加微信:ysc294736613 无偿解答

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值