爬虫(九):scrapy框架回顾
一:安装scrapy
a. pip3 install wheel
b. 下载twisted http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
c. 进入下载目录,执行 pip3 install Twisted‑17.1.0‑cp35‑cp35m‑win_amd64.whl
d. pip3 install scrapy
e. 下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/
二:基本操作
(1)新建工程:在创建工程之前先进入想用来保存代码的目录,然后执行
scrapy startproject xxx #创建项目
Microsoft Windows [版本 10.0.16299.309] (c) 2017 Microsoft Corporation。保留所有权利。 C:\Users\felix>cd C:\Users\felix\PycharmProjects\scrapy_quotes C:\Users\felix\PycharmProjects\scrapy_quotes>scrapy startproject quotes New Scrapy project 'quotes', using template directory 'c:\\users\\felix\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\scrapy\\templates\\project', created in: C:\Users\felix\PycharmProjects\scrapy_quotes\quotes You can start your first spider with: cd quotes scrapy genspider example example.com
执行这条命令将创建一个新目录:包括的文件如下:
scrapy.cfg:项目配置文件
quotes/:项目python模块,待会代码将从这里导入
quotes/items:项目items文件
quotes/pipelines.py:项目管道文件
quotes/settings.py:项目配置文件
quotes/spiders:放置spider的目录
(2):创建爬虫
cd quotes # 先进入项目目录
scrapy genspider name name.com # 创建爬虫
scrapy crawl name # 运行爬虫
(3):创建的爬虫类解析
import scrapy from quotes.items import QuotesItem class QuotespiderSpider(scrapy.Spider): name = 'quotespider' # 爬虫名称 allowed_domains = ['quotes.toscrape.com'] # 允许爬虫访问的域名,可以多个 start_urls = ['http://quotes.toscrape.com/'] # 爬虫开始的url地址 def parse(self, response): # 爬虫返回的数据解析函数 quotes = response.css('.quote') # 通过css选择器选择相应的内容 for quote in quotes: item = QuotesItem() # item做数据持久化的 text = quote.css('.text::text').extract_first() # ::text 表示输出文本内容 author = quote.css('.author::text').extract_first() # ::text 表示输出文本内容 tags = quote.css('.tags .tag::text').extract() # extract_first() 表示找第一个,extract()表示找到所有,并返回一个列表 item['text'] = text # 赋值 首先要在items类中创建 item['tags'] = tags item['author'] = author yield item # 生成item 做数据存储 next = response.css('.pager .next a::attr(href)').extract_first() # 得到相对的url url = response.urljoin(next) # 获取一个绝对的url,获取下一页的url yield scrapy.Request(url=url, callback=self.parse) # 处理链接,将返回的response交给callback的回调函数 # scrapy shell quotes.toscrape.com # 进入命令行调试 # scrapy crawl quotes -o quotes.json(.csv .xml) # 数据保存,可以保存多个类型
(4):items类解析
Items是将要装载抓取的数据的容器,它工作方式像python里面的字典,但它提供更多的保护,比如对未定义的字段填充以防止拼写错误。
它通过创建一个scrapy.item.Item类来声明,定义它的属性为scrpy.item.Field对象,就像是一个对象关系映射(ORM).
我们通过将需要的item模型化,来控制获得的站点数据,比如我们要获得站点的名字,url和网站描述,我们定义这三种属性的域。要做到这点,我们编辑在quotes目录下的items.py文件,我们的Item类将会是这样
import scrapy class QuotesItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() text=scrapy.Field() #创建文本字段 author=scrapy.Field() # 创建作者字段 tags=scrapy.Field() # 创建标签字段
(5):pipeline类解析
import pymongo from scrapy.exceptions import DropItem # 要使用pipline一定要在设置中指定 class QuotesPipeline(object): def process_item(self, item, spider): return item # 一个pipeline要么返回item 要么返回dropitem class TextPipeline(object): def __init__(self): self.limit = 50 def process_item(self, item, spider):
# 这里的item为item类中的item
# 大于50字的文本进行处理 if item['text']: if len(item['text']) > self.limit: item['text'] = item['text'][0:self.limit].rstrip() + '...' return item else: return DropItem('Missing Text') # 添加数据库的操作 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'), mongo_db=crawler.settings.get('MONGO_DB') ) def open_spider(self, spider): # 启动爬虫时做的操作
# 初始化数据库 self.client = pymongo.MongoClient(self.mongo_url) self.db = self.client[self.mongo_db]
# 处理item的方法,必须实现返回item或者dropitem def process_item(self, item, spider): name = item.__class__.__name__ # item的名称 self.db[name].insert(dict(item)) return item def close_spider(self, spider): self.client.close() # 结束爬虫时关闭数据库
(6):运行
scrapy crawl quotespider。