標題中有個“最”字环形,應(yīng)該很多人都是不服氣的,不過繼續(xù)往下看,不知能不能改變您的看法卵慰。
下面以采集http://www.scrapyd.cn/為例子
from simplified_scrapy.core.spider import Spider
class ScrapydSpider(Spider):
name = 'scrapyd-spider'#定義爬蟲名稱
start_urls = ['http://www.scrapyd.cn/']#初始化入口鏈接
models = ['auto_main','auto_obj']#配置抽取模型
上面這個就是一個完整的爬蟲了,簡不簡單:)
要想運行這個爬蟲佛呻,需要用上下面的代碼:
from simplified_scrapy.simplified_main import SimplifiedMain
SimplifiedMain.startThread(ScrapydSpider())
如果想對采集做點過濾裳朋,只采集教程數(shù)據(jù),重寫下面的方法就行
#返回True表示url符合要求吓著;False表示不符合要求鲤嫡,將丟棄
def urlFilter(self,url):
return url.find('/jiaocheng/')>0# 只采集教程數(shù)據(jù)
當然上面的爬蟲例子是采集文章數(shù)據(jù)的通用型采集送挑,并且抽取出的數(shù)據(jù)并不是那么準確。我們可以自定義抽取暖眼,重寫方法extract惕耕,代碼如下:
def extract(self, url, html, models, modelNames):
try:
html = self.removeScripts(html)# 去掉腳本數(shù)據(jù),也可以不去
lstA = self.listA(html,url["url"])#抽取頁面中的鏈接
data = []
ele = self.getElementByTag("h1",html)#取標題
if(ele):
title = ele.text
ele = self.getElementByClass("cont",html,"</h1>")#取正文
if(ele):
content = ele.html
ele = self.getElementsByTag("span",html,'class="title-2"','class="cont"')#取作者和時間
author = None
time = None
if(ele and len(ele)>1):
time = ele[0].text
author = ele[1].text
data.append({"Url": url["url"], "Title": title, "Content": content, "Author":author, "Time":time})
return [{"Urls": lstA, "Data": data}]#將數(shù)據(jù)返回給框架罢荡,由框架處理
except Exception as e:
print (e)
框架集成了常用的抽取方法赡突,通常的抽取毫無壓力。那么抽取出的數(shù)據(jù)放在哪里了呢区赵?默認的情況是存放在同級目錄的文件夾data下面惭缰,格式為json,如下圖所示
存儲為文本實在是太簡單了笼才,基本不能用在生產(chǎn)環(huán)境漱受。是的,框架還提供了其他的存儲方式骡送“合郏框架默認使用sqlite存儲鏈接數(shù)據(jù)和頁面信息,用json存儲抽取出的詳情信息摔踱。如果想使用其他方式存儲虐先,可以像下面這樣做
from simplified_scrapy.core.redis_urlstore import RedisUrlStore
url_store = RedisUrlStore(name,{'host':'127.0.0.1','port':6379})
from simplified_scrapy.core.mongo_urlstore import MongoUrlStore
url_store = MongoUrlStore(name,{"multiQueue":True})
from simplified_scrapy.core.mongo_objstore import MongoObjStore
obj_store = MongoObjStore(name,{'host':'127.0.0.1','port':27017})
from simplified_scrapy.core.mongo_htmlstore import MongoHtmlStore
html_store = MongoHtmlStore(name)
框架還提供了mongodb,redis的存儲方式派敷,如果這些都滿足不了需要蛹批,可以自己實現(xiàn)不同的存儲方式。
對于頁面的存儲篮愉,需要實現(xiàn)下面幾個方法
def popHtml(self,state=0):
def saveHtml(self,url,html):
def updateState(self,id,state):
鏈接數(shù)據(jù)的存儲腐芍,需要實現(xiàn)下面的方法
def popUrl(self):
def getCount(self):
def checkUrl(self,url):
def saveUrl(self, urls,i=None):
def resetUrls(self, urls):
詳情信息的存儲,需要實現(xiàn)下面的方法
def saveObj(self, data):
下面是一個完整的例子:
from simplified_scrapy.core.spider import Spider
class ScrapydSpider(Spider):
name = 'scrapyd-spider'
start_urls = ['http://www.scrapyd.cn/']
# models = ['auto_main','auto_obj']
def urlFilter(self,url):
return url.find('/jiaocheng/')>0# 只采集教程數(shù)據(jù)
# from simplified_scrapy.core.mongo_objstore import MongoObjStore
# obj_store = MongoObjStore(name,{'host':'127.0.0.1','port':27017})
# from simplified_scrapy.core.mongo_urlstore import MongoUrlStore
# url_store = MongoUrlStore(name,{"multiQueue":True})
# from simplified_scrapy.core.mongo_htmlstore import MongoHtmlStore
# html_store = MongoHtmlStore(name)
def extract(self, url, html, models, modelNames):
try:
html = self.removeScripts(html)# 去掉腳本數(shù)據(jù)试躏,也可以不去
lstA = self.listA(html,url["url"])#抽取頁面中的鏈接
data = []
ele = self.getElementByTag("h1",html)#取標題
if(ele):
title = ele.text
ele = self.getElementByClass("cont",html,"</h1>")#取正文
if(ele):
content = ele.html
ele = self.getElementsByTag("span",html,'class="title-2"','class="cont"')#取作者和時間
author = None
time = None
if(ele and len(ele)>1):
time = ele[0].text
author = ele[1].text
data.append({"Url": url["url"], "Title": title, "Content": content, "Author":author, "Time":time})
return [{"Urls": lstA, "Data": data}]#將數(shù)據(jù)返回給框架猪勇,由框架處理
except Exception as e:
print (e)
from simplified_scrapy.simplified_main import SimplifiedMain
SimplifiedMain.startThread(ScrapydSpider())#啟動爬蟲
對于一般的爬取需求,上面的功能基本夠用了颠蕴。但是如果一次只能啟動一個爬蟲泣刹,就太不方便管理了。是的犀被,還有另一種組織方式项玛。你可以把所有爬蟲放在一個文件夾里(比如spiders),使用配置文件進行配置弱判,配置文件名稱默認為:setting.json。
{
"spiders":[
{"file":"spiders.scrapydSpider","class":"ScrapydSpider"}
]
}
然后在任意python文件中執(zhí)行下面的方法锥惋,啟動爬蟲
from simplified_scrapy.simplified_main import SimplifiedMain
SimplifiedMain.startThread()
這種方式啟動昌腰,只有在配置文件中配置了的爬蟲才會被執(zhí)行开伏。
差不多到這里,這個框架是不是簡單又好用:)
框架的安裝:
pip install simplified-scrapy
如果是Python2遭商,還需要安裝futures
pip install futures