Python-Scrapy框架入门

项目架构

  • scrapy.cfg //配置文件
  • project/
    init.py
    items.py //item数据结构
    piplines.py //定义Item Pipeline的实现
    settings.py //定义项目的全局配置
    middlewares.py //定义Soider MIddlewares和 Downloader Middlewares的实现
  • spiders/
    init.py
    spider1.py
    spider2.py
    spider3.py

基本实现

创建项目

  • 创建scrapy项目:scrapy startproject tutorial(项目名称)
  • 创建Spider: 1.cd tutoria 2.scrapy genspider quotes quotes.toscrape.com
  • 创建好spider后quotes.py的内容
import scrapy
from tutorial.items import QuoteItem
class QuotesSpider(scrapy.Spider):
    name = 'quotes'//项目唯一的名字
    allowed_domains = ['quotes.toscrape.com']//允许爬取的域名
    start_urls = ['http://quotes.toscrape.com/']//爬取的url列表

    def parse(self, response)://解析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)

  • 创建Item
import scrapy
class QuoteItem(scrapy.Item):
    text=scrapy.Field()
    author=scrapy.Field()
    tags=scrapy.Field()

  • 进入目录,运行:scrapy crawl quotes
    结果如下

在这里插入图片描述

保存到文件

  • 保存成JSON文件:scrapy crawl quotes -o quotes.json
    Scrapy 提供的Feed Exports支持多种输出格式:csv,xml,pickle,marshal等,另外还可以通过自定义ItemExporter来实现其他的输出。
    远程输出ftp:scrapy crawl quotes -o ftp://user:pass@ftp.example.com/path/to/quotes.csv
    需要正确配置用户名,密码,地址,输出路径,否则会报错

使用Item Pipeline

  • 清理HTML数据
  • 验证爬取数据,检查爬取字段
  • 查重并丢弃重复内容
  • 将爬取结果保存到数据库

实现Item Pipeline 只需要定义一个类并实现process_item()方法即可。*process_item()方法必须返回包含数据的字典或Item对象,或者抛出DropItem异常
修改Item Pipeline.py

from scrapy.exceptions import  DropItem
class TextPipeline(object):
    def __init__(self):
        self.limit=50// 限制长度为50
    def process_item(self,item,spider):
        if item['text']:
            if len(item['text'])> self.limit:
                item['text']=item['text'][0:self.limit].rstrip()+'...'//判断长度是否大于50,ru'g'guo
            return item
        else:
            return DropItem('Missing Text')

将处理后的item存入MongoDB,定义另外一个管道,同样在pipeline.py中,内容如下

import pymongo

class MongoPipeline(object):
    def __init__(self,mongo_uri,mongo_db):
        self.mongo_uri=mongo_uri
        self.mongo_db=mongo_db
    @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)://Spider开启调用
        self.client=pymongo.MongoClient(self.mongo_uri)
        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)://Spider关闭调用
        self.client.close()

from_crawler:他是一个 类方法,用@classmethod标识 ,是一种依赖注入的方式,主要用来获取setting.py配置信息1

修改配置文件setting.py:

ITEM_PIPELINES={
    'tutorial.pipelines.TextPipeline':300,
    'tutorial.pipelines.MongoPipeline':400,
}
MONGO_URI='localhost'
MONGO_DB='tutorial'

重新执行爬取:scrapy crawl quotes


  1. 参数就是crawler,通过crawler可以拿到全局配置的每个配置信息,在全局配置setting.py中,我们可以定义MONGO_URI和MONGO_DB来指定MongoDb连接需要的地址和数据库名称。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值