一個最簡單好用的Python爬蟲框架

標題中有個“最”字环形,應(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

例子源碼:https://download.csdn.net/download/dabingsou/11958062

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末固灵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子劫流,更是在濱河造成了極大的恐慌巫玻,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祠汇,死亡現(xiàn)場離奇詭異仍秤,居然都是意外死亡,警方通過查閱死者的電腦和手機可很,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門诗力,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人我抠,你說我怎么就攤上這事苇本。” “怎么了菜拓?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵瓣窄,是天一觀的道長。 經(jīng)常有香客問我纳鼎,道長俺夕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任喷橙,我火速辦了婚禮啥么,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贰逾。我一直安慰自己悬荣,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布疙剑。 她就那樣靜靜地躺著氯迂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪言缤。 梳的紋絲不亂的頭發(fā)上嚼蚀,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音管挟,去河邊找鬼轿曙。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的导帝。 我是一名探鬼主播守谓,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼您单!你這毒婦竟也來了斋荞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤虐秦,失蹤者是張志新(化名)和其女友劉穎平酿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悦陋,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡蜈彼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叨恨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片柳刮。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖痒钝,靈堂內(nèi)的尸體忽然破棺而出秉颗,到底是詐尸還是另有隱情宏多,我是刑警寧澤院水,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布蜕煌,位于F島的核電站蝉揍,受9級特大地震影響奕枝,放射性物質(zhì)發(fā)生泄漏框咙。R本人自食惡果不足惜餐胀,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一咽筋、第九天 我趴在偏房一處隱蔽的房頂上張望晌块。 院中可真熱鬧爱沟,春花似錦、人聲如沸匆背。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钝尸。三九已至括享,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間珍促,已是汗流浹背铃辖。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留猪叙,地道東北人娇斩。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓仁卷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親成洗。 傳聞我的和親對象是個殘疾皇子五督,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容