一.Scrapy框架是基於Twisted的非同步框架,純Python實現的爬蟲框架,耦合程度低,可拓展性極強。 1.Engine引擎,處理整個系統的數據流、觸發事物、框架的核心 2.item項目,定義爬蟲爬取結果的數據結構,爬取的數據會被賦值成該item對象 3.Schedule調度器,接受engin ...
Scrapy 框架架構 |
一.Scrapy框架是基於Twisted的非同步框架,純Python實現的爬蟲框架,耦合程度低,可拓展性極強。
1.Engine引擎,處理整個系統的數據流、觸發事物、框架的核心
2.item項目,定義爬蟲爬取結果的數據結構,爬取的數據會被賦值成該item對象
3.Schedule調度器,接受engine發過來的request放入隊列,然後engine再次請求時,將request發送給engine
4.Downloader下載器,下載網頁內容,並將網頁返回給spiders
5.spiders蜘蛛,定義爬取邏輯和網頁解析規則,負責解析response提取結果並返回新的request
6.item Pipeline項目管道,負責處理由蜘蛛從網頁中抽取項目,進行清洗,驗證和存儲數據
7.Downloader Middlewares下載器中間件,主要處理engine和Downloader之間的請求及響應
8.spider Middlewares 蜘蛛中間件,主要處理spiders輸入的響應和輸出結果及新的請求
scrapy數據流 |
1.engine打開網站,向這個網站的spider請求第一個要爬取的URL
2.engine通過Scheduler以request的形式調度第一個URL
3.engine向Scheduler請求下一個要爬取的URL
4.Scheduler返回下一個要爬取的URL給engine,engine將URL通過Downloader Middlewares 轉發給Downloader下載
5.一旦頁面下載完畢,Downloader生成該頁面的Response,並將其通過Downloader Middlewares發送給Engine
6.Engine從下載器中接受Response,並將其通過Spider Middlewares發送給Spider處理
7.Spider處理Response,並返回爬取到的Item及新的Request給Engine
8.Engine將Spider返回的Item給Item Pipeline,將新的Request給Scheduler
9.重覆第2到第8步,直到Scheduler中沒有更多的Request,Engine關閉該網站,爬取接受
Scrapy項目認識 |
1.安裝Scrapy通過pip安裝 pip install Scrapy
2.創建Scrapy項目,直接通過scrapy命令 scrapy startproject XXXXX 這個命令可以在任意文件夾運行,我們在一個文件夾中用scrapy startproject Tanzhou命令生成一個Tanzhou的文件夾,再進入Tanzhou文件中,用命令scrapy genspider Tanzhous shiguangkey.com在文件夾中生成Tanzhous.py文件
3.構造請求
class TanzhousSpider(scrapy.Spider): name = 'Tanzhous' allowed_domains = ['shiguangkey.com'] baseUrl = 'https://www.shiguangkey.com/course/list?page=' offset=0 start_urls = [baseUrl + str(offset)]
4.創建Item,在items.py文件中
import scrapy class TanzhouItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() # 課程金額 money = scrapy.Field() # 課程名稱 title = scrapy.Field() #課程人數 personNum=scrapy.Field()
5.解析響應,在Tanzhous.py類的parse()方法中直接對response進行解析,並添加到item中,再返回Item。後面使用了前面offset來構造新的request,使用callback
函數再次解析request
def parse(self, response): nodes=response.xpath('.//div[@class="course-item w192 h240 fl"]') for node in nodes: item=TanzhouItem() item['money']=node.xpath('normalize-space(.//div[@class="item-line"]/span/text())').extract_first() item['title']=node.xpath('normalize-space(.//div[@class="itemcont"]/a/text())').extract_first() item['personNum']=node.xpath('.//div[@class="item-line"]/a/text()').extract_first() yield item if self.offset <24: self.offset += 1 url = self.baseUrl + str(self.offset) yield scrapy.Request(url, callback=self.parse)
6.進入目錄運行項目使用命令 scrapy crawl Tanzhous,可以運行結果,
這隻是一部分內容,通過Scrapy框架可以做到邊解析邊爬取,直到爬取結束,停止
7.可以將命令視窗爬取到的內容保存到文件,執行下麵的命令保存成json文件 scrapy crawl Tanzhous -o Tanzhous.json運行之後就可以看見json文件了
還可以通過命令輸出csv、xml、pickle、marshal格式
scrapy crawl Tanzhous -o Tanzhous.csv
scrapy crawl Tanzhous -o Tanzhous.xml
scrapy crawl Tanzhous -o Tanzhous.pickle
scrapy crawl Tanzhous -o Tanzhous.marshal
8.將結果保存到MongoDB資料庫要通過定義Item Pipeline實現,修改pipeline.py文件添加新類TextPipeline 實現process_item()方法,ItemPipeline是項目管道,前面生成的Item都要被送到ItemPipeline進行處理,也就是清理Html數據,驗證爬蟲數據,查重,再保存到資料庫中
import pymongo from scrapy.exceptions import DropItem class TextPipeline(object): def __init__(self): self.limit=50 def process_item(self, item, spider): if item['title']: if len(item['title'])>self.limit: item['title']=item['title'][0:self.limit].rstrip()+'...' return item else: return DropItem('Missing Text')
這是對數據的再處理以便保存到資料庫。同樣在pipeline.py中定義另一個Pipeline,我們實現另一個MongoPipeline如下
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): 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): self.client.close()
我們還要在setting.py中配置內容
ITEM_PIPELINES={ 'Tanzhou.pipelines.TextPipeline':300, 'Tanzhou.pipelines.MongoPipeline':400, } MONGO_URI='localhost' MONGO_DB='TanzhouW'
還要啟動mongodb資料庫,在執行爬取運行命令 scrapy crawl Tanzhous 爬取結束後MongoDB中創建了一個資料庫如下