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