亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久

框架網(wǎng)頁(yè)

框架網(wǎng)頁(yè)

推薦10款流行的java開(kāi)源的網(wǎng)絡(luò )爬蟲(chóng)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 366 次瀏覽 ? 2020-06-29 08:03 ? 來(lái)自相關(guān)話(huà)題

  1:JAVA爬蟲(chóng)WebCollector(Star:1345)
  爬蟲(chóng)簡(jiǎn)介: WebCollector是一個(gè)無(wú)須配置、便于二次開(kāi)發(fā)的JAVA爬蟲(chóng)框架(內核)java單機爬蟲(chóng)框架,它提供精簡(jiǎn)的的API,只需少量代碼即可實(shí)現一個(gè)功能強悍的爬蟲(chóng)。WebCollector-Hadoop是WebCollector的Hadoop版本java單機爬蟲(chóng)框架,支持分布式爬取。 爬蟲(chóng)內核: WebCollector致...
  2:開(kāi)源通用爬蟲(chóng)框架YayCrawler(Star:91)
  YayCrawler是一個(gè)基于WebMagic開(kāi)發(fā)的分布式通用爬蟲(chóng)框架,開(kāi)發(fā)語(yǔ)言是Java。我們曉得目前爬蟲(chóng)框架好多,有簡(jiǎn)單的,也有復雜的,有輕 量型的,也有重量型的
  3:垂直爬蟲(chóng)WebMagic(Star:1213)
  webmagic的是一個(gè)無(wú)須配置、便于二次開(kāi)發(fā)的爬蟲(chóng)框架,它提供簡(jiǎn)單靈活的API,只需少量代碼即可實(shí)現一個(gè)爬蟲(chóng)。 以下是爬取oschina博客的一段代碼: Spider.create(newSimplePageProcessor("", "http...
  4:雅虎開(kāi)源的Nutch爬蟲(chóng)插件 Anthelion(Star:2888)
  Anthelion 是 Nutch 插件,專(zhuān)注于爬取語(yǔ)義數據。 注意:此項目包括完整的 Nutch 1.6 版本,此插件放置在 /src/plugin/parse-anth Anthelion 使用在線(xiàn)學(xué)習方式來(lái)基于頁(yè)面上下文預測富數據 Web 頁(yè)面,從之前查看的頁(yè)面提取的元數據獲取反饋。 主要有三個(gè)擴充: AnthelionScoringFilter WdcParser TripleExtractor 示例:...
  5:Java開(kāi)源網(wǎng)路爬蟲(chóng)項目Nutch
  Nutch是一個(gè)開(kāi)源Java實(shí)現的搜索引擎。它提供了我們運行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬蟲(chóng)。 Nutch的創(chuàng )始人是Doug Cutting,他同時(shí)也是Lucene、Hadoop和Avro開(kāi)源項目的創(chuàng )始人。 Nutch誕生于2002年8月,是Apache旗下的一個(gè)用Java實(shí)現的開(kāi)源搜索引擎項目,自Nutch1.2版本以后,Nutch早已從搜索引擎演...
  6:Java網(wǎng)路蜘蛛/網(wǎng)絡(luò )爬蟲(chóng)Spiderman(Star:1801)
  Spiderman - 又一個(gè)Java網(wǎng)路蜘蛛/爬蟲(chóng) Spiderman 是一個(gè)基于微內核+插件式構架的網(wǎng)路蜘蛛,它的目標是通過(guò)簡(jiǎn)單的方式能夠將復雜的目標網(wǎng)頁(yè)信息抓取并解析為自己所須要的業(yè)務(wù)數據。 最新提示:歡迎來(lái)體驗最新版本Spiderman2,
  7:輕量化的Java網(wǎng)路爬蟲(chóng) GECCO(Star:658)
  Gecco是哪些 Gecco是一款用java語(yǔ)言開(kāi)發(fā)的輕量化的易用的網(wǎng)路爬蟲(chóng)。Gecco整合了jsoup、httpclient、fastjson、spring、htmlunit、redission等優(yōu)秀框架,讓您只須要配置一些jquery風(fēng)格的選擇器能夠很快的寫(xiě)出一個(gè)爬蟲(chóng)。Gecco框架有優(yōu)秀的可擴展性,框架基于開(kāi)閉原則進(jìn)行設計,對更改關(guān)掉、對擴充開(kāi)放。同時(shí)Gecco基于非常開(kāi)...
  8:開(kāi)源爬蟲(chóng)框架WebPasser(Star:15)
  WebPasser是一款可配置的開(kāi)源爬蟲(chóng)框架,提供爬蟲(chóng)控制臺管理界面,通過(guò)配置解析各種網(wǎng)頁(yè)內容,無(wú)需寫(xiě)一句java代碼即可抽取所需數據。 1.包含強悍的頁(yè)面解析引擎,提供jsoup、xpath、正則表達式等處理鏈,通過(guò)簡(jiǎn)單配置即可抽取所需的指定內容。 2.提供爬蟲(chóng)控制管理界面,可實(shí)時(shí)監控抓取狀...
  9:一個(gè)敏捷強悍的Java爬蟲(chóng)框架SeimiCrawler(Star:635)
  SeimiCrawler是一個(gè)敏捷的,獨立布署的,支持分布式的Java爬蟲(chóng)框架,希望能在最大程度上減少菜鳥(niǎo)開(kāi)發(fā)一個(gè)可用性高且性能不差的爬蟲(chóng)系統的門(mén)檻,以及提高開(kāi)發(fā)爬蟲(chóng)系統的開(kāi)發(fā)效率。
  10:爬蟲(chóng)系統NEOCrawler(Star:258)
  NEOCrawler(中文名:???,是nodejs、redis、phantomjs實(shí)現的爬蟲(chóng)系統。代碼完全開(kāi)源,適合用于垂直領(lǐng)域的數據采集和爬蟲(chóng)二次開(kāi)發(fā)。 【主要特征】 使用nodejs實(shí)現,javascipt簡(jiǎn)單、高效、易學(xué)、為爬蟲(chóng)的開(kāi)發(fā)以及爬蟲(chóng)使用者的二次開(kāi)發(fā)節省不少時(shí)間;nodejs讓...
  推薦10款流行的java開(kāi)源的網(wǎng)絡(luò )爬蟲(chóng) 查看全部

  1:JAVA爬蟲(chóng)WebCollector(Star:1345)
  爬蟲(chóng)簡(jiǎn)介: WebCollector是一個(gè)無(wú)須配置、便于二次開(kāi)發(fā)的JAVA爬蟲(chóng)框架(內核)java單機爬蟲(chóng)框架,它提供精簡(jiǎn)的的API,只需少量代碼即可實(shí)現一個(gè)功能強悍的爬蟲(chóng)。WebCollector-Hadoop是WebCollector的Hadoop版本java單機爬蟲(chóng)框架,支持分布式爬取。 爬蟲(chóng)內核: WebCollector致...
  2:開(kāi)源通用爬蟲(chóng)框架YayCrawler(Star:91)
  YayCrawler是一個(gè)基于WebMagic開(kāi)發(fā)的分布式通用爬蟲(chóng)框架,開(kāi)發(fā)語(yǔ)言是Java。我們曉得目前爬蟲(chóng)框架好多,有簡(jiǎn)單的,也有復雜的,有輕 量型的,也有重量型的
  3:垂直爬蟲(chóng)WebMagic(Star:1213)
  webmagic的是一個(gè)無(wú)須配置、便于二次開(kāi)發(fā)的爬蟲(chóng)框架,它提供簡(jiǎn)單靈活的API,只需少量代碼即可實(shí)現一個(gè)爬蟲(chóng)。 以下是爬取oschina博客的一段代碼: Spider.create(newSimplePageProcessor("", "http...
  4:雅虎開(kāi)源的Nutch爬蟲(chóng)插件 Anthelion(Star:2888)
  Anthelion 是 Nutch 插件,專(zhuān)注于爬取語(yǔ)義數據。 注意:此項目包括完整的 Nutch 1.6 版本,此插件放置在 /src/plugin/parse-anth Anthelion 使用在線(xiàn)學(xué)習方式來(lái)基于頁(yè)面上下文預測富數據 Web 頁(yè)面,從之前查看的頁(yè)面提取的元數據獲取反饋。 主要有三個(gè)擴充: AnthelionScoringFilter WdcParser TripleExtractor 示例:...
  5:Java開(kāi)源網(wǎng)路爬蟲(chóng)項目Nutch
  Nutch是一個(gè)開(kāi)源Java實(shí)現的搜索引擎。它提供了我們運行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬蟲(chóng)。 Nutch的創(chuàng )始人是Doug Cutting,他同時(shí)也是Lucene、Hadoop和Avro開(kāi)源項目的創(chuàng )始人。 Nutch誕生于2002年8月,是Apache旗下的一個(gè)用Java實(shí)現的開(kāi)源搜索引擎項目,自Nutch1.2版本以后,Nutch早已從搜索引擎演...
  6:Java網(wǎng)路蜘蛛/網(wǎng)絡(luò )爬蟲(chóng)Spiderman(Star:1801)
  Spiderman - 又一個(gè)Java網(wǎng)路蜘蛛/爬蟲(chóng) Spiderman 是一個(gè)基于微內核+插件式構架的網(wǎng)路蜘蛛,它的目標是通過(guò)簡(jiǎn)單的方式能夠將復雜的目標網(wǎng)頁(yè)信息抓取并解析為自己所須要的業(yè)務(wù)數據。 最新提示:歡迎來(lái)體驗最新版本Spiderman2,
  7:輕量化的Java網(wǎng)路爬蟲(chóng) GECCO(Star:658)
  Gecco是哪些 Gecco是一款用java語(yǔ)言開(kāi)發(fā)的輕量化的易用的網(wǎng)路爬蟲(chóng)。Gecco整合了jsoup、httpclient、fastjson、spring、htmlunit、redission等優(yōu)秀框架,讓您只須要配置一些jquery風(fēng)格的選擇器能夠很快的寫(xiě)出一個(gè)爬蟲(chóng)。Gecco框架有優(yōu)秀的可擴展性,框架基于開(kāi)閉原則進(jìn)行設計,對更改關(guān)掉、對擴充開(kāi)放。同時(shí)Gecco基于非常開(kāi)...
  8:開(kāi)源爬蟲(chóng)框架WebPasser(Star:15)
  WebPasser是一款可配置的開(kāi)源爬蟲(chóng)框架,提供爬蟲(chóng)控制臺管理界面,通過(guò)配置解析各種網(wǎng)頁(yè)內容,無(wú)需寫(xiě)一句java代碼即可抽取所需數據。 1.包含強悍的頁(yè)面解析引擎,提供jsoup、xpath、正則表達式等處理鏈,通過(guò)簡(jiǎn)單配置即可抽取所需的指定內容。 2.提供爬蟲(chóng)控制管理界面,可實(shí)時(shí)監控抓取狀...
  9:一個(gè)敏捷強悍的Java爬蟲(chóng)框架SeimiCrawler(Star:635)
  SeimiCrawler是一個(gè)敏捷的,獨立布署的,支持分布式的Java爬蟲(chóng)框架,希望能在最大程度上減少菜鳥(niǎo)開(kāi)發(fā)一個(gè)可用性高且性能不差的爬蟲(chóng)系統的門(mén)檻,以及提高開(kāi)發(fā)爬蟲(chóng)系統的開(kāi)發(fā)效率。
  10:爬蟲(chóng)系統NEOCrawler(Star:258)
  NEOCrawler(中文名:???,是nodejs、redis、phantomjs實(shí)現的爬蟲(chóng)系統。代碼完全開(kāi)源,適合用于垂直領(lǐng)域的數據采集和爬蟲(chóng)二次開(kāi)發(fā)。 【主要特征】 使用nodejs實(shí)現,javascipt簡(jiǎn)單、高效、易學(xué)、為爬蟲(chóng)的開(kāi)發(fā)以及爬蟲(chóng)使用者的二次開(kāi)發(fā)節省不少時(shí)間;nodejs讓...
  推薦10款流行的java開(kāi)源的網(wǎng)絡(luò )爬蟲(chóng)

干貨丨推薦八款高效率的爬蟲(chóng)框架,你用過(guò)幾個(gè)?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 434 次瀏覽 ? 2020-05-24 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  
  Scrapy
  Scrapy是一個(gè)為了爬取網(wǎng)站數據,提取結構性數據而編撰的應用框架。 可以應用在包括數據挖掘,信息處理或儲存歷史數據等一系列的程序中。。用這個(gè)框架可以輕松爬出來(lái)如亞馬遜商品信息之類(lèi)的數據。
  
  PySpider
  pyspider 是一個(gè)用python實(shí)現的功能強悍的網(wǎng)路爬蟲(chóng)系統,能在瀏覽器界面上進(jìn)行腳本的編撰,功能的調度和爬取結果的實(shí)時(shí)查看,后端使用常用的數據庫進(jìn)行爬取結果的儲存,還能定時(shí)設置任務(wù)與任務(wù)優(yōu)先級等。
  開(kāi)源地址:
  Crawley
  Crawley可以高速爬取對應網(wǎng)站的內容爬蟲(chóng)軟件 推薦爬蟲(chóng)軟件 推薦,支持關(guān)系和非關(guān)系數據庫,數據可以導入為JSON、XML等。
  
  Portia
  Portia是一個(gè)開(kāi)源可視化爬蟲(chóng)工具,可使您在不需要任何編程知識的情況下爬取網(wǎng)站!簡(jiǎn)單地注釋您感興趣的頁(yè)面,Portia將創(chuàng )建一個(gè)蜘蛛來(lái)從類(lèi)似的頁(yè)面提取數據。
  Newspaper
  Newspaper可以拿來(lái)提取新聞、文章和內容剖析。使用多線(xiàn)程,支持10多種語(yǔ)言等。
  Beautiful Soup
  Beautiful Soup 是一個(gè)可以從HTML或XML文件中提取數據的Python庫.它還能通過(guò)你喜歡的轉換器實(shí)現慣用的文檔導航,查找,修改文檔的方法.Beautiful Soup會(huì )幫你節約數小時(shí)甚至數天的工作時(shí)間。
  Grab
  Grab是一個(gè)用于建立Web刮板的Python框架。借助Grab,您可以建立各類(lèi)復雜的網(wǎng)頁(yè)抓取工具,從簡(jiǎn)單的5行腳本到處理數百萬(wàn)個(gè)網(wǎng)頁(yè)的復雜異步網(wǎng)站抓取工具。Grab提供一個(gè)API用于執行網(wǎng)路懇求和處理接收到的內容,例如與HTML文檔的DOM樹(shù)進(jìn)行交互。
  Cola
  Cola是一個(gè)分布式的爬蟲(chóng)框架,對于用戶(hù)來(lái)說(shuō),只需編撰幾個(gè)特定的函數,而無(wú)需關(guān)注分布式運行的細節。任務(wù)會(huì )手動(dòng)分配到多臺機器上,整個(gè)過(guò)程對用戶(hù)是透明的。 查看全部

  
  
  Scrapy
  Scrapy是一個(gè)為了爬取網(wǎng)站數據,提取結構性數據而編撰的應用框架。 可以應用在包括數據挖掘,信息處理或儲存歷史數據等一系列的程序中。。用這個(gè)框架可以輕松爬出來(lái)如亞馬遜商品信息之類(lèi)的數據。
  
  PySpider
  pyspider 是一個(gè)用python實(shí)現的功能強悍的網(wǎng)路爬蟲(chóng)系統,能在瀏覽器界面上進(jìn)行腳本的編撰,功能的調度和爬取結果的實(shí)時(shí)查看,后端使用常用的數據庫進(jìn)行爬取結果的儲存,還能定時(shí)設置任務(wù)與任務(wù)優(yōu)先級等。
  開(kāi)源地址:
  Crawley
  Crawley可以高速爬取對應網(wǎng)站的內容爬蟲(chóng)軟件 推薦爬蟲(chóng)軟件 推薦,支持關(guān)系和非關(guān)系數據庫,數據可以導入為JSON、XML等。
  
  Portia
  Portia是一個(gè)開(kāi)源可視化爬蟲(chóng)工具,可使您在不需要任何編程知識的情況下爬取網(wǎng)站!簡(jiǎn)單地注釋您感興趣的頁(yè)面,Portia將創(chuàng )建一個(gè)蜘蛛來(lái)從類(lèi)似的頁(yè)面提取數據。
  Newspaper
  Newspaper可以拿來(lái)提取新聞、文章和內容剖析。使用多線(xiàn)程,支持10多種語(yǔ)言等。
  Beautiful Soup
  Beautiful Soup 是一個(gè)可以從HTML或XML文件中提取數據的Python庫.它還能通過(guò)你喜歡的轉換器實(shí)現慣用的文檔導航,查找,修改文檔的方法.Beautiful Soup會(huì )幫你節約數小時(shí)甚至數天的工作時(shí)間。
  Grab
  Grab是一個(gè)用于建立Web刮板的Python框架。借助Grab,您可以建立各類(lèi)復雜的網(wǎng)頁(yè)抓取工具,從簡(jiǎn)單的5行腳本到處理數百萬(wàn)個(gè)網(wǎng)頁(yè)的復雜異步網(wǎng)站抓取工具。Grab提供一個(gè)API用于執行網(wǎng)路懇求和處理接收到的內容,例如與HTML文檔的DOM樹(shù)進(jìn)行交互。
  Cola
  Cola是一個(gè)分布式的爬蟲(chóng)框架,對于用戶(hù)來(lái)說(shuō),只需編撰幾個(gè)特定的函數,而無(wú)需關(guān)注分布式運行的細節。任務(wù)會(huì )手動(dòng)分配到多臺機器上,整個(gè)過(guò)程對用戶(hù)是透明的。

網(wǎng)絡(luò )爬蟲(chóng) c++

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 346 次瀏覽 ? 2020-05-22 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  廣告
  提供包括云服務(wù)器,云數據庫在內的50+款云計算產(chǎn)品。打造一站式的云產(chǎn)品試用服務(wù),助力開(kāi)發(fā)者和企業(yè)零門(mén)檻上云。
  
  c++寫(xiě)的socket網(wǎng)絡(luò )爬蟲(chóng),代碼會(huì )在最后一次講解中提供給你們,同時(shí)我也會(huì )在寫(xiě)的同時(shí)不斷的對代碼進(jìn)行建立與更改我首先向你們講解怎樣將網(wǎng)頁(yè)中的內容,文本,圖片等下載到筆記本中。? 我會(huì )教你們怎樣將百度首頁(yè)上的這個(gè)百度標志圖片(http:)抓取下載到筆記本中。? 程序的部份代碼如下,講解在...
  
  互聯(lián)網(wǎng)初期,公司內部都設有好多的‘網(wǎng)站編輯’崗位,負責內容的整理和發(fā)布,縱然是高級動(dòng)物人類(lèi),也只有兩只手,無(wú)法通過(guò)復制、粘貼手工去維護,所以我們須要一種可以手動(dòng)的步入網(wǎng)頁(yè)提煉內容的程序技術(shù),這就是‘爬蟲(chóng)’,網(wǎng)絡(luò )爬蟲(chóng)工程師又被親切的稱(chēng)之為‘蟲(chóng)師’。網(wǎng)絡(luò )爬蟲(chóng)概述 網(wǎng)絡(luò )爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò )...
  
  這款框架作為java的爬蟲(chóng)框架基本上早已囊括了所有我們須要的功能,今天我們就來(lái)詳盡了解這款爬蟲(chóng)框架,webmagic我會(huì )分為兩篇文章介紹,今天主要寫(xiě)webmagic的入門(mén),明天會(huì )寫(xiě)一些爬取指定內容和一些特點(diǎn)介紹,下面請看正文; 先了解下哪些是網(wǎng)路爬蟲(chóng)簡(jiǎn)介: 網(wǎng)絡(luò )爬蟲(chóng)(web crawler) 也稱(chēng)作網(wǎng)路機器人,可以取代人們手動(dòng)地在...
  一、前言 在你心中哪些是網(wǎng)絡(luò )爬蟲(chóng)? 在網(wǎng)線(xiàn)里鉆來(lái)鉆去的蟲(chóng)子? 先看一下百度百科的解釋?zhuān)壕W(wǎng)絡(luò )爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò )機器人,在foaf社區中間,更時(shí)常的稱(chēng)為網(wǎng)頁(yè)追逐者),是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本。 另外一些不常使用的名子還有螞蟻、自動(dòng)索引、模擬程序或則蠕蟲(chóng)。 看完以后...
  
  rec 5.1 網(wǎng)絡(luò )爬蟲(chóng)概述:網(wǎng)絡(luò )爬蟲(chóng)(web spider)又稱(chēng)網(wǎng)路蜘蛛、網(wǎng)絡(luò )機器人,是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本。 網(wǎng)絡(luò )爬蟲(chóng)根據系統結構和實(shí)現技術(shù),大致可分為以下集中類(lèi)型:通用網(wǎng)路爬蟲(chóng):就是盡可能大的網(wǎng)路覆蓋率,如 搜索引擎(百度、雅虎和微軟等...)。 聚焦網(wǎng)路爬蟲(chóng):有目標性,選擇性地...
  
  b. 網(wǎng)絡(luò )爬蟲(chóng)的法律風(fēng)險服務(wù)器上的數據有產(chǎn)權歸屬,網(wǎng)絡(luò )爬蟲(chóng)獲取數據斂財將帶來(lái)法律風(fēng)險c.網(wǎng)絡(luò )爬蟲(chóng)的隱私泄漏網(wǎng)路爬蟲(chóng)可能具備突破簡(jiǎn)單控制訪(fǎng)問(wèn)的能力,獲取被保護的數據因而外泄個(gè)人隱私。 4.2 網(wǎng)絡(luò )爬蟲(chóng)限制a. 來(lái)源審查:判斷user-agent進(jìn)行限制檢測來(lái)訪(fǎng)http合同頭的user-agent域,只響應瀏覽器或友好爬蟲(chóng)的訪(fǎng)問(wèn)b. ...
  curl簡(jiǎn)介php的curl可以實(shí)現模擬http的各類(lèi)懇求,這也是php做網(wǎng)路爬蟲(chóng)的基礎,也多用于插口api的調用。 php 支持 daniel stenberg 創(chuàng )建的 libcurl 庫,能夠聯(lián)接通信各類(lèi)服務(wù)器、使用各類(lèi)合同。 libcurl 目前支持的合同有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同時(shí)支持 https 證書(shū)、http ...
  
  說(shuō)起網(wǎng)路爬蟲(chóng),大家想起的恐怕都是 python ,誠然爬蟲(chóng)早已是 python 的代名詞之一,相比 java 來(lái)說(shuō)就要遜色不少。 有不少人都不知道 java 可以做網(wǎng)路爬蟲(chóng),其實(shí) java 也能做網(wǎng)路爬蟲(chóng)并且能夠做的非常好,在開(kāi)源社區中有不少優(yōu)秀的 java 網(wǎng)絡(luò )爬蟲(chóng)框架,例如 webmagic 。 我的第一份即將工作就是使用 webmagic 編寫(xiě)數據...
  
  所以假如對爬蟲(chóng)有一定基礎,上手框架是一種好的選擇。 本書(shū)主要介紹的爬蟲(chóng)框架有pyspider和scrapy,本節我們來(lái)介紹一下 pyspider、scrapy 以及它們的一些擴充庫的安裝方法。 pyspider的安裝pyspider 是國人 binux 編寫(xiě)的強悍的網(wǎng)路爬蟲(chóng)框架,它帶有強悍的 webui、腳本編輯器、任務(wù)監控器、項目管理器以及結果處理器...
  介紹: 所謂網(wǎng)路爬蟲(chóng),就是一個(gè)在網(wǎng)上四處或定向抓取數據的程序,當然,這種說(shuō)法不夠專(zhuān)業(yè),更專(zhuān)業(yè)的描述就是,抓取特定網(wǎng)站網(wǎng)頁(yè)的html數據。 不過(guò)因為一個(gè)網(wǎng)站的網(wǎng)頁(yè)好多,而我們又不可能事先曉得所有網(wǎng)頁(yè)的url地址,所以,如何保證我們抓取到了網(wǎng)站的所有html頁(yè)面就是一個(gè)有待考究的問(wèn)題了。 一般的方式是,定義一個(gè)...
  政府部門(mén)可以爬蟲(chóng)新聞類(lèi)的網(wǎng)站,爬蟲(chóng)評論查看輿論; 還有的網(wǎng)站從別的網(wǎng)站爬蟲(chóng)下來(lái)在自己網(wǎng)站上展示。 等等 爬蟲(chóng)分類(lèi): 1. 全網(wǎng)爬蟲(chóng)(爬取所有的網(wǎng)站) 2. 垂直爬蟲(chóng)(爬取某類(lèi)網(wǎng)站) 網(wǎng)絡(luò )爬蟲(chóng)開(kāi)源框架 nutch; webmagic 爬蟲(chóng)技術(shù)剖析: 1. 數據下載 模擬瀏覽器訪(fǎng)問(wèn)網(wǎng)站就是request懇求response響應 可是使用httpclient...
  
  nodejs實(shí)現為什么忽然會(huì )選擇nodejs來(lái)實(shí)現,剛好近來(lái)在看node書(shū)籍,里面有提及node爬蟲(chóng),解析爬取的內容,書(shū)中提及借助cheerio模塊,遂果斷瀏覽其api文檔...前言上周借助java爬取的網(wǎng)路文章,一直無(wú)法借助java實(shí)現html轉化md,整整一周時(shí)間才得以解決。 雖然本人的博客文章數量不多,但是絕不齒于自動(dòng)轉換,畢竟...
  
  很多小型的網(wǎng)路搜索引擎系統都被稱(chēng)為基于 web數據采集的搜索引擎系統,比如 google、baidu。 由此可見(jiàn) web 網(wǎng)絡(luò )爬蟲(chóng)系統在搜索引擎中的重要性。 網(wǎng)頁(yè)中不僅包含供用戶(hù)閱讀的文字信息外,還包含一些超鏈接信息。 web網(wǎng)路爬蟲(chóng)系統正是通過(guò)網(wǎng)頁(yè)中的超聯(lián)接信息不斷獲得網(wǎng)路上的其它網(wǎng)頁(yè)。 正是由于這些采集過(guò)程象一個(gè)爬蟲(chóng)...
  
  requests-bs4 定向爬蟲(chóng):僅對輸入url進(jìn)行爬取網(wǎng)絡(luò )爬蟲(chóng) c++,不拓展爬取 程序的結構設計:步驟1:從網(wǎng)路上獲取學(xué)院排行網(wǎng)頁(yè)內容 gethtmltext() 步驟2:提取網(wǎng)頁(yè)內容中...列出工程中所有爬蟲(chóng) scrapy list shell 啟動(dòng)url調試命令行 scrapy shellscrapy框架的基本使用步驟1:建立一個(gè)scrapy爬蟲(chóng)工程#打開(kāi)命令提示符-win+r 輸入...
  twisted介紹twisted是用python實(shí)現的基于風(fēng)波驅動(dòng)的網(wǎng)路引擎框架,scrapy正是依賴(lài)于twisted,從而基于風(fēng)波循環(huán)機制實(shí)現爬蟲(chóng)的并發(fā)。 scrapy的pipeline文件和items文件這兩個(gè)文件有哪些作用先瞧瞧我們下篇的示例:# -*- coding: utf-8 -*-import scrapy class choutispider(scrapy.spider):爬去抽屜網(wǎng)的貼子信息 name ...
  總算有時(shí)間動(dòng)手用所學(xué)的python知識編撰一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)了,這個(gè)反例主要實(shí)現用python爬蟲(chóng)從百度圖庫中下載美眉的圖片,并保存在本地,閑話(huà)少說(shuō),直接貼出相應的代碼如下:----------#coding=utf-8#導出urllib和re模塊importurllibimportre#定義獲取百度圖庫url的類(lèi); classgethtml:def__init__(self,url):self.url...
  讀取頁(yè)面與下載頁(yè)面須要用到def gethtml(url): #定義gethtml()函數,用來(lái)獲取頁(yè)面源代碼page = urllib.urlopen(url)#urlopen()根據url來(lái)獲取頁(yè)面源代碼html = page.read()#從獲取的對象中讀取內容return htmldef getimage(html): #定義getimage()函數,用來(lái)獲取圖片地址并下載reg = rsrc=(.*?.jpg) width#定義匹配...
  《python3 網(wǎng)絡(luò )爬蟲(chóng)開(kāi)發(fā)實(shí)戰(崔慶才著(zhù))》redis 命令參考:http:redisdoc.com 、http:doc.redisfans.com----【16.3】key(鍵)操作 方法 作用 參數說(shuō)明 示例 示例說(shuō)明示例結果 exists(name) 判斷一個(gè)鍵是否存在 name:鍵名 redis.exists(‘name’) 是否存在 name 這個(gè)鍵 true delete(name) 刪除一個(gè)鍵name...
  data=kw)res =session.get(http:)print(demo + res.text)總結本篇介紹了爬蟲(chóng)中有關(guān)網(wǎng)路懇求的相關(guān)知識,通過(guò)閱讀,你將了解到urllib和...查看完整url地址print(response.url) with open(cunyu.html, w, encoding=utf-8 )as cy:cy.write(response.content.decode(utf-8))# 查看cookiesprint...
  
  本文的實(shí)戰內容有:網(wǎng)絡(luò )小說(shuō)下載(靜態(tài)網(wǎng)站) 優(yōu)美墻紙下載(動(dòng)態(tài)網(wǎng)站) 愛(ài)奇藝vip視頻下載二、網(wǎng)絡(luò )爬蟲(chóng)簡(jiǎn)介 網(wǎng)絡(luò )爬蟲(chóng),也叫網(wǎng)路蜘蛛(web spider)。 它依據網(wǎng)頁(yè)地址(url)爬取網(wǎng)頁(yè)內容,而網(wǎng)頁(yè)地址(url)就是我們在瀏覽器中輸入的網(wǎng)站鏈接。 比如:https:,它就是一個(gè)url。 在講解爬蟲(chóng)內容之前網(wǎng)絡(luò )爬蟲(chóng) c++,我們須要先... 查看全部

  
  廣告
  提供包括云服務(wù)器,云數據庫在內的50+款云計算產(chǎn)品。打造一站式的云產(chǎn)品試用服務(wù),助力開(kāi)發(fā)者和企業(yè)零門(mén)檻上云。
  
  c++寫(xiě)的socket網(wǎng)絡(luò )爬蟲(chóng),代碼會(huì )在最后一次講解中提供給你們,同時(shí)我也會(huì )在寫(xiě)的同時(shí)不斷的對代碼進(jìn)行建立與更改我首先向你們講解怎樣將網(wǎng)頁(yè)中的內容,文本,圖片等下載到筆記本中。? 我會(huì )教你們怎樣將百度首頁(yè)上的這個(gè)百度標志圖片(http:)抓取下載到筆記本中。? 程序的部份代碼如下,講解在...
  
  互聯(lián)網(wǎng)初期,公司內部都設有好多的‘網(wǎng)站編輯’崗位,負責內容的整理和發(fā)布,縱然是高級動(dòng)物人類(lèi),也只有兩只手,無(wú)法通過(guò)復制、粘貼手工去維護,所以我們須要一種可以手動(dòng)的步入網(wǎng)頁(yè)提煉內容的程序技術(shù),這就是‘爬蟲(chóng)’,網(wǎng)絡(luò )爬蟲(chóng)工程師又被親切的稱(chēng)之為‘蟲(chóng)師’。網(wǎng)絡(luò )爬蟲(chóng)概述 網(wǎng)絡(luò )爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò )...
  
  這款框架作為java的爬蟲(chóng)框架基本上早已囊括了所有我們須要的功能,今天我們就來(lái)詳盡了解這款爬蟲(chóng)框架,webmagic我會(huì )分為兩篇文章介紹,今天主要寫(xiě)webmagic的入門(mén),明天會(huì )寫(xiě)一些爬取指定內容和一些特點(diǎn)介紹,下面請看正文; 先了解下哪些是網(wǎng)路爬蟲(chóng)簡(jiǎn)介: 網(wǎng)絡(luò )爬蟲(chóng)(web crawler) 也稱(chēng)作網(wǎng)路機器人,可以取代人們手動(dòng)地在...
  一、前言 在你心中哪些是網(wǎng)絡(luò )爬蟲(chóng)? 在網(wǎng)線(xiàn)里鉆來(lái)鉆去的蟲(chóng)子? 先看一下百度百科的解釋?zhuān)壕W(wǎng)絡(luò )爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò )機器人,在foaf社區中間,更時(shí)常的稱(chēng)為網(wǎng)頁(yè)追逐者),是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本。 另外一些不常使用的名子還有螞蟻、自動(dòng)索引、模擬程序或則蠕蟲(chóng)。 看完以后...
  
  rec 5.1 網(wǎng)絡(luò )爬蟲(chóng)概述:網(wǎng)絡(luò )爬蟲(chóng)(web spider)又稱(chēng)網(wǎng)路蜘蛛、網(wǎng)絡(luò )機器人,是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本。 網(wǎng)絡(luò )爬蟲(chóng)根據系統結構和實(shí)現技術(shù),大致可分為以下集中類(lèi)型:通用網(wǎng)路爬蟲(chóng):就是盡可能大的網(wǎng)路覆蓋率,如 搜索引擎(百度、雅虎和微軟等...)。 聚焦網(wǎng)路爬蟲(chóng):有目標性,選擇性地...
  
  b. 網(wǎng)絡(luò )爬蟲(chóng)的法律風(fēng)險服務(wù)器上的數據有產(chǎn)權歸屬,網(wǎng)絡(luò )爬蟲(chóng)獲取數據斂財將帶來(lái)法律風(fēng)險c.網(wǎng)絡(luò )爬蟲(chóng)的隱私泄漏網(wǎng)路爬蟲(chóng)可能具備突破簡(jiǎn)單控制訪(fǎng)問(wèn)的能力,獲取被保護的數據因而外泄個(gè)人隱私。 4.2 網(wǎng)絡(luò )爬蟲(chóng)限制a. 來(lái)源審查:判斷user-agent進(jìn)行限制檢測來(lái)訪(fǎng)http合同頭的user-agent域,只響應瀏覽器或友好爬蟲(chóng)的訪(fǎng)問(wèn)b. ...
  curl簡(jiǎn)介php的curl可以實(shí)現模擬http的各類(lèi)懇求,這也是php做網(wǎng)路爬蟲(chóng)的基礎,也多用于插口api的調用。 php 支持 daniel stenberg 創(chuàng )建的 libcurl 庫,能夠聯(lián)接通信各類(lèi)服務(wù)器、使用各類(lèi)合同。 libcurl 目前支持的合同有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同時(shí)支持 https 證書(shū)、http ...
  
  說(shuō)起網(wǎng)路爬蟲(chóng),大家想起的恐怕都是 python ,誠然爬蟲(chóng)早已是 python 的代名詞之一,相比 java 來(lái)說(shuō)就要遜色不少。 有不少人都不知道 java 可以做網(wǎng)路爬蟲(chóng),其實(shí) java 也能做網(wǎng)路爬蟲(chóng)并且能夠做的非常好,在開(kāi)源社區中有不少優(yōu)秀的 java 網(wǎng)絡(luò )爬蟲(chóng)框架,例如 webmagic 。 我的第一份即將工作就是使用 webmagic 編寫(xiě)數據...
  
  所以假如對爬蟲(chóng)有一定基礎,上手框架是一種好的選擇。 本書(shū)主要介紹的爬蟲(chóng)框架有pyspider和scrapy,本節我們來(lái)介紹一下 pyspider、scrapy 以及它們的一些擴充庫的安裝方法。 pyspider的安裝pyspider 是國人 binux 編寫(xiě)的強悍的網(wǎng)路爬蟲(chóng)框架,它帶有強悍的 webui、腳本編輯器、任務(wù)監控器、項目管理器以及結果處理器...
  介紹: 所謂網(wǎng)路爬蟲(chóng),就是一個(gè)在網(wǎng)上四處或定向抓取數據的程序,當然,這種說(shuō)法不夠專(zhuān)業(yè),更專(zhuān)業(yè)的描述就是,抓取特定網(wǎng)站網(wǎng)頁(yè)的html數據。 不過(guò)因為一個(gè)網(wǎng)站的網(wǎng)頁(yè)好多,而我們又不可能事先曉得所有網(wǎng)頁(yè)的url地址,所以,如何保證我們抓取到了網(wǎng)站的所有html頁(yè)面就是一個(gè)有待考究的問(wèn)題了。 一般的方式是,定義一個(gè)...
  政府部門(mén)可以爬蟲(chóng)新聞類(lèi)的網(wǎng)站,爬蟲(chóng)評論查看輿論; 還有的網(wǎng)站從別的網(wǎng)站爬蟲(chóng)下來(lái)在自己網(wǎng)站上展示。 等等 爬蟲(chóng)分類(lèi): 1. 全網(wǎng)爬蟲(chóng)(爬取所有的網(wǎng)站) 2. 垂直爬蟲(chóng)(爬取某類(lèi)網(wǎng)站) 網(wǎng)絡(luò )爬蟲(chóng)開(kāi)源框架 nutch; webmagic 爬蟲(chóng)技術(shù)剖析: 1. 數據下載 模擬瀏覽器訪(fǎng)問(wèn)網(wǎng)站就是request懇求response響應 可是使用httpclient...
  
  nodejs實(shí)現為什么忽然會(huì )選擇nodejs來(lái)實(shí)現,剛好近來(lái)在看node書(shū)籍,里面有提及node爬蟲(chóng),解析爬取的內容,書(shū)中提及借助cheerio模塊,遂果斷瀏覽其api文檔...前言上周借助java爬取的網(wǎng)路文章,一直無(wú)法借助java實(shí)現html轉化md,整整一周時(shí)間才得以解決。 雖然本人的博客文章數量不多,但是絕不齒于自動(dòng)轉換,畢竟...
  
  很多小型的網(wǎng)路搜索引擎系統都被稱(chēng)為基于 web數據采集的搜索引擎系統,比如 google、baidu。 由此可見(jiàn) web 網(wǎng)絡(luò )爬蟲(chóng)系統在搜索引擎中的重要性。 網(wǎng)頁(yè)中不僅包含供用戶(hù)閱讀的文字信息外,還包含一些超鏈接信息。 web網(wǎng)路爬蟲(chóng)系統正是通過(guò)網(wǎng)頁(yè)中的超聯(lián)接信息不斷獲得網(wǎng)路上的其它網(wǎng)頁(yè)。 正是由于這些采集過(guò)程象一個(gè)爬蟲(chóng)...
  
  requests-bs4 定向爬蟲(chóng):僅對輸入url進(jìn)行爬取網(wǎng)絡(luò )爬蟲(chóng) c++,不拓展爬取 程序的結構設計:步驟1:從網(wǎng)路上獲取學(xué)院排行網(wǎng)頁(yè)內容 gethtmltext() 步驟2:提取網(wǎng)頁(yè)內容中...列出工程中所有爬蟲(chóng) scrapy list shell 啟動(dòng)url調試命令行 scrapy shellscrapy框架的基本使用步驟1:建立一個(gè)scrapy爬蟲(chóng)工程#打開(kāi)命令提示符-win+r 輸入...
  twisted介紹twisted是用python實(shí)現的基于風(fēng)波驅動(dòng)的網(wǎng)路引擎框架,scrapy正是依賴(lài)于twisted,從而基于風(fēng)波循環(huán)機制實(shí)現爬蟲(chóng)的并發(fā)。 scrapy的pipeline文件和items文件這兩個(gè)文件有哪些作用先瞧瞧我們下篇的示例:# -*- coding: utf-8 -*-import scrapy class choutispider(scrapy.spider):爬去抽屜網(wǎng)的貼子信息 name ...
  總算有時(shí)間動(dòng)手用所學(xué)的python知識編撰一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)了,這個(gè)反例主要實(shí)現用python爬蟲(chóng)從百度圖庫中下載美眉的圖片,并保存在本地,閑話(huà)少說(shuō),直接貼出相應的代碼如下:----------#coding=utf-8#導出urllib和re模塊importurllibimportre#定義獲取百度圖庫url的類(lèi); classgethtml:def__init__(self,url):self.url...
  讀取頁(yè)面與下載頁(yè)面須要用到def gethtml(url): #定義gethtml()函數,用來(lái)獲取頁(yè)面源代碼page = urllib.urlopen(url)#urlopen()根據url來(lái)獲取頁(yè)面源代碼html = page.read()#從獲取的對象中讀取內容return htmldef getimage(html): #定義getimage()函數,用來(lái)獲取圖片地址并下載reg = rsrc=(.*?.jpg) width#定義匹配...
  《python3 網(wǎng)絡(luò )爬蟲(chóng)開(kāi)發(fā)實(shí)戰(崔慶才著(zhù))》redis 命令參考:http:redisdoc.com 、http:doc.redisfans.com----【16.3】key(鍵)操作 方法 作用 參數說(shuō)明 示例 示例說(shuō)明示例結果 exists(name) 判斷一個(gè)鍵是否存在 name:鍵名 redis.exists(‘name’) 是否存在 name 這個(gè)鍵 true delete(name) 刪除一個(gè)鍵name...
  data=kw)res =session.get(http:)print(demo + res.text)總結本篇介紹了爬蟲(chóng)中有關(guān)網(wǎng)路懇求的相關(guān)知識,通過(guò)閱讀,你將了解到urllib和...查看完整url地址print(response.url) with open(cunyu.html, w, encoding=utf-8 )as cy:cy.write(response.content.decode(utf-8))# 查看cookiesprint...
  
  本文的實(shí)戰內容有:網(wǎng)絡(luò )小說(shuō)下載(靜態(tài)網(wǎng)站) 優(yōu)美墻紙下載(動(dòng)態(tài)網(wǎng)站) 愛(ài)奇藝vip視頻下載二、網(wǎng)絡(luò )爬蟲(chóng)簡(jiǎn)介 網(wǎng)絡(luò )爬蟲(chóng),也叫網(wǎng)路蜘蛛(web spider)。 它依據網(wǎng)頁(yè)地址(url)爬取網(wǎng)頁(yè)內容,而網(wǎng)頁(yè)地址(url)就是我們在瀏覽器中輸入的網(wǎng)站鏈接。 比如:https:,它就是一個(gè)url。 在講解爬蟲(chóng)內容之前網(wǎng)絡(luò )爬蟲(chóng) c++,我們須要先...

Go語(yǔ)言網(wǎng)絡(luò )爬蟲(chóng)概述

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 387 次瀏覽 ? 2020-05-13 08:03 ? 來(lái)自相關(guān)話(huà)題

  
  簡(jiǎn)單來(lái)說(shuō),網(wǎng)絡(luò )爬蟲(chóng)是互聯(lián)網(wǎng)終端用戶(hù)的模仿者。它模仿的主要對象有兩個(gè),一個(gè)是坐在計算器前使用網(wǎng)絡(luò )瀏覽器訪(fǎng)問(wèn)網(wǎng)路內容的人類(lèi)用戶(hù),另一個(gè)就是網(wǎng)絡(luò )瀏覽器。
  網(wǎng)絡(luò )爬蟲(chóng)會(huì )模仿人類(lèi)用戶(hù)輸入某個(gè)網(wǎng)站的網(wǎng)路地址,并企圖訪(fǎng)問(wèn)該網(wǎng)站上的內容,還會(huì )模仿網(wǎng)路瀏覽器按照給定的網(wǎng)路地址去下載相應的內容。這里所說(shuō)的內容可以是 HTML 頁(yè)面、圖片文件、音視頻數據流,等等。
  在下載到對應的內容以后,網(wǎng)絡(luò )爬蟲(chóng)會(huì )按照預設的規則對它進(jìn)行剖析和篩選。這些篩選岀的部份會(huì )馬上得到特定的處理。與此同時(shí),網(wǎng)絡(luò )爬蟲(chóng)都會(huì )象人類(lèi)用戶(hù)點(diǎn)擊網(wǎng)頁(yè)中某個(gè)他感興趣的鏈接那樣,繼續訪(fǎng)問(wèn)和下載相關(guān)聯(lián)的其他內容,然后再重復上述步驟,直到滿(mǎn)足停止的條件。
  如上所述,網(wǎng)絡(luò )爬蟲(chóng)應當按照使用者的意愿手動(dòng)下載、分析、篩選、統計以及儲存指定的網(wǎng)路內容。注意,這里的關(guān)鍵詞是“自動(dòng)”和“根據意愿”?!白詣?dòng)”的涵義是,網(wǎng)絡(luò )爬蟲(chóng)在啟動(dòng)后自己完成整個(gè)爬取過(guò)程而無(wú)需人工干預,并且能夠夠在過(guò)程結束以后手動(dòng)停止。而“根據意愿”則是說(shuō),網(wǎng)絡(luò )爬蟲(chóng)最大限度地準許使用者對其爬取過(guò)程進(jìn)行訂制。
  乍一看,要做到手動(dòng)爬取其實(shí)并不困難。我們只需使網(wǎng)路爬蟲(chóng)依據相關(guān)的網(wǎng)路地址不斷地下載對應的內容即可。但是,窺探其中就可以發(fā)覺(jué),這里有很多細節須要我們進(jìn)行非常處理,如下所示。
  在這種細節當中,有的是比較容易處理的,而有的則須要額外的解決方案。例如,我們都曉得,基于 HTML 的網(wǎng)頁(yè)中可以包含代表按鍵的 button 標簽。
  讓網(wǎng)絡(luò )瀏覽器在終端用戶(hù)點(diǎn)擊按鍵的時(shí)侯加載并顯示另一個(gè)網(wǎng)頁(yè)可以有很多種方式,其中,非常常用的一種方式就是為該標簽添加 onclick 屬性并把一些 JavaScript 語(yǔ)言的代碼作為它的值。
  雖然這個(gè)方式這么常用,但是我們要想使網(wǎng)絡(luò )爬蟲(chóng)可以從中提取出有效的網(wǎng)路地址卻是比較 困難的,因為這涉及對JavaScript程序的理解。JavaScript代碼的編撰方式繁雜,要想使 網(wǎng)絡(luò )爬蟲(chóng)完全理解它們,恐怕就須要用到某個(gè)JavaScript程序解析器的 Go語(yǔ)言實(shí)現了。
  另一方面,由于互聯(lián)網(wǎng)對人們生活和工作的全面滲透,我們可以通過(guò)各類(lèi)途徑找到各式各樣的網(wǎng)路爬蟲(chóng)實(shí)現,它們幾乎都有著(zhù)復雜而又奇特的邏輯。這些復雜的邏輯主要針對如下幾個(gè)方面。
  這些邏輯絕大多數都與網(wǎng)路爬蟲(chóng)使用者當時(shí)的意愿有關(guān)。換句話(huà)說(shuō),它們都與具體的使用目的有著(zhù)緊密的聯(lián)系。也許它們并不應當是網(wǎng)路爬蟲(chóng)的核心功能,而應當作為擴充功能或可訂制的功能存在。
  因此,我想我們更應當編撰一個(gè)容易被訂制和擴充的網(wǎng)路爬蟲(chóng)框架,而非一個(gè)滿(mǎn)足特定爬取目的的網(wǎng)路爬蟲(chóng),這樣就能讓這個(gè)程序成為一個(gè)可適用于不同應用場(chǎng)景的通用工具。
  既然這么,接下來(lái)我們就要搞清楚該程序應當或可以做什么事,這也就能使我們進(jìn)一步明晰它的功能、用途和意義。
  功能需求和剖析概括來(lái)講,網(wǎng)絡(luò )爬蟲(chóng)框架會(huì )反復執行如下步驟直到觸遇到停止條件。
  1) “下載器”下載與給定網(wǎng)路地址相對應的內容。其中,在下載“請求”的組裝方面,網(wǎng)絡(luò )爬蟲(chóng)框架為使用者盡量預留出訂制插口。使用者可以使用這種插口自定義“請求”的組裝方式。
  2) “分析器”分析下載到的內容,并從中篩選出可用的部份(以下稱(chēng)為“條目”)和須要訪(fǎng)問(wèn)的新網(wǎng)路地址。其中,在用于剖析和篩選內容的規則和策略方面,應該由網(wǎng)路爬蟲(chóng)框架提供靈活的訂制插口。
  換句話(huà)說(shuō),由于只有使用者自己才曉得她們真正想要的是哪些,所以應當準許她們對這種規則和策略進(jìn)行深入的訂制。網(wǎng)絡(luò )爬蟲(chóng)框架僅須要規定好訂制的方法即可。
  3) “分析器”把篩選出的“條目”發(fā)送給“條目處理管線(xiàn)”。同時(shí),它會(huì )把發(fā)覺(jué)的新網(wǎng)路地址和其他一些信息組裝成新的下載“請求”,然后把這種懇求發(fā)送給“下載器”。在此步驟中,我們會(huì )過(guò)濾掉一些不符合要求的網(wǎng)路地址,比如忽視超出有效邊界的網(wǎng)路地址。
  你可能早已注意到,在這幾個(gè)步驟中,我使用冒號突出展示了幾個(gè)名詞,即下載器、請求、分析器、條目和條目處理管線(xiàn),其中,請求和條目都代表了某類(lèi)數據,而其他 3 個(gè)名詞則代表了處理數據的子程序(可稱(chēng)為處理模塊或組件)。
  它們與上面早已提及過(guò)的網(wǎng)路內容(或稱(chēng)對懇求的響應)共同描述了數據在網(wǎng)路爬蟲(chóng)程序中的流轉形式。下圖演示了起始于首次懇求的數據流程圖。
  
  圖:起始于首次懇求的數據流程圖
  從上圖中,我們可以清晰地看見(jiàn)每一個(gè)處理模塊才能接受的輸入和可以形成的輸出。實(shí)際上,我們即將編撰的網(wǎng)路爬蟲(chóng)框架都會(huì )借此為根據產(chǎn)生幾個(gè)相對獨立的子程序。
  當然,為了維護它們的運行和協(xié)作的有效性,框架中都會(huì )存在其他一些子程序。關(guān)于它們,我會(huì )在旁邊相繼給以說(shuō)明。
  這里,我再度指出一下網(wǎng)路爬蟲(chóng)框架與網(wǎng)路爬蟲(chóng)實(shí)現的區別。作為一個(gè)框架,該程序在每位處理模塊中給與使用者盡量多的訂制技巧,而不去涉及各個(gè)處理步驟的實(shí)現細節。
  另外,框架更多地考慮使用者自定義的處理步驟在執行期間可能發(fā)生的各類(lèi)情況和問(wèn)題,并注意對這種問(wèn)題的處理方法,這樣就能在便于擴充的同時(shí)保證框架的穩定性。這方面的思索和策略會(huì )彰顯在該網(wǎng)路爬蟲(chóng)框架的各階段設計和編碼實(shí)現之中。
  下面我就依照上述剖析對這一程序進(jìn)行總體設計。
  總體設計通過(guò)上圖可知,網(wǎng)絡(luò )爬蟲(chóng)框架的處理模塊有 3 個(gè):下載器、分析器和條目處理管線(xiàn)。再加上調度和協(xié)調那些處理模塊運行的控制模塊,我們就可以明確該框架的模塊界定了。我把這兒提及的控制模塊稱(chēng)為調度器。下面是這 4 個(gè)模塊各自承當的職責。
  1) 下載器接受懇求類(lèi)型的數據,并根據該懇求獲得 HTTP 請求;將 HTTP 請求發(fā)送至與指定的網(wǎng)路地址對應的遠程服務(wù)器;在 HTTP 請求發(fā)送完畢以后,立即等待相應的 HTTP 響應的到來(lái);在收到 HTTP 響應以后,將其封裝成響應并作為輸出返回給下載器的調用方。
  其中,HTTP 客戶(hù)端程序可以由網(wǎng)路爬蟲(chóng)框架的使用方自行定義。另外,若在該子流程執行期間發(fā)生了錯誤,應該立刻以適當的方法告知使用方。對于其他模塊來(lái)講,也是這樣。
  2) 分析器接受響應類(lèi)型的數據,并根據該響應獲得 HTTP 響應;對該 HTTP 響應的內容進(jìn)行檢測,并按照給定的規則進(jìn)行剖析、篩選以及生成新的懇求或條目;將生成的懇求或條目作為輸出返回給分析器的調用方。
  在分析器的職責中,我可以想到的才能留給網(wǎng)路爬蟲(chóng)框架的使用方自定義的部份并不少。例如,對 HTTP 響應的前期檢測、對內容的篩選,以及生成懇求和條目的方法,等等。不過(guò),我在前面會(huì )對那些可以自定義的部份進(jìn)行一些抉擇。
  3) 條目處理管線(xiàn)接受條目類(lèi)型的數據,并對其執行若干步驟的處理;條目處理管線(xiàn)中可以產(chǎn)出最終的數據;這個(gè)最終的數據可以在其中的某個(gè)處理步驟中被持久化(不論是本地儲存還是發(fā)送給遠程的儲存服務(wù)器)以備后用。
  我們可以把這種處理步驟的具體實(shí)現留給網(wǎng)路爬蟲(chóng)框架的使用方自行定義。這樣,網(wǎng)絡(luò )爬蟲(chóng)框架就可以真正地與條目處理的細節脫離開(kāi)來(lái)。網(wǎng)絡(luò )爬蟲(chóng)框架絲毫不關(guān)心那些條目如何被處理和持久化,它僅僅負責控制整體的處理流程。我把負責單個(gè)處理步驟的程序稱(chēng)為條目處理器。
  條目處理器接受條目類(lèi)型的數據,并把處理完成的條目返回給條目處理管線(xiàn)。條目處理管線(xiàn)會(huì )緊接著(zhù)把該條目傳遞給下一個(gè)條目處理器,直至給定的條目處理器列表中的每位條目處理器都處理過(guò)該條目為止。
  4) 調度器調度器在啟動(dòng)時(shí)僅接受首次懇求,并且不會(huì )形成任何輸出。調度器的主要職責是調度各個(gè)處理模塊的運行。其中包括維護各個(gè)處理模塊的實(shí)例、在不同的處理模塊實(shí)例之間傳遞數據(包括懇求、響應和條目),以及監控所有那些被調度者的狀態(tài),等等。
  有了調度器的維護,各個(gè)處理模塊得以保持其職責的簡(jiǎn)約和專(zhuān)情。由于調度器是網(wǎng)路爬蟲(chóng)框架中最重要的一個(gè)模塊,所以還須要再編撰出一些工具來(lái)支撐起它的功能。
  在弄清楚網(wǎng)路爬蟲(chóng)框架中各個(gè)模塊的職責以后網(wǎng)絡(luò )爬蟲(chóng) 語(yǔ)言,你曉得它是以調度器為核心的。此外,為了并發(fā)執行的須要,除調度器之外的其他模塊都可以是多實(shí)例的,它們由調度器持有、維護和調用。反過(guò)來(lái)講,這些處理模塊的實(shí)例會(huì )從調度器那兒接受輸入,并在進(jìn)行相應的處理后將輸出返回給調度器。
  最后,與另外兩個(gè)處理模塊相比,條目處理管線(xiàn)是比較特殊的。顧名思義,它是以流式處理為基礎的,其設計靈感來(lái)自于我之前講過(guò)的 Linux 系統中的管線(xiàn)。
  我們可以不斷地向該管線(xiàn)發(fā)送條目,而該管線(xiàn)則會(huì )使其中的若干個(gè)條目處理器依次處理每一個(gè)條目。我們可以挺輕易地使用一些同步方式來(lái)保證條目處理管線(xiàn)的并發(fā)安全性,因此雖然調度器只持有該管線(xiàn)的一個(gè)實(shí)例,也不會(huì )有任何問(wèn)題。
  下圖展示了調度器與各個(gè)處理模塊之間的關(guān)系,圖中加入了一個(gè)新的元素——工具箱網(wǎng)絡(luò )爬蟲(chóng) 語(yǔ)言,之前所說(shuō)的用于支撐調度器功能的這些工具就是工具箱的一部分。顧名思義,工具箱不是一個(gè)完整的模塊,而是一些工具的集合,這些工具是調度器與所有處理模塊之間的橋梁。
  
  圖:調度器與各處理模塊的關(guān)系
  至此,大家對網(wǎng)路爬蟲(chóng)框架的設計有了一個(gè)宏觀(guān)上的認識。不過(guò),我還未提到在這個(gè)總體設計之下包含的大量設計方法和決策。這些方法和決策不但與一些通用的程序設計原則有關(guān),還涉及好多依賴(lài)于 Go語(yǔ)言的編程風(fēng)格和形式技巧。
  這也從側面說(shuō)明,由于幾乎所有語(yǔ)言都有著(zhù)十分鮮明的特征和比較擅長(cháng)的領(lǐng)域,所以在設計一個(gè)須要由特定語(yǔ)言實(shí)現的軟件或程序時(shí),多多少少會(huì )考慮到這門(mén)語(yǔ)言自身的特點(diǎn)。也就是說(shuō),軟件設計不是與具體的語(yǔ)言毫不相關(guān)的。反過(guò)來(lái)講,總會(huì )有一門(mén)或幾門(mén)語(yǔ)言十分適宜實(shí)現某一類(lèi)軟件或程序。 查看全部

  
  簡(jiǎn)單來(lái)說(shuō),網(wǎng)絡(luò )爬蟲(chóng)是互聯(lián)網(wǎng)終端用戶(hù)的模仿者。它模仿的主要對象有兩個(gè),一個(gè)是坐在計算器前使用網(wǎng)絡(luò )瀏覽器訪(fǎng)問(wèn)網(wǎng)路內容的人類(lèi)用戶(hù),另一個(gè)就是網(wǎng)絡(luò )瀏覽器。
  網(wǎng)絡(luò )爬蟲(chóng)會(huì )模仿人類(lèi)用戶(hù)輸入某個(gè)網(wǎng)站的網(wǎng)路地址,并企圖訪(fǎng)問(wèn)該網(wǎng)站上的內容,還會(huì )模仿網(wǎng)路瀏覽器按照給定的網(wǎng)路地址去下載相應的內容。這里所說(shuō)的內容可以是 HTML 頁(yè)面、圖片文件、音視頻數據流,等等。
  在下載到對應的內容以后,網(wǎng)絡(luò )爬蟲(chóng)會(huì )按照預設的規則對它進(jìn)行剖析和篩選。這些篩選岀的部份會(huì )馬上得到特定的處理。與此同時(shí),網(wǎng)絡(luò )爬蟲(chóng)都會(huì )象人類(lèi)用戶(hù)點(diǎn)擊網(wǎng)頁(yè)中某個(gè)他感興趣的鏈接那樣,繼續訪(fǎng)問(wèn)和下載相關(guān)聯(lián)的其他內容,然后再重復上述步驟,直到滿(mǎn)足停止的條件。
  如上所述,網(wǎng)絡(luò )爬蟲(chóng)應當按照使用者的意愿手動(dòng)下載、分析、篩選、統計以及儲存指定的網(wǎng)路內容。注意,這里的關(guān)鍵詞是“自動(dòng)”和“根據意愿”?!白詣?dòng)”的涵義是,網(wǎng)絡(luò )爬蟲(chóng)在啟動(dòng)后自己完成整個(gè)爬取過(guò)程而無(wú)需人工干預,并且能夠夠在過(guò)程結束以后手動(dòng)停止。而“根據意愿”則是說(shuō),網(wǎng)絡(luò )爬蟲(chóng)最大限度地準許使用者對其爬取過(guò)程進(jìn)行訂制。
  乍一看,要做到手動(dòng)爬取其實(shí)并不困難。我們只需使網(wǎng)路爬蟲(chóng)依據相關(guān)的網(wǎng)路地址不斷地下載對應的內容即可。但是,窺探其中就可以發(fā)覺(jué),這里有很多細節須要我們進(jìn)行非常處理,如下所示。
  在這種細節當中,有的是比較容易處理的,而有的則須要額外的解決方案。例如,我們都曉得,基于 HTML 的網(wǎng)頁(yè)中可以包含代表按鍵的 button 標簽。
  讓網(wǎng)絡(luò )瀏覽器在終端用戶(hù)點(diǎn)擊按鍵的時(shí)侯加載并顯示另一個(gè)網(wǎng)頁(yè)可以有很多種方式,其中,非常常用的一種方式就是為該標簽添加 onclick 屬性并把一些 JavaScript 語(yǔ)言的代碼作為它的值。
  雖然這個(gè)方式這么常用,但是我們要想使網(wǎng)絡(luò )爬蟲(chóng)可以從中提取出有效的網(wǎng)路地址卻是比較 困難的,因為這涉及對JavaScript程序的理解。JavaScript代碼的編撰方式繁雜,要想使 網(wǎng)絡(luò )爬蟲(chóng)完全理解它們,恐怕就須要用到某個(gè)JavaScript程序解析器的 Go語(yǔ)言實(shí)現了。
  另一方面,由于互聯(lián)網(wǎng)對人們生活和工作的全面滲透,我們可以通過(guò)各類(lèi)途徑找到各式各樣的網(wǎng)路爬蟲(chóng)實(shí)現,它們幾乎都有著(zhù)復雜而又奇特的邏輯。這些復雜的邏輯主要針對如下幾個(gè)方面。
  這些邏輯絕大多數都與網(wǎng)路爬蟲(chóng)使用者當時(shí)的意愿有關(guān)。換句話(huà)說(shuō),它們都與具體的使用目的有著(zhù)緊密的聯(lián)系。也許它們并不應當是網(wǎng)路爬蟲(chóng)的核心功能,而應當作為擴充功能或可訂制的功能存在。
  因此,我想我們更應當編撰一個(gè)容易被訂制和擴充的網(wǎng)路爬蟲(chóng)框架,而非一個(gè)滿(mǎn)足特定爬取目的的網(wǎng)路爬蟲(chóng),這樣就能讓這個(gè)程序成為一個(gè)可適用于不同應用場(chǎng)景的通用工具。
  既然這么,接下來(lái)我們就要搞清楚該程序應當或可以做什么事,這也就能使我們進(jìn)一步明晰它的功能、用途和意義。
  功能需求和剖析概括來(lái)講,網(wǎng)絡(luò )爬蟲(chóng)框架會(huì )反復執行如下步驟直到觸遇到停止條件。
  1) “下載器”下載與給定網(wǎng)路地址相對應的內容。其中,在下載“請求”的組裝方面,網(wǎng)絡(luò )爬蟲(chóng)框架為使用者盡量預留出訂制插口。使用者可以使用這種插口自定義“請求”的組裝方式。
  2) “分析器”分析下載到的內容,并從中篩選出可用的部份(以下稱(chēng)為“條目”)和須要訪(fǎng)問(wèn)的新網(wǎng)路地址。其中,在用于剖析和篩選內容的規則和策略方面,應該由網(wǎng)路爬蟲(chóng)框架提供靈活的訂制插口。
  換句話(huà)說(shuō),由于只有使用者自己才曉得她們真正想要的是哪些,所以應當準許她們對這種規則和策略進(jìn)行深入的訂制。網(wǎng)絡(luò )爬蟲(chóng)框架僅須要規定好訂制的方法即可。
  3) “分析器”把篩選出的“條目”發(fā)送給“條目處理管線(xiàn)”。同時(shí),它會(huì )把發(fā)覺(jué)的新網(wǎng)路地址和其他一些信息組裝成新的下載“請求”,然后把這種懇求發(fā)送給“下載器”。在此步驟中,我們會(huì )過(guò)濾掉一些不符合要求的網(wǎng)路地址,比如忽視超出有效邊界的網(wǎng)路地址。
  你可能早已注意到,在這幾個(gè)步驟中,我使用冒號突出展示了幾個(gè)名詞,即下載器、請求、分析器、條目和條目處理管線(xiàn),其中,請求和條目都代表了某類(lèi)數據,而其他 3 個(gè)名詞則代表了處理數據的子程序(可稱(chēng)為處理模塊或組件)。
  它們與上面早已提及過(guò)的網(wǎng)路內容(或稱(chēng)對懇求的響應)共同描述了數據在網(wǎng)路爬蟲(chóng)程序中的流轉形式。下圖演示了起始于首次懇求的數據流程圖。
  
  圖:起始于首次懇求的數據流程圖
  從上圖中,我們可以清晰地看見(jiàn)每一個(gè)處理模塊才能接受的輸入和可以形成的輸出。實(shí)際上,我們即將編撰的網(wǎng)路爬蟲(chóng)框架都會(huì )借此為根據產(chǎn)生幾個(gè)相對獨立的子程序。
  當然,為了維護它們的運行和協(xié)作的有效性,框架中都會(huì )存在其他一些子程序。關(guān)于它們,我會(huì )在旁邊相繼給以說(shuō)明。
  這里,我再度指出一下網(wǎng)路爬蟲(chóng)框架與網(wǎng)路爬蟲(chóng)實(shí)現的區別。作為一個(gè)框架,該程序在每位處理模塊中給與使用者盡量多的訂制技巧,而不去涉及各個(gè)處理步驟的實(shí)現細節。
  另外,框架更多地考慮使用者自定義的處理步驟在執行期間可能發(fā)生的各類(lèi)情況和問(wèn)題,并注意對這種問(wèn)題的處理方法,這樣就能在便于擴充的同時(shí)保證框架的穩定性。這方面的思索和策略會(huì )彰顯在該網(wǎng)路爬蟲(chóng)框架的各階段設計和編碼實(shí)現之中。
  下面我就依照上述剖析對這一程序進(jìn)行總體設計。
  總體設計通過(guò)上圖可知,網(wǎng)絡(luò )爬蟲(chóng)框架的處理模塊有 3 個(gè):下載器、分析器和條目處理管線(xiàn)。再加上調度和協(xié)調那些處理模塊運行的控制模塊,我們就可以明確該框架的模塊界定了。我把這兒提及的控制模塊稱(chēng)為調度器。下面是這 4 個(gè)模塊各自承當的職責。
  1) 下載器接受懇求類(lèi)型的數據,并根據該懇求獲得 HTTP 請求;將 HTTP 請求發(fā)送至與指定的網(wǎng)路地址對應的遠程服務(wù)器;在 HTTP 請求發(fā)送完畢以后,立即等待相應的 HTTP 響應的到來(lái);在收到 HTTP 響應以后,將其封裝成響應并作為輸出返回給下載器的調用方。
  其中,HTTP 客戶(hù)端程序可以由網(wǎng)路爬蟲(chóng)框架的使用方自行定義。另外,若在該子流程執行期間發(fā)生了錯誤,應該立刻以適當的方法告知使用方。對于其他模塊來(lái)講,也是這樣。
  2) 分析器接受響應類(lèi)型的數據,并根據該響應獲得 HTTP 響應;對該 HTTP 響應的內容進(jìn)行檢測,并按照給定的規則進(jìn)行剖析、篩選以及生成新的懇求或條目;將生成的懇求或條目作為輸出返回給分析器的調用方。
  在分析器的職責中,我可以想到的才能留給網(wǎng)路爬蟲(chóng)框架的使用方自定義的部份并不少。例如,對 HTTP 響應的前期檢測、對內容的篩選,以及生成懇求和條目的方法,等等。不過(guò),我在前面會(huì )對那些可以自定義的部份進(jìn)行一些抉擇。
  3) 條目處理管線(xiàn)接受條目類(lèi)型的數據,并對其執行若干步驟的處理;條目處理管線(xiàn)中可以產(chǎn)出最終的數據;這個(gè)最終的數據可以在其中的某個(gè)處理步驟中被持久化(不論是本地儲存還是發(fā)送給遠程的儲存服務(wù)器)以備后用。
  我們可以把這種處理步驟的具體實(shí)現留給網(wǎng)路爬蟲(chóng)框架的使用方自行定義。這樣,網(wǎng)絡(luò )爬蟲(chóng)框架就可以真正地與條目處理的細節脫離開(kāi)來(lái)。網(wǎng)絡(luò )爬蟲(chóng)框架絲毫不關(guān)心那些條目如何被處理和持久化,它僅僅負責控制整體的處理流程。我把負責單個(gè)處理步驟的程序稱(chēng)為條目處理器。
  條目處理器接受條目類(lèi)型的數據,并把處理完成的條目返回給條目處理管線(xiàn)。條目處理管線(xiàn)會(huì )緊接著(zhù)把該條目傳遞給下一個(gè)條目處理器,直至給定的條目處理器列表中的每位條目處理器都處理過(guò)該條目為止。
  4) 調度器調度器在啟動(dòng)時(shí)僅接受首次懇求,并且不會(huì )形成任何輸出。調度器的主要職責是調度各個(gè)處理模塊的運行。其中包括維護各個(gè)處理模塊的實(shí)例、在不同的處理模塊實(shí)例之間傳遞數據(包括懇求、響應和條目),以及監控所有那些被調度者的狀態(tài),等等。
  有了調度器的維護,各個(gè)處理模塊得以保持其職責的簡(jiǎn)約和專(zhuān)情。由于調度器是網(wǎng)路爬蟲(chóng)框架中最重要的一個(gè)模塊,所以還須要再編撰出一些工具來(lái)支撐起它的功能。
  在弄清楚網(wǎng)路爬蟲(chóng)框架中各個(gè)模塊的職責以后網(wǎng)絡(luò )爬蟲(chóng) 語(yǔ)言,你曉得它是以調度器為核心的。此外,為了并發(fā)執行的須要,除調度器之外的其他模塊都可以是多實(shí)例的,它們由調度器持有、維護和調用。反過(guò)來(lái)講,這些處理模塊的實(shí)例會(huì )從調度器那兒接受輸入,并在進(jìn)行相應的處理后將輸出返回給調度器。
  最后,與另外兩個(gè)處理模塊相比,條目處理管線(xiàn)是比較特殊的。顧名思義,它是以流式處理為基礎的,其設計靈感來(lái)自于我之前講過(guò)的 Linux 系統中的管線(xiàn)。
  我們可以不斷地向該管線(xiàn)發(fā)送條目,而該管線(xiàn)則會(huì )使其中的若干個(gè)條目處理器依次處理每一個(gè)條目。我們可以挺輕易地使用一些同步方式來(lái)保證條目處理管線(xiàn)的并發(fā)安全性,因此雖然調度器只持有該管線(xiàn)的一個(gè)實(shí)例,也不會(huì )有任何問(wèn)題。
  下圖展示了調度器與各個(gè)處理模塊之間的關(guān)系,圖中加入了一個(gè)新的元素——工具箱網(wǎng)絡(luò )爬蟲(chóng) 語(yǔ)言,之前所說(shuō)的用于支撐調度器功能的這些工具就是工具箱的一部分。顧名思義,工具箱不是一個(gè)完整的模塊,而是一些工具的集合,這些工具是調度器與所有處理模塊之間的橋梁。
  
  圖:調度器與各處理模塊的關(guān)系
  至此,大家對網(wǎng)路爬蟲(chóng)框架的設計有了一個(gè)宏觀(guān)上的認識。不過(guò),我還未提到在這個(gè)總體設計之下包含的大量設計方法和決策。這些方法和決策不但與一些通用的程序設計原則有關(guān),還涉及好多依賴(lài)于 Go語(yǔ)言的編程風(fēng)格和形式技巧。
  這也從側面說(shuō)明,由于幾乎所有語(yǔ)言都有著(zhù)十分鮮明的特征和比較擅長(cháng)的領(lǐng)域,所以在設計一個(gè)須要由特定語(yǔ)言實(shí)現的軟件或程序時(shí),多多少少會(huì )考慮到這門(mén)語(yǔ)言自身的特點(diǎn)。也就是說(shuō),軟件設計不是與具體的語(yǔ)言毫不相關(guān)的。反過(guò)來(lái)講,總會(huì )有一門(mén)或幾門(mén)語(yǔ)言十分適宜實(shí)現某一類(lèi)軟件或程序。

設計和實(shí)現一款輕量級的爬蟲(chóng)框架

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 327 次瀏覽 ? 2020-05-05 08:05 ? 來(lái)自相關(guān)話(huà)題

  
  說(shuō)起爬蟲(chóng),大家能否想起 Python 里赫赫有名的 Scrapy 框架, 在本文中我們參考這個(gè)設計思想使用 Java 語(yǔ)言來(lái)實(shí)現一款自己的爬蟲(chóng)框(lun)架(zi)。 我們從起點(diǎn)一步一步剖析爬蟲(chóng)框架的誕生過(guò)程。
  我把這個(gè)爬蟲(chóng)框架的源碼置于 github上,里面有幾個(gè)事例可以運行。
  
  關(guān)于爬蟲(chóng)的一切
  下面我們來(lái)介紹哪些是爬蟲(chóng)?以及爬蟲(chóng)框架的設計和碰到的問(wèn)題。
  什么是爬蟲(chóng)?
  “爬蟲(chóng)”不是一只生活在泥土里的小蟲(chóng)子,網(wǎng)絡(luò )爬蟲(chóng)(web crawler),也叫網(wǎng)路蜘蛛(spider),是一種拿來(lái)手動(dòng)瀏覽網(wǎng)路上內容的機器人。 爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站的過(guò)程會(huì )消耗目標系統資源,很多網(wǎng)站不容許被爬蟲(chóng)抓?。ㄟ@就是你遇見(jiàn)過(guò)的 robots.txt 文件, 這個(gè)文件可以要求機器人只對網(wǎng)站的一部分進(jìn)行索引,或完全不作處理)。 因此在訪(fǎng)問(wèn)大量頁(yè)面時(shí),爬蟲(chóng)須要考慮到規劃、負載,還須要講“禮貌”(大兄弟,慢點(diǎn))。
  互聯(lián)網(wǎng)上的頁(yè)面極多,即使是最大的爬蟲(chóng)系統也未能作出完整的索引。因此在公元2000年之前的萬(wàn)維網(wǎng)出現早期,搜索引擎常常找不到多少相關(guān)結果。 現在的搜索引擎在這方面早已進(jìn)步好多,能夠即刻給出高質(zhì)量結果。
  網(wǎng)絡(luò )爬蟲(chóng)會(huì )碰到的問(wèn)題
  既然有人想抓取,就會(huì )有人想防御。網(wǎng)絡(luò )爬蟲(chóng)在運行的過(guò)程中會(huì )碰到一些阻撓,在業(yè)內稱(chēng)之為 反爬蟲(chóng)策略 我們來(lái)列舉一些常見(jiàn)的。
  這些是傳統的反爬蟲(chóng)手段,當然未來(lái)也會(huì )愈加先進(jìn),技術(shù)的革新永遠會(huì )推動(dòng)多個(gè)行業(yè)的發(fā)展,畢竟 AI 的時(shí)代早已到來(lái), 爬蟲(chóng)和反爬蟲(chóng)的斗爭仍然持續進(jìn)行。
  爬蟲(chóng)框架要考慮哪些
  設計我們的框架
  我們要設計一款爬蟲(chóng)框架,是基于 Scrapy 的設計思路來(lái)完成的,先來(lái)瞧瞧在沒(méi)有爬蟲(chóng)框架的時(shí)侯我們是怎樣抓取頁(yè)面信息的。 一個(gè)常見(jiàn)的事例是使用 HttpClient 包或則 Jsoup 來(lái)處理,對于一個(gè)簡(jiǎn)單的小爬蟲(chóng)而言這足夠了。
  下面來(lái)演示一段沒(méi)有爬蟲(chóng)框架的時(shí)侯抓取頁(yè)面的代碼,這是我在網(wǎng)路上搜索的
  public class Reptile {
public static void main(String[] args) {
//傳入你所要爬取的頁(yè)面地址
String url1 = "";
//創(chuàng )建輸入流用于讀取流
InputStream is = null;
//包裝流,加快讀取速度
BufferedReader br = null;
//用來(lái)保存讀取頁(yè)面的數據.
StringBuffer html = new StringBuffer();
//創(chuàng )建臨時(shí)字符串用于保存每一次讀的一行數據,然后html調用append方法寫(xiě)入temp;
String temp = "";
try {
//獲取URL;
URL url2 = new URL(url1);
//打開(kāi)流,準備開(kāi)始讀取數據;
is = url2.openStream();
//將流包裝成字符流,調用br.readLine()可以提高讀取效率,每次讀取一行;
br= new BufferedReader(new InputStreamReader(is));
//讀取數據,調用br.readLine()方法每次讀取一行數據,并賦值給temp,如果沒(méi)數據則值==null,跳出循環(huán);
while ((temp = br.readLine()) != null) {
//將temp的值追加給html,這里注意的時(shí)String跟StringBuffere的區別前者不是可變的后者是可變的;
html.append(temp);
}
//接下來(lái)是關(guān)閉流,防止資源的浪費;
if(is != null) {
is.close();
is = null;
}
//通過(guò)Jsoup解析頁(yè)面,生成一個(gè)document對象;
Document doc = Jsoup.parse(html.toString());
//通過(guò)class的名字得到(即XX),一個(gè)數組對象Elements里面有我們想要的數據,至于這個(gè)div的值呢你打開(kāi)瀏覽器按下F12就知道了;
Elements elements = doc.getElementsByClass("XX");
for (Element element : elements) {
//打印出每一個(gè)節點(diǎn)的信息;你可以選擇性的保留你想要的數據,一般都是獲取個(gè)固定的索引;
System.out.println(element.text());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
  從這么豐富的注釋中我感受到了作者的耐心,我們來(lái)剖析一下這個(gè)爬蟲(chóng)在干哪些?
  大概就是這樣的步驟,代碼也十分簡(jiǎn)約,我們設計框架的目的是將這種流程統一化,把通用的功能進(jìn)行具象,減少重復工作。 還有一些沒(méi)考慮到的誘因添加進(jìn)去爬蟲(chóng)框架,那么設計爬蟲(chóng)框架要有什么組成呢?
  分別來(lái)解釋一下每位組成的作用是哪些。
  URL管理器
  爬蟲(chóng)框架要處理好多的URL,我們須要設計一個(gè)隊列儲存所有要處理的URL,這種先進(jìn)先出的數據結構十分符合這個(gè)需求。 將所有要下載的URL存貯在待處理隊列中,每次下載會(huì )取出一個(gè),隊列中還會(huì )少一個(gè)。我們曉得有些URL的下載會(huì )有反爬蟲(chóng)策略, 所以針對那些懇求須要做一些特殊的設置,進(jìn)而可以對URL進(jìn)行封裝抽出 Request。
  網(wǎng)頁(yè)下載器
  在上面的簡(jiǎn)單事例中可以看出,如果沒(méi)有網(wǎng)頁(yè)下載器,用戶(hù)就要編撰網(wǎng)路懇求的處理代碼,這無(wú)疑對每位URL都是相同的動(dòng)作。 所以在框架設計中我們直接加入它就好了,至于使用哪些庫來(lái)進(jìn)行下載都是可以的,你可以用 httpclient 也可以用 okhttp, 在本文中我們使用一個(gè)超輕量級的網(wǎng)路懇求庫 oh-my-request (沒(méi)錯,就是在下搞的)。 優(yōu)秀的框架設計會(huì )將這個(gè)下載組件置為可替換,提供默認的即可。
  爬蟲(chóng)調度器
  調度器和我們在開(kāi)發(fā) web 應用中的控制器是一個(gè)類(lèi)似的概念,它用于在下載器、解析器之間做流轉處理。 解析器可以解析到更多的URL發(fā)送給調度器,調度器再度的傳輸給下載器,這樣才會(huì )使各個(gè)組件有條不紊的進(jìn)行工作。
  網(wǎng)頁(yè)解析器
  我們曉得當一個(gè)頁(yè)面下載完成后就是一段 HTML 的 DOM 字符串表示,但還須要提取出真正須要的數據, 以前的做法是通過(guò) String 的 API 或者正則表達式的形式在 DOM 中搜救,這樣是很麻煩的,框架 應該提供一種合理、常用、方便的方法來(lái)幫助用戶(hù)完成提取數據這件事兒。常用的手段是通過(guò) xpath 或者 css 選擇器從 DOM 中進(jìn)行提取,而且學(xué)習這項技能在幾乎所有的爬蟲(chóng)框架中都是適用的。
  數據處理器
  普通的爬蟲(chóng)程序中是把 網(wǎng)頁(yè)解析器 和 數據處理器 合在一起的,解析到數據后馬上處理。 在一個(gè)標準化的爬蟲(chóng)程序中,他們應當是各司其職的,我們先通過(guò)解析器將須要的數據解析下來(lái),可能是封裝成對象。 然后傳遞給數據處理器,處理器接收到數據后可能是儲存到數據庫,也可能通過(guò)插口發(fā)送給老王。
  基本特點(diǎn)
  上面說(shuō)了這么多,我們設計的爬蟲(chóng)框架有以下幾個(gè)特點(diǎn),沒(méi)有做到大而全,可以稱(chēng)得上輕量迷你很好用。
  架構圖
  
  整個(gè)流程和 Scrapy 是一致的,但簡(jiǎn)化了一些操作
  執行流程圖
  
  項目結構
  該項目使用 Maven3、Java8 進(jìn)行完善,代碼結構如下:
  .
└── elves
├── Elves.java
├── ElvesEngine.java
├── config
├── download
├── event
├── pipeline
├── request
├── response
├── scheduler
├── spider
└── utils
  編碼要點(diǎn)
  前面設計思路明白以后,編程不過(guò)是順手之作,至于寫(xiě)的怎么審視的是程序員對編程語(yǔ)言的使用熟練度以及構架上的思索, 優(yōu)秀的代碼是經(jīng)驗和優(yōu)化而至的,下面我們來(lái)看幾個(gè)框架中的代碼示例。
  使用觀(guān)察者模式的思想來(lái)實(shí)現基于風(fēng)波驅動(dòng)的功能
  public enum ElvesEvent {
GLOBAL_STARTED,
SPIDER_STARTED
}
public class EventManager {
private static final Map<ElvesEvent, List<Consumer<Config>>> elvesEventConsumerMap = new HashMap<>();
// 注冊事件
public static void registerEvent(ElvesEvent elvesEvent, Consumer<Config> consumer) {
List<Consumer<Config>> consumers = elvesEventConsumerMap.get(elvesEvent);
if (null == consumers) {
consumers = new ArrayList<>();
}
consumers.add(consumer);
elvesEventConsumerMap.put(elvesEvent, consumers);
}
// 執行事件
public static void fireEvent(ElvesEvent elvesEvent, Config config) {
Optional.ofNullable(elvesEventConsumerMap.get(elvesEvent)).ifPresent(consumers -> consumers.forEach(consumer -> consumer.accept(config)));
}
}
  這段代碼中使用一個(gè) Map 來(lái)儲存所有風(fēng)波,提供兩個(gè)方式:注冊一個(gè)風(fēng)波、執行某個(gè)風(fēng)波。
  阻塞隊列儲存懇求響應
  public class Scheduler {
private BlockingQueue<Request> pending = new LinkedBlockingQueue<>();
private BlockingQueue<Response> result = new LinkedBlockingQueue<>();
public void addRequest(Request request) {
try {
this.pending.put(request);
} catch (InterruptedException e) {
log.error("向調度器添加 Request 出錯", e);
}
}
public void addResponse(Response response) {
try {
this.result.put(response);
} catch (InterruptedException e) {
log.error("向調度器添加 Response 出錯", e);
}
}
public boolean hasRequest() {
return pending.size() > 0;
}
public Request nextRequest() {
try {
return pending.take();
} catch (InterruptedException e) {
log.error("從調度器獲取 Request 出錯", e);
return null;
}
}
public boolean hasResponse() {
return result.size() > 0;
}
public Response nextResponse() {
try {
return result.take();
} catch (InterruptedException e) {
log.error("從調度器獲取 Response 出錯", e);
return null;
}
}
public void addRequests(List<Request> requests) {
requests.forEach(this::addRequest);
}
}
  pending 存儲等待處理的URL懇求,result 存儲下載成功的響應,調度器負責懇求和響應的獲取和添加流轉。
  舉個(gè)栗子
  設計好我們的爬蟲(chóng)框架后來(lái)試一下吧,這個(gè)事例我們來(lái)爬取豆瓣影片的標題。豆瓣影片中有很多分類(lèi),我們可以選擇幾個(gè)作為開(kāi)始抓取的 URL。
  public class DoubanSpider extends Spider {
public DoubanSpider(String name) {
super(name);
}
@Override
public void onStart(Config config) {
this.startUrls(
"https://movie.douban.com/tag/愛(ài)情",
"https://movie.douban.com/tag/喜劇",
"https://movie.douban.com/tag/動(dòng)畫(huà)",
"https://movie.douban.com/tag/動(dòng)作",
"https://movie.douban.com/tag/史詩(shī)",
"https://movie.douban.com/tag/犯罪");
this.addPipeline((Pipeline<List<String>>) (item, request) -> log.info("保存到文件: {}", item));
}
public Result parse(Response response) {
Result<List<String>> result = new Result<>();
Elements elements = response.body().css("#content table .pl2 a");
List<String> titles = elements.stream().map(Element::text).collect(Collectors.toList());
result.setItem(titles);
// 獲取下一頁(yè) URL
Elements nextEl = response.body().css("#content > div > div.article > div.paginator > span.next > a");
if (null != nextEl && nextEl.size() > 0) {
String nextPageUrl = nextEl.get(0).attr("href");
Request nextReq = this.makeRequest(nextPageUrl, this::parse);
result.addRequest(nextReq);
}
return result;
}
}
public static void main(String[] args) {
DoubanSpider doubanSpider = new DoubanSpider("豆瓣電影");
Elves.me(doubanSpider, Config.me()).start();
}
  這段代碼中在 onStart 方法是爬蟲(chóng)啟動(dòng)時(shí)的一個(gè)風(fēng)波,會(huì )在啟動(dòng)該爬蟲(chóng)的時(shí)侯執行,在這里我們設置了啟動(dòng)要抓取的URL列表。 然后添加了一個(gè)數據處理的 Pipeline,在這里處理管線(xiàn)中只進(jìn)行了輸出,你也可以?xún)Υ妗?br />   在 parse 方法中做了兩件事,首先解析當前抓取到的所有影片標題,將標題數據搜集為 List 傳遞給 Pipeline; 其次按照當前頁(yè)面繼續抓取下一頁(yè),將下一頁(yè)懇求傳遞給調度器爬蟲(chóng)框架,由調度器轉發(fā)給下載器。這里我們使用一個(gè) Result 對象接收。
  總結
  設計一款爬蟲(chóng)框架的基本要點(diǎn)在文中早已論述,要做的更好還有好多細節須要打磨,比如分布式、容錯恢復、動(dòng)態(tài)頁(yè)面抓取等問(wèn)題。 歡迎在 elves 中遞交你的意見(jiàn)。
  參考文獻 查看全部

  
  說(shuō)起爬蟲(chóng),大家能否想起 Python 里赫赫有名的 Scrapy 框架, 在本文中我們參考這個(gè)設計思想使用 Java 語(yǔ)言來(lái)實(shí)現一款自己的爬蟲(chóng)框(lun)架(zi)。 我們從起點(diǎn)一步一步剖析爬蟲(chóng)框架的誕生過(guò)程。
  我把這個(gè)爬蟲(chóng)框架的源碼置于 github上,里面有幾個(gè)事例可以運行。
  
  關(guān)于爬蟲(chóng)的一切
  下面我們來(lái)介紹哪些是爬蟲(chóng)?以及爬蟲(chóng)框架的設計和碰到的問(wèn)題。
  什么是爬蟲(chóng)?
  “爬蟲(chóng)”不是一只生活在泥土里的小蟲(chóng)子,網(wǎng)絡(luò )爬蟲(chóng)(web crawler),也叫網(wǎng)路蜘蛛(spider),是一種拿來(lái)手動(dòng)瀏覽網(wǎng)路上內容的機器人。 爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站的過(guò)程會(huì )消耗目標系統資源,很多網(wǎng)站不容許被爬蟲(chóng)抓?。ㄟ@就是你遇見(jiàn)過(guò)的 robots.txt 文件, 這個(gè)文件可以要求機器人只對網(wǎng)站的一部分進(jìn)行索引,或完全不作處理)。 因此在訪(fǎng)問(wèn)大量頁(yè)面時(shí),爬蟲(chóng)須要考慮到規劃、負載,還須要講“禮貌”(大兄弟,慢點(diǎn))。
  互聯(lián)網(wǎng)上的頁(yè)面極多,即使是最大的爬蟲(chóng)系統也未能作出完整的索引。因此在公元2000年之前的萬(wàn)維網(wǎng)出現早期,搜索引擎常常找不到多少相關(guān)結果。 現在的搜索引擎在這方面早已進(jìn)步好多,能夠即刻給出高質(zhì)量結果。
  網(wǎng)絡(luò )爬蟲(chóng)會(huì )碰到的問(wèn)題
  既然有人想抓取,就會(huì )有人想防御。網(wǎng)絡(luò )爬蟲(chóng)在運行的過(guò)程中會(huì )碰到一些阻撓,在業(yè)內稱(chēng)之為 反爬蟲(chóng)策略 我們來(lái)列舉一些常見(jiàn)的。
  這些是傳統的反爬蟲(chóng)手段,當然未來(lái)也會(huì )愈加先進(jìn),技術(shù)的革新永遠會(huì )推動(dòng)多個(gè)行業(yè)的發(fā)展,畢竟 AI 的時(shí)代早已到來(lái), 爬蟲(chóng)和反爬蟲(chóng)的斗爭仍然持續進(jìn)行。
  爬蟲(chóng)框架要考慮哪些
  設計我們的框架
  我們要設計一款爬蟲(chóng)框架,是基于 Scrapy 的設計思路來(lái)完成的,先來(lái)瞧瞧在沒(méi)有爬蟲(chóng)框架的時(shí)侯我們是怎樣抓取頁(yè)面信息的。 一個(gè)常見(jiàn)的事例是使用 HttpClient 包或則 Jsoup 來(lái)處理,對于一個(gè)簡(jiǎn)單的小爬蟲(chóng)而言這足夠了。
  下面來(lái)演示一段沒(méi)有爬蟲(chóng)框架的時(shí)侯抓取頁(yè)面的代碼,這是我在網(wǎng)路上搜索的
  public class Reptile {
public static void main(String[] args) {
//傳入你所要爬取的頁(yè)面地址
String url1 = "";
//創(chuàng )建輸入流用于讀取流
InputStream is = null;
//包裝流,加快讀取速度
BufferedReader br = null;
//用來(lái)保存讀取頁(yè)面的數據.
StringBuffer html = new StringBuffer();
//創(chuàng )建臨時(shí)字符串用于保存每一次讀的一行數據,然后html調用append方法寫(xiě)入temp;
String temp = "";
try {
//獲取URL;
URL url2 = new URL(url1);
//打開(kāi)流,準備開(kāi)始讀取數據;
is = url2.openStream();
//將流包裝成字符流,調用br.readLine()可以提高讀取效率,每次讀取一行;
br= new BufferedReader(new InputStreamReader(is));
//讀取數據,調用br.readLine()方法每次讀取一行數據,并賦值給temp,如果沒(méi)數據則值==null,跳出循環(huán);
while ((temp = br.readLine()) != null) {
//將temp的值追加給html,這里注意的時(shí)String跟StringBuffere的區別前者不是可變的后者是可變的;
html.append(temp);
}
//接下來(lái)是關(guān)閉流,防止資源的浪費;
if(is != null) {
is.close();
is = null;
}
//通過(guò)Jsoup解析頁(yè)面,生成一個(gè)document對象;
Document doc = Jsoup.parse(html.toString());
//通過(guò)class的名字得到(即XX),一個(gè)數組對象Elements里面有我們想要的數據,至于這個(gè)div的值呢你打開(kāi)瀏覽器按下F12就知道了;
Elements elements = doc.getElementsByClass("XX");
for (Element element : elements) {
//打印出每一個(gè)節點(diǎn)的信息;你可以選擇性的保留你想要的數據,一般都是獲取個(gè)固定的索引;
System.out.println(element.text());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
  從這么豐富的注釋中我感受到了作者的耐心,我們來(lái)剖析一下這個(gè)爬蟲(chóng)在干哪些?
  大概就是這樣的步驟,代碼也十分簡(jiǎn)約,我們設計框架的目的是將這種流程統一化,把通用的功能進(jìn)行具象,減少重復工作。 還有一些沒(méi)考慮到的誘因添加進(jìn)去爬蟲(chóng)框架,那么設計爬蟲(chóng)框架要有什么組成呢?
  分別來(lái)解釋一下每位組成的作用是哪些。
  URL管理器
  爬蟲(chóng)框架要處理好多的URL,我們須要設計一個(gè)隊列儲存所有要處理的URL,這種先進(jìn)先出的數據結構十分符合這個(gè)需求。 將所有要下載的URL存貯在待處理隊列中,每次下載會(huì )取出一個(gè),隊列中還會(huì )少一個(gè)。我們曉得有些URL的下載會(huì )有反爬蟲(chóng)策略, 所以針對那些懇求須要做一些特殊的設置,進(jìn)而可以對URL進(jìn)行封裝抽出 Request。
  網(wǎng)頁(yè)下載器
  在上面的簡(jiǎn)單事例中可以看出,如果沒(méi)有網(wǎng)頁(yè)下載器,用戶(hù)就要編撰網(wǎng)路懇求的處理代碼,這無(wú)疑對每位URL都是相同的動(dòng)作。 所以在框架設計中我們直接加入它就好了,至于使用哪些庫來(lái)進(jìn)行下載都是可以的,你可以用 httpclient 也可以用 okhttp, 在本文中我們使用一個(gè)超輕量級的網(wǎng)路懇求庫 oh-my-request (沒(méi)錯,就是在下搞的)。 優(yōu)秀的框架設計會(huì )將這個(gè)下載組件置為可替換,提供默認的即可。
  爬蟲(chóng)調度器
  調度器和我們在開(kāi)發(fā) web 應用中的控制器是一個(gè)類(lèi)似的概念,它用于在下載器、解析器之間做流轉處理。 解析器可以解析到更多的URL發(fā)送給調度器,調度器再度的傳輸給下載器,這樣才會(huì )使各個(gè)組件有條不紊的進(jìn)行工作。
  網(wǎng)頁(yè)解析器
  我們曉得當一個(gè)頁(yè)面下載完成后就是一段 HTML 的 DOM 字符串表示,但還須要提取出真正須要的數據, 以前的做法是通過(guò) String 的 API 或者正則表達式的形式在 DOM 中搜救,這樣是很麻煩的,框架 應該提供一種合理、常用、方便的方法來(lái)幫助用戶(hù)完成提取數據這件事兒。常用的手段是通過(guò) xpath 或者 css 選擇器從 DOM 中進(jìn)行提取,而且學(xué)習這項技能在幾乎所有的爬蟲(chóng)框架中都是適用的。
  數據處理器
  普通的爬蟲(chóng)程序中是把 網(wǎng)頁(yè)解析器 和 數據處理器 合在一起的,解析到數據后馬上處理。 在一個(gè)標準化的爬蟲(chóng)程序中,他們應當是各司其職的,我們先通過(guò)解析器將須要的數據解析下來(lái),可能是封裝成對象。 然后傳遞給數據處理器,處理器接收到數據后可能是儲存到數據庫,也可能通過(guò)插口發(fā)送給老王。
  基本特點(diǎn)
  上面說(shuō)了這么多,我們設計的爬蟲(chóng)框架有以下幾個(gè)特點(diǎn),沒(méi)有做到大而全,可以稱(chēng)得上輕量迷你很好用。
  架構圖
  
  整個(gè)流程和 Scrapy 是一致的,但簡(jiǎn)化了一些操作
  執行流程圖
  
  項目結構
  該項目使用 Maven3、Java8 進(jìn)行完善,代碼結構如下:
  .
└── elves
├── Elves.java
├── ElvesEngine.java
├── config
├── download
├── event
├── pipeline
├── request
├── response
├── scheduler
├── spider
└── utils
  編碼要點(diǎn)
  前面設計思路明白以后,編程不過(guò)是順手之作,至于寫(xiě)的怎么審視的是程序員對編程語(yǔ)言的使用熟練度以及構架上的思索, 優(yōu)秀的代碼是經(jīng)驗和優(yōu)化而至的,下面我們來(lái)看幾個(gè)框架中的代碼示例。
  使用觀(guān)察者模式的思想來(lái)實(shí)現基于風(fēng)波驅動(dòng)的功能
  public enum ElvesEvent {
GLOBAL_STARTED,
SPIDER_STARTED
}
public class EventManager {
private static final Map<ElvesEvent, List<Consumer<Config>>> elvesEventConsumerMap = new HashMap<>();
// 注冊事件
public static void registerEvent(ElvesEvent elvesEvent, Consumer<Config> consumer) {
List<Consumer<Config>> consumers = elvesEventConsumerMap.get(elvesEvent);
if (null == consumers) {
consumers = new ArrayList<>();
}
consumers.add(consumer);
elvesEventConsumerMap.put(elvesEvent, consumers);
}
// 執行事件
public static void fireEvent(ElvesEvent elvesEvent, Config config) {
Optional.ofNullable(elvesEventConsumerMap.get(elvesEvent)).ifPresent(consumers -> consumers.forEach(consumer -> consumer.accept(config)));
}
}
  這段代碼中使用一個(gè) Map 來(lái)儲存所有風(fēng)波,提供兩個(gè)方式:注冊一個(gè)風(fēng)波、執行某個(gè)風(fēng)波。
  阻塞隊列儲存懇求響應
  public class Scheduler {
private BlockingQueue<Request> pending = new LinkedBlockingQueue<>();
private BlockingQueue<Response> result = new LinkedBlockingQueue<>();
public void addRequest(Request request) {
try {
this.pending.put(request);
} catch (InterruptedException e) {
log.error("向調度器添加 Request 出錯", e);
}
}
public void addResponse(Response response) {
try {
this.result.put(response);
} catch (InterruptedException e) {
log.error("向調度器添加 Response 出錯", e);
}
}
public boolean hasRequest() {
return pending.size() > 0;
}
public Request nextRequest() {
try {
return pending.take();
} catch (InterruptedException e) {
log.error("從調度器獲取 Request 出錯", e);
return null;
}
}
public boolean hasResponse() {
return result.size() > 0;
}
public Response nextResponse() {
try {
return result.take();
} catch (InterruptedException e) {
log.error("從調度器獲取 Response 出錯", e);
return null;
}
}
public void addRequests(List<Request> requests) {
requests.forEach(this::addRequest);
}
}
  pending 存儲等待處理的URL懇求,result 存儲下載成功的響應,調度器負責懇求和響應的獲取和添加流轉。
  舉個(gè)栗子
  設計好我們的爬蟲(chóng)框架后來(lái)試一下吧,這個(gè)事例我們來(lái)爬取豆瓣影片的標題。豆瓣影片中有很多分類(lèi),我們可以選擇幾個(gè)作為開(kāi)始抓取的 URL。
  public class DoubanSpider extends Spider {
public DoubanSpider(String name) {
super(name);
}
@Override
public void onStart(Config config) {
this.startUrls(
"https://movie.douban.com/tag/愛(ài)情",
"https://movie.douban.com/tag/喜劇",
"https://movie.douban.com/tag/動(dòng)畫(huà)",
"https://movie.douban.com/tag/動(dòng)作",
"https://movie.douban.com/tag/史詩(shī)",
"https://movie.douban.com/tag/犯罪");
this.addPipeline((Pipeline<List<String>>) (item, request) -> log.info("保存到文件: {}", item));
}
public Result parse(Response response) {
Result<List<String>> result = new Result<>();
Elements elements = response.body().css("#content table .pl2 a");
List<String> titles = elements.stream().map(Element::text).collect(Collectors.toList());
result.setItem(titles);
// 獲取下一頁(yè) URL
Elements nextEl = response.body().css("#content > div > div.article > div.paginator > span.next > a");
if (null != nextEl && nextEl.size() > 0) {
String nextPageUrl = nextEl.get(0).attr("href");
Request nextReq = this.makeRequest(nextPageUrl, this::parse);
result.addRequest(nextReq);
}
return result;
}
}
public static void main(String[] args) {
DoubanSpider doubanSpider = new DoubanSpider("豆瓣電影");
Elves.me(doubanSpider, Config.me()).start();
}
  這段代碼中在 onStart 方法是爬蟲(chóng)啟動(dòng)時(shí)的一個(gè)風(fēng)波,會(huì )在啟動(dòng)該爬蟲(chóng)的時(shí)侯執行,在這里我們設置了啟動(dòng)要抓取的URL列表。 然后添加了一個(gè)數據處理的 Pipeline,在這里處理管線(xiàn)中只進(jìn)行了輸出,你也可以?xún)Υ妗?br />   在 parse 方法中做了兩件事,首先解析當前抓取到的所有影片標題,將標題數據搜集為 List 傳遞給 Pipeline; 其次按照當前頁(yè)面繼續抓取下一頁(yè),將下一頁(yè)懇求傳遞給調度器爬蟲(chóng)框架,由調度器轉發(fā)給下載器。這里我們使用一個(gè) Result 對象接收。
  總結
  設計一款爬蟲(chóng)框架的基本要點(diǎn)在文中早已論述,要做的更好還有好多細節須要打磨,比如分布式、容錯恢復、動(dòng)態(tài)頁(yè)面抓取等問(wèn)題。 歡迎在 elves 中遞交你的意見(jiàn)。
  參考文獻

[申精]淘寶網(wǎng)爬蟲(chóng)引擎設計構架圖等

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 300 次瀏覽 ? 2020-05-05 08:03 ? 來(lái)自相關(guān)話(huà)題

  
  
  
  
  更多貼子
  豬孩子啊啊大大
  
  本版專(zhuān)家分:0
  在《淘寶網(wǎng)》購物時(shí)爬蟲(chóng)框架設計,顧客最關(guān)心的就是這兩個(gè)頁(yè)面(這兩個(gè)頁(yè)面的網(wǎng)址sample分別為
  ;item_num_id=3899429723&cm_cat=50010388和),因此這兩個(gè)頁(yè)面的信息對于客戶(hù)至關(guān)重要,這也是我的搜索引擎信息搜集的地方。由于有成千上萬(wàn)的這樣格式的頁(yè)面,所以我的目標就是設計出一個(gè)爬蟲(chóng)引擎在《淘寶網(wǎng)》上不斷地爬,以零下載為條件,直接將目標信息數據導出我創(chuàng )建的數據庫中,再進(jìn)行搜索。
  綜合剖析這兩個(gè)典型頁(yè)面,我們可以得到這樣的信息:大部分《淘寶網(wǎng)》的商品和商家信息都是根據這兩個(gè)頁(yè)面的格式方式存在的。所以借此便可以寫(xiě)出程序推算出整個(gè)《淘寶網(wǎng)》的數據。
  
  頁(yè)面HTML源碼關(guān)鍵點(diǎn)
  我在網(wǎng)上詳盡查閱了有關(guān)爬蟲(chóng)引擎的資料和仔細選購了開(kāi)源框架后。決定使用以下幾個(gè)框架作為我的爬蟲(chóng)引擎的主要框架。
  1.HtmlParser
  這個(gè)開(kāi)源框架主要用于解析Html格式的頁(yè)面,這個(gè)框架的目的就是從當前頁(yè)面將關(guān)鍵數據提取下來(lái),從而在零下載的情況下得到數據。由于這個(gè)框架時(shí)間比較早,未免有些比較陳舊的做法,比如NodeList類(lèi)沒(méi)有實(shí)現Iterator插口爬蟲(chóng)框架設計,沒(méi)有借助類(lèi)庫等。以后的項目中可以替換為較新較成熟的框架。
  2.ApacheCommonsChain
  在網(wǎng)頁(yè)提取過(guò)程中,每個(gè)不同頁(yè)面究竟該用那個(gè)類(lèi)來(lái)負責解析呢?仔細剖析后,我個(gè)人認為使用【設計模式】中的責任鏈模式可以極大地減少代碼耦合性,達到【軟件工程】中開(kāi)閉原則的療效。減少ifelse繁雜的判定,使代碼更清晰。
  3.iBatis
  我經(jīng)過(guò)對比,選擇了iBatis作為DAO層的數據儲存框架,由于其可以靈活的配置SQL句子,以及輕量級設計,可以使我使用一些數據庫存儲過(guò)程等維持字段的約束。
  4.ApacheCommonsBeanutils
  這個(gè)框架的BeanMap是一個(gè)挺好的東西,它采用了一個(gè)反射的做法給我提供了一個(gè)可以將Map屬性通配符對轉化為bean類(lèi)的方式,利用這個(gè)類(lèi)可以讓頁(yè)面提取出的Map中包含的數據用一個(gè)統一的方式轉化為實(shí)體類(lèi),再存入數據庫。
  
  爬蟲(chóng)引擎程序流程圖
  最終,得到了大量的《淘寶網(wǎng)》的商品和店家的數據庫表中的數據,由于這個(gè)爬蟲(chóng)引擎借助“責任鏈模式”解析數據,可以靈活地擴充到其他不同結構的網(wǎng)頁(yè)中去提取數據,在此基礎上再實(shí)現搜索。(很抱歉,由于我下班后業(yè)余時(shí)間之作,時(shí)間匆忙,全文搜索這部份未完成,考慮計劃使用ApacheLucene開(kāi)源框架做智能全文搜索框架) 查看全部

  
  
  
  
  更多貼子
  豬孩子啊啊大大
  
  本版專(zhuān)家分:0
  在《淘寶網(wǎng)》購物時(shí)爬蟲(chóng)框架設計,顧客最關(guān)心的就是這兩個(gè)頁(yè)面(這兩個(gè)頁(yè)面的網(wǎng)址sample分別為
  ;item_num_id=3899429723&cm_cat=50010388和),因此這兩個(gè)頁(yè)面的信息對于客戶(hù)至關(guān)重要,這也是我的搜索引擎信息搜集的地方。由于有成千上萬(wàn)的這樣格式的頁(yè)面,所以我的目標就是設計出一個(gè)爬蟲(chóng)引擎在《淘寶網(wǎng)》上不斷地爬,以零下載為條件,直接將目標信息數據導出我創(chuàng )建的數據庫中,再進(jìn)行搜索。
  綜合剖析這兩個(gè)典型頁(yè)面,我們可以得到這樣的信息:大部分《淘寶網(wǎng)》的商品和商家信息都是根據這兩個(gè)頁(yè)面的格式方式存在的。所以借此便可以寫(xiě)出程序推算出整個(gè)《淘寶網(wǎng)》的數據。
  
  頁(yè)面HTML源碼關(guān)鍵點(diǎn)
  我在網(wǎng)上詳盡查閱了有關(guān)爬蟲(chóng)引擎的資料和仔細選購了開(kāi)源框架后。決定使用以下幾個(gè)框架作為我的爬蟲(chóng)引擎的主要框架。
  1.HtmlParser
  這個(gè)開(kāi)源框架主要用于解析Html格式的頁(yè)面,這個(gè)框架的目的就是從當前頁(yè)面將關(guān)鍵數據提取下來(lái),從而在零下載的情況下得到數據。由于這個(gè)框架時(shí)間比較早,未免有些比較陳舊的做法,比如NodeList類(lèi)沒(méi)有實(shí)現Iterator插口爬蟲(chóng)框架設計,沒(méi)有借助類(lèi)庫等。以后的項目中可以替換為較新較成熟的框架。
  2.ApacheCommonsChain
  在網(wǎng)頁(yè)提取過(guò)程中,每個(gè)不同頁(yè)面究竟該用那個(gè)類(lèi)來(lái)負責解析呢?仔細剖析后,我個(gè)人認為使用【設計模式】中的責任鏈模式可以極大地減少代碼耦合性,達到【軟件工程】中開(kāi)閉原則的療效。減少ifelse繁雜的判定,使代碼更清晰。
  3.iBatis
  我經(jīng)過(guò)對比,選擇了iBatis作為DAO層的數據儲存框架,由于其可以靈活的配置SQL句子,以及輕量級設計,可以使我使用一些數據庫存儲過(guò)程等維持字段的約束。
  4.ApacheCommonsBeanutils
  這個(gè)框架的BeanMap是一個(gè)挺好的東西,它采用了一個(gè)反射的做法給我提供了一個(gè)可以將Map屬性通配符對轉化為bean類(lèi)的方式,利用這個(gè)類(lèi)可以讓頁(yè)面提取出的Map中包含的數據用一個(gè)統一的方式轉化為實(shí)體類(lèi),再存入數據庫。
  
  爬蟲(chóng)引擎程序流程圖
  最終,得到了大量的《淘寶網(wǎng)》的商品和店家的數據庫表中的數據,由于這個(gè)爬蟲(chóng)引擎借助“責任鏈模式”解析數據,可以靈活地擴充到其他不同結構的網(wǎng)頁(yè)中去提取數據,在此基礎上再實(shí)現搜索。(很抱歉,由于我下班后業(yè)余時(shí)間之作,時(shí)間匆忙,全文搜索這部份未完成,考慮計劃使用ApacheLucene開(kāi)源框架做智能全文搜索框架)

爬蟲(chóng)框架是哪些?常見(jiàn)的Python爬蟲(chóng)框架有什么?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 309 次瀏覽 ? 2020-05-02 08:09 ? 來(lái)自相關(guān)話(huà)題

  爬蟲(chóng)框架是哪些?常見(jiàn)的 Python 爬蟲(chóng)框架有什么?學(xué)習爬蟲(chóng)的人對爬蟲(chóng)框架并不陌生,在爬蟲(chóng)漸漸入門(mén)以后,可以有兩個(gè)選擇。 一個(gè)是深入學(xué)習, 比如設計模式相關(guān)的一些知識, 強化 Python 相關(guān)知識,自己動(dòng)手造輪子爬蟲(chóng)框架, 繼續為自己的爬蟲(chóng)降低分布式,多線(xiàn)程等功能擴充。另一條路便是學(xué)習一些優(yōu)秀的框架, 先把這種框架用熟, 可以確保才能應付一些基本的爬蟲(chóng) 任務(wù),也就是可以解決基本的爬蟲(chóng)問(wèn)題,然后再深入學(xué)習它的源碼等知識,進(jìn)一步加強。所以,爬蟲(chóng)框架就是前人積累出來(lái)的,可以滿(mǎn)足自己爬蟲(chóng)需求,又可以以此提高自己的爬蟲(chóng) 水平。那么,爬蟲(chóng)框架都有什么呢?常見(jiàn) python 爬蟲(chóng)框架(1)Scrapy:很強悍的爬蟲(chóng)框架,可以滿(mǎn)足簡(jiǎn)單的頁(yè)面爬?。ū热缈梢悦魑弥?url pattern 的 情況) 。用這個(gè)框架可以輕松爬出來(lái)如亞馬遜商品信息之類(lèi)的數據。但是對于稍稍復雜一點(diǎn) 的頁(yè)面爬蟲(chóng)框架,如 weibo 的頁(yè)面信息,這個(gè)框架就滿(mǎn)足不了需求了。(2)Crawley: 高速爬取對應網(wǎng)站的內容, 支持關(guān)系和非關(guān)系數據庫, 數據可以導入為 JSON、 XML 等(3)Portia:可視化爬取網(wǎng)頁(yè)內容(4)newspaper:提取新聞、文章以及內容剖析(5)python-goose:java 寫(xiě)的文章提取工具(6)Beautiful Soup:名氣大,整合了一些常用爬蟲(chóng)需求。缺點(diǎn):不能加載 JS。(7)mechanize:優(yōu)點(diǎn):可以加載 JS。缺點(diǎn):文檔嚴重缺位。不過(guò)通過(guò)官方的 example 以及 人肉嘗試的方式,還是勉強能用的。(8)selenium:這是一個(gè)調用瀏覽器的 driver, 通過(guò)這個(gè)庫你可以直接調用瀏覽器完成個(gè)別操 作,比如輸入驗證碼。(9)cola:一個(gè)分布式爬蟲(chóng)框架。項目整體設計有點(diǎn)糟,模塊間耦合度較高。 查看全部

  爬蟲(chóng)框架是哪些?常見(jiàn)的 Python 爬蟲(chóng)框架有什么?學(xué)習爬蟲(chóng)的人對爬蟲(chóng)框架并不陌生,在爬蟲(chóng)漸漸入門(mén)以后,可以有兩個(gè)選擇。 一個(gè)是深入學(xué)習, 比如設計模式相關(guān)的一些知識, 強化 Python 相關(guān)知識,自己動(dòng)手造輪子爬蟲(chóng)框架, 繼續為自己的爬蟲(chóng)降低分布式,多線(xiàn)程等功能擴充。另一條路便是學(xué)習一些優(yōu)秀的框架, 先把這種框架用熟, 可以確保才能應付一些基本的爬蟲(chóng) 任務(wù),也就是可以解決基本的爬蟲(chóng)問(wèn)題,然后再深入學(xué)習它的源碼等知識,進(jìn)一步加強。所以,爬蟲(chóng)框架就是前人積累出來(lái)的,可以滿(mǎn)足自己爬蟲(chóng)需求,又可以以此提高自己的爬蟲(chóng) 水平。那么,爬蟲(chóng)框架都有什么呢?常見(jiàn) python 爬蟲(chóng)框架(1)Scrapy:很強悍的爬蟲(chóng)框架,可以滿(mǎn)足簡(jiǎn)單的頁(yè)面爬?。ū热缈梢悦魑弥?url pattern 的 情況) 。用這個(gè)框架可以輕松爬出來(lái)如亞馬遜商品信息之類(lèi)的數據。但是對于稍稍復雜一點(diǎn) 的頁(yè)面爬蟲(chóng)框架,如 weibo 的頁(yè)面信息,這個(gè)框架就滿(mǎn)足不了需求了。(2)Crawley: 高速爬取對應網(wǎng)站的內容, 支持關(guān)系和非關(guān)系數據庫, 數據可以導入為 JSON、 XML 等(3)Portia:可視化爬取網(wǎng)頁(yè)內容(4)newspaper:提取新聞、文章以及內容剖析(5)python-goose:java 寫(xiě)的文章提取工具(6)Beautiful Soup:名氣大,整合了一些常用爬蟲(chóng)需求。缺點(diǎn):不能加載 JS。(7)mechanize:優(yōu)點(diǎn):可以加載 JS。缺點(diǎn):文檔嚴重缺位。不過(guò)通過(guò)官方的 example 以及 人肉嘗試的方式,還是勉強能用的。(8)selenium:這是一個(gè)調用瀏覽器的 driver, 通過(guò)這個(gè)庫你可以直接調用瀏覽器完成個(gè)別操 作,比如輸入驗證碼。(9)cola:一個(gè)分布式爬蟲(chóng)框架。項目整體設計有點(diǎn)糟,模塊間耦合度較高。

推薦10款流行的java開(kāi)源的網(wǎng)絡(luò )爬蟲(chóng)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 366 次瀏覽 ? 2020-06-29 08:03 ? 來(lái)自相關(guān)話(huà)題

  1:JAVA爬蟲(chóng)WebCollector(Star:1345)
  爬蟲(chóng)簡(jiǎn)介: WebCollector是一個(gè)無(wú)須配置、便于二次開(kāi)發(fā)的JAVA爬蟲(chóng)框架(內核)java單機爬蟲(chóng)框架,它提供精簡(jiǎn)的的API,只需少量代碼即可實(shí)現一個(gè)功能強悍的爬蟲(chóng)。WebCollector-Hadoop是WebCollector的Hadoop版本java單機爬蟲(chóng)框架,支持分布式爬取。 爬蟲(chóng)內核: WebCollector致...
  2:開(kāi)源通用爬蟲(chóng)框架YayCrawler(Star:91)
  YayCrawler是一個(gè)基于WebMagic開(kāi)發(fā)的分布式通用爬蟲(chóng)框架,開(kāi)發(fā)語(yǔ)言是Java。我們曉得目前爬蟲(chóng)框架好多,有簡(jiǎn)單的,也有復雜的,有輕 量型的,也有重量型的
  3:垂直爬蟲(chóng)WebMagic(Star:1213)
  webmagic的是一個(gè)無(wú)須配置、便于二次開(kāi)發(fā)的爬蟲(chóng)框架,它提供簡(jiǎn)單靈活的API,只需少量代碼即可實(shí)現一個(gè)爬蟲(chóng)。 以下是爬取oschina博客的一段代碼: Spider.create(newSimplePageProcessor("", "http...
  4:雅虎開(kāi)源的Nutch爬蟲(chóng)插件 Anthelion(Star:2888)
  Anthelion 是 Nutch 插件,專(zhuān)注于爬取語(yǔ)義數據。 注意:此項目包括完整的 Nutch 1.6 版本,此插件放置在 /src/plugin/parse-anth Anthelion 使用在線(xiàn)學(xué)習方式來(lái)基于頁(yè)面上下文預測富數據 Web 頁(yè)面,從之前查看的頁(yè)面提取的元數據獲取反饋。 主要有三個(gè)擴充: AnthelionScoringFilter WdcParser TripleExtractor 示例:...
  5:Java開(kāi)源網(wǎng)路爬蟲(chóng)項目Nutch
  Nutch是一個(gè)開(kāi)源Java實(shí)現的搜索引擎。它提供了我們運行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬蟲(chóng)。 Nutch的創(chuàng )始人是Doug Cutting,他同時(shí)也是Lucene、Hadoop和Avro開(kāi)源項目的創(chuàng )始人。 Nutch誕生于2002年8月,是Apache旗下的一個(gè)用Java實(shí)現的開(kāi)源搜索引擎項目,自Nutch1.2版本以后,Nutch早已從搜索引擎演...
  6:Java網(wǎng)路蜘蛛/網(wǎng)絡(luò )爬蟲(chóng)Spiderman(Star:1801)
  Spiderman - 又一個(gè)Java網(wǎng)路蜘蛛/爬蟲(chóng) Spiderman 是一個(gè)基于微內核+插件式構架的網(wǎng)路蜘蛛,它的目標是通過(guò)簡(jiǎn)單的方式能夠將復雜的目標網(wǎng)頁(yè)信息抓取并解析為自己所須要的業(yè)務(wù)數據。 最新提示:歡迎來(lái)體驗最新版本Spiderman2,
  7:輕量化的Java網(wǎng)路爬蟲(chóng) GECCO(Star:658)
  Gecco是哪些 Gecco是一款用java語(yǔ)言開(kāi)發(fā)的輕量化的易用的網(wǎng)路爬蟲(chóng)。Gecco整合了jsoup、httpclient、fastjson、spring、htmlunit、redission等優(yōu)秀框架,讓您只須要配置一些jquery風(fēng)格的選擇器能夠很快的寫(xiě)出一個(gè)爬蟲(chóng)。Gecco框架有優(yōu)秀的可擴展性,框架基于開(kāi)閉原則進(jìn)行設計,對更改關(guān)掉、對擴充開(kāi)放。同時(shí)Gecco基于非常開(kāi)...
  8:開(kāi)源爬蟲(chóng)框架WebPasser(Star:15)
  WebPasser是一款可配置的開(kāi)源爬蟲(chóng)框架,提供爬蟲(chóng)控制臺管理界面,通過(guò)配置解析各種網(wǎng)頁(yè)內容,無(wú)需寫(xiě)一句java代碼即可抽取所需數據。 1.包含強悍的頁(yè)面解析引擎,提供jsoup、xpath、正則表達式等處理鏈,通過(guò)簡(jiǎn)單配置即可抽取所需的指定內容。 2.提供爬蟲(chóng)控制管理界面,可實(shí)時(shí)監控抓取狀...
  9:一個(gè)敏捷強悍的Java爬蟲(chóng)框架SeimiCrawler(Star:635)
  SeimiCrawler是一個(gè)敏捷的,獨立布署的,支持分布式的Java爬蟲(chóng)框架,希望能在最大程度上減少菜鳥(niǎo)開(kāi)發(fā)一個(gè)可用性高且性能不差的爬蟲(chóng)系統的門(mén)檻,以及提高開(kāi)發(fā)爬蟲(chóng)系統的開(kāi)發(fā)效率。
  10:爬蟲(chóng)系統NEOCrawler(Star:258)
  NEOCrawler(中文名:???,是nodejs、redis、phantomjs實(shí)現的爬蟲(chóng)系統。代碼完全開(kāi)源,適合用于垂直領(lǐng)域的數據采集和爬蟲(chóng)二次開(kāi)發(fā)。 【主要特征】 使用nodejs實(shí)現,javascipt簡(jiǎn)單、高效、易學(xué)、為爬蟲(chóng)的開(kāi)發(fā)以及爬蟲(chóng)使用者的二次開(kāi)發(fā)節省不少時(shí)間;nodejs讓...
  推薦10款流行的java開(kāi)源的網(wǎng)絡(luò )爬蟲(chóng) 查看全部

  1:JAVA爬蟲(chóng)WebCollector(Star:1345)
  爬蟲(chóng)簡(jiǎn)介: WebCollector是一個(gè)無(wú)須配置、便于二次開(kāi)發(fā)的JAVA爬蟲(chóng)框架(內核)java單機爬蟲(chóng)框架,它提供精簡(jiǎn)的的API,只需少量代碼即可實(shí)現一個(gè)功能強悍的爬蟲(chóng)。WebCollector-Hadoop是WebCollector的Hadoop版本java單機爬蟲(chóng)框架,支持分布式爬取。 爬蟲(chóng)內核: WebCollector致...
  2:開(kāi)源通用爬蟲(chóng)框架YayCrawler(Star:91)
  YayCrawler是一個(gè)基于WebMagic開(kāi)發(fā)的分布式通用爬蟲(chóng)框架,開(kāi)發(fā)語(yǔ)言是Java。我們曉得目前爬蟲(chóng)框架好多,有簡(jiǎn)單的,也有復雜的,有輕 量型的,也有重量型的
  3:垂直爬蟲(chóng)WebMagic(Star:1213)
  webmagic的是一個(gè)無(wú)須配置、便于二次開(kāi)發(fā)的爬蟲(chóng)框架,它提供簡(jiǎn)單靈活的API,只需少量代碼即可實(shí)現一個(gè)爬蟲(chóng)。 以下是爬取oschina博客的一段代碼: Spider.create(newSimplePageProcessor("", "http...
  4:雅虎開(kāi)源的Nutch爬蟲(chóng)插件 Anthelion(Star:2888)
  Anthelion 是 Nutch 插件,專(zhuān)注于爬取語(yǔ)義數據。 注意:此項目包括完整的 Nutch 1.6 版本,此插件放置在 /src/plugin/parse-anth Anthelion 使用在線(xiàn)學(xué)習方式來(lái)基于頁(yè)面上下文預測富數據 Web 頁(yè)面,從之前查看的頁(yè)面提取的元數據獲取反饋。 主要有三個(gè)擴充: AnthelionScoringFilter WdcParser TripleExtractor 示例:...
  5:Java開(kāi)源網(wǎng)路爬蟲(chóng)項目Nutch
  Nutch是一個(gè)開(kāi)源Java實(shí)現的搜索引擎。它提供了我們運行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬蟲(chóng)。 Nutch的創(chuàng )始人是Doug Cutting,他同時(shí)也是Lucene、Hadoop和Avro開(kāi)源項目的創(chuàng )始人。 Nutch誕生于2002年8月,是Apache旗下的一個(gè)用Java實(shí)現的開(kāi)源搜索引擎項目,自Nutch1.2版本以后,Nutch早已從搜索引擎演...
  6:Java網(wǎng)路蜘蛛/網(wǎng)絡(luò )爬蟲(chóng)Spiderman(Star:1801)
  Spiderman - 又一個(gè)Java網(wǎng)路蜘蛛/爬蟲(chóng) Spiderman 是一個(gè)基于微內核+插件式構架的網(wǎng)路蜘蛛,它的目標是通過(guò)簡(jiǎn)單的方式能夠將復雜的目標網(wǎng)頁(yè)信息抓取并解析為自己所須要的業(yè)務(wù)數據。 最新提示:歡迎來(lái)體驗最新版本Spiderman2,
  7:輕量化的Java網(wǎng)路爬蟲(chóng) GECCO(Star:658)
  Gecco是哪些 Gecco是一款用java語(yǔ)言開(kāi)發(fā)的輕量化的易用的網(wǎng)路爬蟲(chóng)。Gecco整合了jsoup、httpclient、fastjson、spring、htmlunit、redission等優(yōu)秀框架,讓您只須要配置一些jquery風(fēng)格的選擇器能夠很快的寫(xiě)出一個(gè)爬蟲(chóng)。Gecco框架有優(yōu)秀的可擴展性,框架基于開(kāi)閉原則進(jìn)行設計,對更改關(guān)掉、對擴充開(kāi)放。同時(shí)Gecco基于非常開(kāi)...
  8:開(kāi)源爬蟲(chóng)框架WebPasser(Star:15)
  WebPasser是一款可配置的開(kāi)源爬蟲(chóng)框架,提供爬蟲(chóng)控制臺管理界面,通過(guò)配置解析各種網(wǎng)頁(yè)內容,無(wú)需寫(xiě)一句java代碼即可抽取所需數據。 1.包含強悍的頁(yè)面解析引擎,提供jsoup、xpath、正則表達式等處理鏈,通過(guò)簡(jiǎn)單配置即可抽取所需的指定內容。 2.提供爬蟲(chóng)控制管理界面,可實(shí)時(shí)監控抓取狀...
  9:一個(gè)敏捷強悍的Java爬蟲(chóng)框架SeimiCrawler(Star:635)
  SeimiCrawler是一個(gè)敏捷的,獨立布署的,支持分布式的Java爬蟲(chóng)框架,希望能在最大程度上減少菜鳥(niǎo)開(kāi)發(fā)一個(gè)可用性高且性能不差的爬蟲(chóng)系統的門(mén)檻,以及提高開(kāi)發(fā)爬蟲(chóng)系統的開(kāi)發(fā)效率。
  10:爬蟲(chóng)系統NEOCrawler(Star:258)
  NEOCrawler(中文名:???,是nodejs、redis、phantomjs實(shí)現的爬蟲(chóng)系統。代碼完全開(kāi)源,適合用于垂直領(lǐng)域的數據采集和爬蟲(chóng)二次開(kāi)發(fā)。 【主要特征】 使用nodejs實(shí)現,javascipt簡(jiǎn)單、高效、易學(xué)、為爬蟲(chóng)的開(kāi)發(fā)以及爬蟲(chóng)使用者的二次開(kāi)發(fā)節省不少時(shí)間;nodejs讓...
  推薦10款流行的java開(kāi)源的網(wǎng)絡(luò )爬蟲(chóng)

干貨丨推薦八款高效率的爬蟲(chóng)框架,你用過(guò)幾個(gè)?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 434 次瀏覽 ? 2020-05-24 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  
  Scrapy
  Scrapy是一個(gè)為了爬取網(wǎng)站數據,提取結構性數據而編撰的應用框架。 可以應用在包括數據挖掘,信息處理或儲存歷史數據等一系列的程序中。。用這個(gè)框架可以輕松爬出來(lái)如亞馬遜商品信息之類(lèi)的數據。
  
  PySpider
  pyspider 是一個(gè)用python實(shí)現的功能強悍的網(wǎng)路爬蟲(chóng)系統,能在瀏覽器界面上進(jìn)行腳本的編撰,功能的調度和爬取結果的實(shí)時(shí)查看,后端使用常用的數據庫進(jìn)行爬取結果的儲存,還能定時(shí)設置任務(wù)與任務(wù)優(yōu)先級等。
  開(kāi)源地址:
  Crawley
  Crawley可以高速爬取對應網(wǎng)站的內容爬蟲(chóng)軟件 推薦爬蟲(chóng)軟件 推薦,支持關(guān)系和非關(guān)系數據庫,數據可以導入為JSON、XML等。
  
  Portia
  Portia是一個(gè)開(kāi)源可視化爬蟲(chóng)工具,可使您在不需要任何編程知識的情況下爬取網(wǎng)站!簡(jiǎn)單地注釋您感興趣的頁(yè)面,Portia將創(chuàng )建一個(gè)蜘蛛來(lái)從類(lèi)似的頁(yè)面提取數據。
  Newspaper
  Newspaper可以拿來(lái)提取新聞、文章和內容剖析。使用多線(xiàn)程,支持10多種語(yǔ)言等。
  Beautiful Soup
  Beautiful Soup 是一個(gè)可以從HTML或XML文件中提取數據的Python庫.它還能通過(guò)你喜歡的轉換器實(shí)現慣用的文檔導航,查找,修改文檔的方法.Beautiful Soup會(huì )幫你節約數小時(shí)甚至數天的工作時(shí)間。
  Grab
  Grab是一個(gè)用于建立Web刮板的Python框架。借助Grab,您可以建立各類(lèi)復雜的網(wǎng)頁(yè)抓取工具,從簡(jiǎn)單的5行腳本到處理數百萬(wàn)個(gè)網(wǎng)頁(yè)的復雜異步網(wǎng)站抓取工具。Grab提供一個(gè)API用于執行網(wǎng)路懇求和處理接收到的內容,例如與HTML文檔的DOM樹(shù)進(jìn)行交互。
  Cola
  Cola是一個(gè)分布式的爬蟲(chóng)框架,對于用戶(hù)來(lái)說(shuō),只需編撰幾個(gè)特定的函數,而無(wú)需關(guān)注分布式運行的細節。任務(wù)會(huì )手動(dòng)分配到多臺機器上,整個(gè)過(guò)程對用戶(hù)是透明的。 查看全部

  
  
  Scrapy
  Scrapy是一個(gè)為了爬取網(wǎng)站數據,提取結構性數據而編撰的應用框架。 可以應用在包括數據挖掘,信息處理或儲存歷史數據等一系列的程序中。。用這個(gè)框架可以輕松爬出來(lái)如亞馬遜商品信息之類(lèi)的數據。
  
  PySpider
  pyspider 是一個(gè)用python實(shí)現的功能強悍的網(wǎng)路爬蟲(chóng)系統,能在瀏覽器界面上進(jìn)行腳本的編撰,功能的調度和爬取結果的實(shí)時(shí)查看,后端使用常用的數據庫進(jìn)行爬取結果的儲存,還能定時(shí)設置任務(wù)與任務(wù)優(yōu)先級等。
  開(kāi)源地址:
  Crawley
  Crawley可以高速爬取對應網(wǎng)站的內容爬蟲(chóng)軟件 推薦爬蟲(chóng)軟件 推薦,支持關(guān)系和非關(guān)系數據庫,數據可以導入為JSON、XML等。
  
  Portia
  Portia是一個(gè)開(kāi)源可視化爬蟲(chóng)工具,可使您在不需要任何編程知識的情況下爬取網(wǎng)站!簡(jiǎn)單地注釋您感興趣的頁(yè)面,Portia將創(chuàng )建一個(gè)蜘蛛來(lái)從類(lèi)似的頁(yè)面提取數據。
  Newspaper
  Newspaper可以拿來(lái)提取新聞、文章和內容剖析。使用多線(xiàn)程,支持10多種語(yǔ)言等。
  Beautiful Soup
  Beautiful Soup 是一個(gè)可以從HTML或XML文件中提取數據的Python庫.它還能通過(guò)你喜歡的轉換器實(shí)現慣用的文檔導航,查找,修改文檔的方法.Beautiful Soup會(huì )幫你節約數小時(shí)甚至數天的工作時(shí)間。
  Grab
  Grab是一個(gè)用于建立Web刮板的Python框架。借助Grab,您可以建立各類(lèi)復雜的網(wǎng)頁(yè)抓取工具,從簡(jiǎn)單的5行腳本到處理數百萬(wàn)個(gè)網(wǎng)頁(yè)的復雜異步網(wǎng)站抓取工具。Grab提供一個(gè)API用于執行網(wǎng)路懇求和處理接收到的內容,例如與HTML文檔的DOM樹(shù)進(jìn)行交互。
  Cola
  Cola是一個(gè)分布式的爬蟲(chóng)框架,對于用戶(hù)來(lái)說(shuō),只需編撰幾個(gè)特定的函數,而無(wú)需關(guān)注分布式運行的細節。任務(wù)會(huì )手動(dòng)分配到多臺機器上,整個(gè)過(guò)程對用戶(hù)是透明的。

網(wǎng)絡(luò )爬蟲(chóng) c++

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 346 次瀏覽 ? 2020-05-22 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  廣告
  提供包括云服務(wù)器,云數據庫在內的50+款云計算產(chǎn)品。打造一站式的云產(chǎn)品試用服務(wù),助力開(kāi)發(fā)者和企業(yè)零門(mén)檻上云。
  
  c++寫(xiě)的socket網(wǎng)絡(luò )爬蟲(chóng),代碼會(huì )在最后一次講解中提供給你們,同時(shí)我也會(huì )在寫(xiě)的同時(shí)不斷的對代碼進(jìn)行建立與更改我首先向你們講解怎樣將網(wǎng)頁(yè)中的內容,文本,圖片等下載到筆記本中。? 我會(huì )教你們怎樣將百度首頁(yè)上的這個(gè)百度標志圖片(http:)抓取下載到筆記本中。? 程序的部份代碼如下,講解在...
  
  互聯(lián)網(wǎng)初期,公司內部都設有好多的‘網(wǎng)站編輯’崗位,負責內容的整理和發(fā)布,縱然是高級動(dòng)物人類(lèi),也只有兩只手,無(wú)法通過(guò)復制、粘貼手工去維護,所以我們須要一種可以手動(dòng)的步入網(wǎng)頁(yè)提煉內容的程序技術(shù),這就是‘爬蟲(chóng)’,網(wǎng)絡(luò )爬蟲(chóng)工程師又被親切的稱(chēng)之為‘蟲(chóng)師’。網(wǎng)絡(luò )爬蟲(chóng)概述 網(wǎng)絡(luò )爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò )...
  
  這款框架作為java的爬蟲(chóng)框架基本上早已囊括了所有我們須要的功能,今天我們就來(lái)詳盡了解這款爬蟲(chóng)框架,webmagic我會(huì )分為兩篇文章介紹,今天主要寫(xiě)webmagic的入門(mén),明天會(huì )寫(xiě)一些爬取指定內容和一些特點(diǎn)介紹,下面請看正文; 先了解下哪些是網(wǎng)路爬蟲(chóng)簡(jiǎn)介: 網(wǎng)絡(luò )爬蟲(chóng)(web crawler) 也稱(chēng)作網(wǎng)路機器人,可以取代人們手動(dòng)地在...
  一、前言 在你心中哪些是網(wǎng)絡(luò )爬蟲(chóng)? 在網(wǎng)線(xiàn)里鉆來(lái)鉆去的蟲(chóng)子? 先看一下百度百科的解釋?zhuān)壕W(wǎng)絡(luò )爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò )機器人,在foaf社區中間,更時(shí)常的稱(chēng)為網(wǎng)頁(yè)追逐者),是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本。 另外一些不常使用的名子還有螞蟻、自動(dòng)索引、模擬程序或則蠕蟲(chóng)。 看完以后...
  
  rec 5.1 網(wǎng)絡(luò )爬蟲(chóng)概述:網(wǎng)絡(luò )爬蟲(chóng)(web spider)又稱(chēng)網(wǎng)路蜘蛛、網(wǎng)絡(luò )機器人,是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本。 網(wǎng)絡(luò )爬蟲(chóng)根據系統結構和實(shí)現技術(shù),大致可分為以下集中類(lèi)型:通用網(wǎng)路爬蟲(chóng):就是盡可能大的網(wǎng)路覆蓋率,如 搜索引擎(百度、雅虎和微軟等...)。 聚焦網(wǎng)路爬蟲(chóng):有目標性,選擇性地...
  
  b. 網(wǎng)絡(luò )爬蟲(chóng)的法律風(fēng)險服務(wù)器上的數據有產(chǎn)權歸屬,網(wǎng)絡(luò )爬蟲(chóng)獲取數據斂財將帶來(lái)法律風(fēng)險c.網(wǎng)絡(luò )爬蟲(chóng)的隱私泄漏網(wǎng)路爬蟲(chóng)可能具備突破簡(jiǎn)單控制訪(fǎng)問(wèn)的能力,獲取被保護的數據因而外泄個(gè)人隱私。 4.2 網(wǎng)絡(luò )爬蟲(chóng)限制a. 來(lái)源審查:判斷user-agent進(jìn)行限制檢測來(lái)訪(fǎng)http合同頭的user-agent域,只響應瀏覽器或友好爬蟲(chóng)的訪(fǎng)問(wèn)b. ...
  curl簡(jiǎn)介php的curl可以實(shí)現模擬http的各類(lèi)懇求,這也是php做網(wǎng)路爬蟲(chóng)的基礎,也多用于插口api的調用。 php 支持 daniel stenberg 創(chuàng )建的 libcurl 庫,能夠聯(lián)接通信各類(lèi)服務(wù)器、使用各類(lèi)合同。 libcurl 目前支持的合同有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同時(shí)支持 https 證書(shū)、http ...
  
  說(shuō)起網(wǎng)路爬蟲(chóng),大家想起的恐怕都是 python ,誠然爬蟲(chóng)早已是 python 的代名詞之一,相比 java 來(lái)說(shuō)就要遜色不少。 有不少人都不知道 java 可以做網(wǎng)路爬蟲(chóng),其實(shí) java 也能做網(wǎng)路爬蟲(chóng)并且能夠做的非常好,在開(kāi)源社區中有不少優(yōu)秀的 java 網(wǎng)絡(luò )爬蟲(chóng)框架,例如 webmagic 。 我的第一份即將工作就是使用 webmagic 編寫(xiě)數據...
  
  所以假如對爬蟲(chóng)有一定基礎,上手框架是一種好的選擇。 本書(shū)主要介紹的爬蟲(chóng)框架有pyspider和scrapy,本節我們來(lái)介紹一下 pyspider、scrapy 以及它們的一些擴充庫的安裝方法。 pyspider的安裝pyspider 是國人 binux 編寫(xiě)的強悍的網(wǎng)路爬蟲(chóng)框架,它帶有強悍的 webui、腳本編輯器、任務(wù)監控器、項目管理器以及結果處理器...
  介紹: 所謂網(wǎng)路爬蟲(chóng),就是一個(gè)在網(wǎng)上四處或定向抓取數據的程序,當然,這種說(shuō)法不夠專(zhuān)業(yè),更專(zhuān)業(yè)的描述就是,抓取特定網(wǎng)站網(wǎng)頁(yè)的html數據。 不過(guò)因為一個(gè)網(wǎng)站的網(wǎng)頁(yè)好多,而我們又不可能事先曉得所有網(wǎng)頁(yè)的url地址,所以,如何保證我們抓取到了網(wǎng)站的所有html頁(yè)面就是一個(gè)有待考究的問(wèn)題了。 一般的方式是,定義一個(gè)...
  政府部門(mén)可以爬蟲(chóng)新聞類(lèi)的網(wǎng)站,爬蟲(chóng)評論查看輿論; 還有的網(wǎng)站從別的網(wǎng)站爬蟲(chóng)下來(lái)在自己網(wǎng)站上展示。 等等 爬蟲(chóng)分類(lèi): 1. 全網(wǎng)爬蟲(chóng)(爬取所有的網(wǎng)站) 2. 垂直爬蟲(chóng)(爬取某類(lèi)網(wǎng)站) 網(wǎng)絡(luò )爬蟲(chóng)開(kāi)源框架 nutch; webmagic 爬蟲(chóng)技術(shù)剖析: 1. 數據下載 模擬瀏覽器訪(fǎng)問(wèn)網(wǎng)站就是request懇求response響應 可是使用httpclient...
  
  nodejs實(shí)現為什么忽然會(huì )選擇nodejs來(lái)實(shí)現,剛好近來(lái)在看node書(shū)籍,里面有提及node爬蟲(chóng),解析爬取的內容,書(shū)中提及借助cheerio模塊,遂果斷瀏覽其api文檔...前言上周借助java爬取的網(wǎng)路文章,一直無(wú)法借助java實(shí)現html轉化md,整整一周時(shí)間才得以解決。 雖然本人的博客文章數量不多,但是絕不齒于自動(dòng)轉換,畢竟...
  
  很多小型的網(wǎng)路搜索引擎系統都被稱(chēng)為基于 web數據采集的搜索引擎系統,比如 google、baidu。 由此可見(jiàn) web 網(wǎng)絡(luò )爬蟲(chóng)系統在搜索引擎中的重要性。 網(wǎng)頁(yè)中不僅包含供用戶(hù)閱讀的文字信息外,還包含一些超鏈接信息。 web網(wǎng)路爬蟲(chóng)系統正是通過(guò)網(wǎng)頁(yè)中的超聯(lián)接信息不斷獲得網(wǎng)路上的其它網(wǎng)頁(yè)。 正是由于這些采集過(guò)程象一個(gè)爬蟲(chóng)...
  
  requests-bs4 定向爬蟲(chóng):僅對輸入url進(jìn)行爬取網(wǎng)絡(luò )爬蟲(chóng) c++,不拓展爬取 程序的結構設計:步驟1:從網(wǎng)路上獲取學(xué)院排行網(wǎng)頁(yè)內容 gethtmltext() 步驟2:提取網(wǎng)頁(yè)內容中...列出工程中所有爬蟲(chóng) scrapy list shell 啟動(dòng)url調試命令行 scrapy shellscrapy框架的基本使用步驟1:建立一個(gè)scrapy爬蟲(chóng)工程#打開(kāi)命令提示符-win+r 輸入...
  twisted介紹twisted是用python實(shí)現的基于風(fēng)波驅動(dòng)的網(wǎng)路引擎框架,scrapy正是依賴(lài)于twisted,從而基于風(fēng)波循環(huán)機制實(shí)現爬蟲(chóng)的并發(fā)。 scrapy的pipeline文件和items文件這兩個(gè)文件有哪些作用先瞧瞧我們下篇的示例:# -*- coding: utf-8 -*-import scrapy class choutispider(scrapy.spider):爬去抽屜網(wǎng)的貼子信息 name ...
  總算有時(shí)間動(dòng)手用所學(xué)的python知識編撰一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)了,這個(gè)反例主要實(shí)現用python爬蟲(chóng)從百度圖庫中下載美眉的圖片,并保存在本地,閑話(huà)少說(shuō),直接貼出相應的代碼如下:----------#coding=utf-8#導出urllib和re模塊importurllibimportre#定義獲取百度圖庫url的類(lèi); classgethtml:def__init__(self,url):self.url...
  讀取頁(yè)面與下載頁(yè)面須要用到def gethtml(url): #定義gethtml()函數,用來(lái)獲取頁(yè)面源代碼page = urllib.urlopen(url)#urlopen()根據url來(lái)獲取頁(yè)面源代碼html = page.read()#從獲取的對象中讀取內容return htmldef getimage(html): #定義getimage()函數,用來(lái)獲取圖片地址并下載reg = rsrc=(.*?.jpg) width#定義匹配...
  《python3 網(wǎng)絡(luò )爬蟲(chóng)開(kāi)發(fā)實(shí)戰(崔慶才著(zhù))》redis 命令參考:http:redisdoc.com 、http:doc.redisfans.com----【16.3】key(鍵)操作 方法 作用 參數說(shuō)明 示例 示例說(shuō)明示例結果 exists(name) 判斷一個(gè)鍵是否存在 name:鍵名 redis.exists(‘name’) 是否存在 name 這個(gè)鍵 true delete(name) 刪除一個(gè)鍵name...
  data=kw)res =session.get(http:)print(demo + res.text)總結本篇介紹了爬蟲(chóng)中有關(guān)網(wǎng)路懇求的相關(guān)知識,通過(guò)閱讀,你將了解到urllib和...查看完整url地址print(response.url) with open(cunyu.html, w, encoding=utf-8 )as cy:cy.write(response.content.decode(utf-8))# 查看cookiesprint...
  
  本文的實(shí)戰內容有:網(wǎng)絡(luò )小說(shuō)下載(靜態(tài)網(wǎng)站) 優(yōu)美墻紙下載(動(dòng)態(tài)網(wǎng)站) 愛(ài)奇藝vip視頻下載二、網(wǎng)絡(luò )爬蟲(chóng)簡(jiǎn)介 網(wǎng)絡(luò )爬蟲(chóng),也叫網(wǎng)路蜘蛛(web spider)。 它依據網(wǎng)頁(yè)地址(url)爬取網(wǎng)頁(yè)內容,而網(wǎng)頁(yè)地址(url)就是我們在瀏覽器中輸入的網(wǎng)站鏈接。 比如:https:,它就是一個(gè)url。 在講解爬蟲(chóng)內容之前網(wǎng)絡(luò )爬蟲(chóng) c++,我們須要先... 查看全部

  
  廣告
  提供包括云服務(wù)器,云數據庫在內的50+款云計算產(chǎn)品。打造一站式的云產(chǎn)品試用服務(wù),助力開(kāi)發(fā)者和企業(yè)零門(mén)檻上云。
  
  c++寫(xiě)的socket網(wǎng)絡(luò )爬蟲(chóng),代碼會(huì )在最后一次講解中提供給你們,同時(shí)我也會(huì )在寫(xiě)的同時(shí)不斷的對代碼進(jìn)行建立與更改我首先向你們講解怎樣將網(wǎng)頁(yè)中的內容,文本,圖片等下載到筆記本中。? 我會(huì )教你們怎樣將百度首頁(yè)上的這個(gè)百度標志圖片(http:)抓取下載到筆記本中。? 程序的部份代碼如下,講解在...
  
  互聯(lián)網(wǎng)初期,公司內部都設有好多的‘網(wǎng)站編輯’崗位,負責內容的整理和發(fā)布,縱然是高級動(dòng)物人類(lèi),也只有兩只手,無(wú)法通過(guò)復制、粘貼手工去維護,所以我們須要一種可以手動(dòng)的步入網(wǎng)頁(yè)提煉內容的程序技術(shù),這就是‘爬蟲(chóng)’,網(wǎng)絡(luò )爬蟲(chóng)工程師又被親切的稱(chēng)之為‘蟲(chóng)師’。網(wǎng)絡(luò )爬蟲(chóng)概述 網(wǎng)絡(luò )爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò )...
  
  這款框架作為java的爬蟲(chóng)框架基本上早已囊括了所有我們須要的功能,今天我們就來(lái)詳盡了解這款爬蟲(chóng)框架,webmagic我會(huì )分為兩篇文章介紹,今天主要寫(xiě)webmagic的入門(mén),明天會(huì )寫(xiě)一些爬取指定內容和一些特點(diǎn)介紹,下面請看正文; 先了解下哪些是網(wǎng)路爬蟲(chóng)簡(jiǎn)介: 網(wǎng)絡(luò )爬蟲(chóng)(web crawler) 也稱(chēng)作網(wǎng)路機器人,可以取代人們手動(dòng)地在...
  一、前言 在你心中哪些是網(wǎng)絡(luò )爬蟲(chóng)? 在網(wǎng)線(xiàn)里鉆來(lái)鉆去的蟲(chóng)子? 先看一下百度百科的解釋?zhuān)壕W(wǎng)絡(luò )爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò )機器人,在foaf社區中間,更時(shí)常的稱(chēng)為網(wǎng)頁(yè)追逐者),是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本。 另外一些不常使用的名子還有螞蟻、自動(dòng)索引、模擬程序或則蠕蟲(chóng)。 看完以后...
  
  rec 5.1 網(wǎng)絡(luò )爬蟲(chóng)概述:網(wǎng)絡(luò )爬蟲(chóng)(web spider)又稱(chēng)網(wǎng)路蜘蛛、網(wǎng)絡(luò )機器人,是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本。 網(wǎng)絡(luò )爬蟲(chóng)根據系統結構和實(shí)現技術(shù),大致可分為以下集中類(lèi)型:通用網(wǎng)路爬蟲(chóng):就是盡可能大的網(wǎng)路覆蓋率,如 搜索引擎(百度、雅虎和微軟等...)。 聚焦網(wǎng)路爬蟲(chóng):有目標性,選擇性地...
  
  b. 網(wǎng)絡(luò )爬蟲(chóng)的法律風(fēng)險服務(wù)器上的數據有產(chǎn)權歸屬,網(wǎng)絡(luò )爬蟲(chóng)獲取數據斂財將帶來(lái)法律風(fēng)險c.網(wǎng)絡(luò )爬蟲(chóng)的隱私泄漏網(wǎng)路爬蟲(chóng)可能具備突破簡(jiǎn)單控制訪(fǎng)問(wèn)的能力,獲取被保護的數據因而外泄個(gè)人隱私。 4.2 網(wǎng)絡(luò )爬蟲(chóng)限制a. 來(lái)源審查:判斷user-agent進(jìn)行限制檢測來(lái)訪(fǎng)http合同頭的user-agent域,只響應瀏覽器或友好爬蟲(chóng)的訪(fǎng)問(wèn)b. ...
  curl簡(jiǎn)介php的curl可以實(shí)現模擬http的各類(lèi)懇求,這也是php做網(wǎng)路爬蟲(chóng)的基礎,也多用于插口api的調用。 php 支持 daniel stenberg 創(chuàng )建的 libcurl 庫,能夠聯(lián)接通信各類(lèi)服務(wù)器、使用各類(lèi)合同。 libcurl 目前支持的合同有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同時(shí)支持 https 證書(shū)、http ...
  
  說(shuō)起網(wǎng)路爬蟲(chóng),大家想起的恐怕都是 python ,誠然爬蟲(chóng)早已是 python 的代名詞之一,相比 java 來(lái)說(shuō)就要遜色不少。 有不少人都不知道 java 可以做網(wǎng)路爬蟲(chóng),其實(shí) java 也能做網(wǎng)路爬蟲(chóng)并且能夠做的非常好,在開(kāi)源社區中有不少優(yōu)秀的 java 網(wǎng)絡(luò )爬蟲(chóng)框架,例如 webmagic 。 我的第一份即將工作就是使用 webmagic 編寫(xiě)數據...
  
  所以假如對爬蟲(chóng)有一定基礎,上手框架是一種好的選擇。 本書(shū)主要介紹的爬蟲(chóng)框架有pyspider和scrapy,本節我們來(lái)介紹一下 pyspider、scrapy 以及它們的一些擴充庫的安裝方法。 pyspider的安裝pyspider 是國人 binux 編寫(xiě)的強悍的網(wǎng)路爬蟲(chóng)框架,它帶有強悍的 webui、腳本編輯器、任務(wù)監控器、項目管理器以及結果處理器...
  介紹: 所謂網(wǎng)路爬蟲(chóng),就是一個(gè)在網(wǎng)上四處或定向抓取數據的程序,當然,這種說(shuō)法不夠專(zhuān)業(yè),更專(zhuān)業(yè)的描述就是,抓取特定網(wǎng)站網(wǎng)頁(yè)的html數據。 不過(guò)因為一個(gè)網(wǎng)站的網(wǎng)頁(yè)好多,而我們又不可能事先曉得所有網(wǎng)頁(yè)的url地址,所以,如何保證我們抓取到了網(wǎng)站的所有html頁(yè)面就是一個(gè)有待考究的問(wèn)題了。 一般的方式是,定義一個(gè)...
  政府部門(mén)可以爬蟲(chóng)新聞類(lèi)的網(wǎng)站,爬蟲(chóng)評論查看輿論; 還有的網(wǎng)站從別的網(wǎng)站爬蟲(chóng)下來(lái)在自己網(wǎng)站上展示。 等等 爬蟲(chóng)分類(lèi): 1. 全網(wǎng)爬蟲(chóng)(爬取所有的網(wǎng)站) 2. 垂直爬蟲(chóng)(爬取某類(lèi)網(wǎng)站) 網(wǎng)絡(luò )爬蟲(chóng)開(kāi)源框架 nutch; webmagic 爬蟲(chóng)技術(shù)剖析: 1. 數據下載 模擬瀏覽器訪(fǎng)問(wèn)網(wǎng)站就是request懇求response響應 可是使用httpclient...
  
  nodejs實(shí)現為什么忽然會(huì )選擇nodejs來(lái)實(shí)現,剛好近來(lái)在看node書(shū)籍,里面有提及node爬蟲(chóng),解析爬取的內容,書(shū)中提及借助cheerio模塊,遂果斷瀏覽其api文檔...前言上周借助java爬取的網(wǎng)路文章,一直無(wú)法借助java實(shí)現html轉化md,整整一周時(shí)間才得以解決。 雖然本人的博客文章數量不多,但是絕不齒于自動(dòng)轉換,畢竟...
  
  很多小型的網(wǎng)路搜索引擎系統都被稱(chēng)為基于 web數據采集的搜索引擎系統,比如 google、baidu。 由此可見(jiàn) web 網(wǎng)絡(luò )爬蟲(chóng)系統在搜索引擎中的重要性。 網(wǎng)頁(yè)中不僅包含供用戶(hù)閱讀的文字信息外,還包含一些超鏈接信息。 web網(wǎng)路爬蟲(chóng)系統正是通過(guò)網(wǎng)頁(yè)中的超聯(lián)接信息不斷獲得網(wǎng)路上的其它網(wǎng)頁(yè)。 正是由于這些采集過(guò)程象一個(gè)爬蟲(chóng)...
  
  requests-bs4 定向爬蟲(chóng):僅對輸入url進(jìn)行爬取網(wǎng)絡(luò )爬蟲(chóng) c++,不拓展爬取 程序的結構設計:步驟1:從網(wǎng)路上獲取學(xué)院排行網(wǎng)頁(yè)內容 gethtmltext() 步驟2:提取網(wǎng)頁(yè)內容中...列出工程中所有爬蟲(chóng) scrapy list shell 啟動(dòng)url調試命令行 scrapy shellscrapy框架的基本使用步驟1:建立一個(gè)scrapy爬蟲(chóng)工程#打開(kāi)命令提示符-win+r 輸入...
  twisted介紹twisted是用python實(shí)現的基于風(fēng)波驅動(dòng)的網(wǎng)路引擎框架,scrapy正是依賴(lài)于twisted,從而基于風(fēng)波循環(huán)機制實(shí)現爬蟲(chóng)的并發(fā)。 scrapy的pipeline文件和items文件這兩個(gè)文件有哪些作用先瞧瞧我們下篇的示例:# -*- coding: utf-8 -*-import scrapy class choutispider(scrapy.spider):爬去抽屜網(wǎng)的貼子信息 name ...
  總算有時(shí)間動(dòng)手用所學(xué)的python知識編撰一個(gè)簡(jiǎn)單的網(wǎng)路爬蟲(chóng)了,這個(gè)反例主要實(shí)現用python爬蟲(chóng)從百度圖庫中下載美眉的圖片,并保存在本地,閑話(huà)少說(shuō),直接貼出相應的代碼如下:----------#coding=utf-8#導出urllib和re模塊importurllibimportre#定義獲取百度圖庫url的類(lèi); classgethtml:def__init__(self,url):self.url...
  讀取頁(yè)面與下載頁(yè)面須要用到def gethtml(url): #定義gethtml()函數,用來(lái)獲取頁(yè)面源代碼page = urllib.urlopen(url)#urlopen()根據url來(lái)獲取頁(yè)面源代碼html = page.read()#從獲取的對象中讀取內容return htmldef getimage(html): #定義getimage()函數,用來(lái)獲取圖片地址并下載reg = rsrc=(.*?.jpg) width#定義匹配...
  《python3 網(wǎng)絡(luò )爬蟲(chóng)開(kāi)發(fā)實(shí)戰(崔慶才著(zhù))》redis 命令參考:http:redisdoc.com 、http:doc.redisfans.com----【16.3】key(鍵)操作 方法 作用 參數說(shuō)明 示例 示例說(shuō)明示例結果 exists(name) 判斷一個(gè)鍵是否存在 name:鍵名 redis.exists(‘name’) 是否存在 name 這個(gè)鍵 true delete(name) 刪除一個(gè)鍵name...
  data=kw)res =session.get(http:)print(demo + res.text)總結本篇介紹了爬蟲(chóng)中有關(guān)網(wǎng)路懇求的相關(guān)知識,通過(guò)閱讀,你將了解到urllib和...查看完整url地址print(response.url) with open(cunyu.html, w, encoding=utf-8 )as cy:cy.write(response.content.decode(utf-8))# 查看cookiesprint...
  
  本文的實(shí)戰內容有:網(wǎng)絡(luò )小說(shuō)下載(靜態(tài)網(wǎng)站) 優(yōu)美墻紙下載(動(dòng)態(tài)網(wǎng)站) 愛(ài)奇藝vip視頻下載二、網(wǎng)絡(luò )爬蟲(chóng)簡(jiǎn)介 網(wǎng)絡(luò )爬蟲(chóng),也叫網(wǎng)路蜘蛛(web spider)。 它依據網(wǎng)頁(yè)地址(url)爬取網(wǎng)頁(yè)內容,而網(wǎng)頁(yè)地址(url)就是我們在瀏覽器中輸入的網(wǎng)站鏈接。 比如:https:,它就是一個(gè)url。 在講解爬蟲(chóng)內容之前網(wǎng)絡(luò )爬蟲(chóng) c++,我們須要先...

Go語(yǔ)言網(wǎng)絡(luò )爬蟲(chóng)概述

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 387 次瀏覽 ? 2020-05-13 08:03 ? 來(lái)自相關(guān)話(huà)題

  
  簡(jiǎn)單來(lái)說(shuō),網(wǎng)絡(luò )爬蟲(chóng)是互聯(lián)網(wǎng)終端用戶(hù)的模仿者。它模仿的主要對象有兩個(gè),一個(gè)是坐在計算器前使用網(wǎng)絡(luò )瀏覽器訪(fǎng)問(wèn)網(wǎng)路內容的人類(lèi)用戶(hù),另一個(gè)就是網(wǎng)絡(luò )瀏覽器。
  網(wǎng)絡(luò )爬蟲(chóng)會(huì )模仿人類(lèi)用戶(hù)輸入某個(gè)網(wǎng)站的網(wǎng)路地址,并企圖訪(fǎng)問(wèn)該網(wǎng)站上的內容,還會(huì )模仿網(wǎng)路瀏覽器按照給定的網(wǎng)路地址去下載相應的內容。這里所說(shuō)的內容可以是 HTML 頁(yè)面、圖片文件、音視頻數據流,等等。
  在下載到對應的內容以后,網(wǎng)絡(luò )爬蟲(chóng)會(huì )按照預設的規則對它進(jìn)行剖析和篩選。這些篩選岀的部份會(huì )馬上得到特定的處理。與此同時(shí),網(wǎng)絡(luò )爬蟲(chóng)都會(huì )象人類(lèi)用戶(hù)點(diǎn)擊網(wǎng)頁(yè)中某個(gè)他感興趣的鏈接那樣,繼續訪(fǎng)問(wèn)和下載相關(guān)聯(lián)的其他內容,然后再重復上述步驟,直到滿(mǎn)足停止的條件。
  如上所述,網(wǎng)絡(luò )爬蟲(chóng)應當按照使用者的意愿手動(dòng)下載、分析、篩選、統計以及儲存指定的網(wǎng)路內容。注意,這里的關(guān)鍵詞是“自動(dòng)”和“根據意愿”?!白詣?dòng)”的涵義是,網(wǎng)絡(luò )爬蟲(chóng)在啟動(dòng)后自己完成整個(gè)爬取過(guò)程而無(wú)需人工干預,并且能夠夠在過(guò)程結束以后手動(dòng)停止。而“根據意愿”則是說(shuō),網(wǎng)絡(luò )爬蟲(chóng)最大限度地準許使用者對其爬取過(guò)程進(jìn)行訂制。
  乍一看,要做到手動(dòng)爬取其實(shí)并不困難。我們只需使網(wǎng)路爬蟲(chóng)依據相關(guān)的網(wǎng)路地址不斷地下載對應的內容即可。但是,窺探其中就可以發(fā)覺(jué),這里有很多細節須要我們進(jìn)行非常處理,如下所示。
  在這種細節當中,有的是比較容易處理的,而有的則須要額外的解決方案。例如,我們都曉得,基于 HTML 的網(wǎng)頁(yè)中可以包含代表按鍵的 button 標簽。
  讓網(wǎng)絡(luò )瀏覽器在終端用戶(hù)點(diǎn)擊按鍵的時(shí)侯加載并顯示另一個(gè)網(wǎng)頁(yè)可以有很多種方式,其中,非常常用的一種方式就是為該標簽添加 onclick 屬性并把一些 JavaScript 語(yǔ)言的代碼作為它的值。
  雖然這個(gè)方式這么常用,但是我們要想使網(wǎng)絡(luò )爬蟲(chóng)可以從中提取出有效的網(wǎng)路地址卻是比較 困難的,因為這涉及對JavaScript程序的理解。JavaScript代碼的編撰方式繁雜,要想使 網(wǎng)絡(luò )爬蟲(chóng)完全理解它們,恐怕就須要用到某個(gè)JavaScript程序解析器的 Go語(yǔ)言實(shí)現了。
  另一方面,由于互聯(lián)網(wǎng)對人們生活和工作的全面滲透,我們可以通過(guò)各類(lèi)途徑找到各式各樣的網(wǎng)路爬蟲(chóng)實(shí)現,它們幾乎都有著(zhù)復雜而又奇特的邏輯。這些復雜的邏輯主要針對如下幾個(gè)方面。
  這些邏輯絕大多數都與網(wǎng)路爬蟲(chóng)使用者當時(shí)的意愿有關(guān)。換句話(huà)說(shuō),它們都與具體的使用目的有著(zhù)緊密的聯(lián)系。也許它們并不應當是網(wǎng)路爬蟲(chóng)的核心功能,而應當作為擴充功能或可訂制的功能存在。
  因此,我想我們更應當編撰一個(gè)容易被訂制和擴充的網(wǎng)路爬蟲(chóng)框架,而非一個(gè)滿(mǎn)足特定爬取目的的網(wǎng)路爬蟲(chóng),這樣就能讓這個(gè)程序成為一個(gè)可適用于不同應用場(chǎng)景的通用工具。
  既然這么,接下來(lái)我們就要搞清楚該程序應當或可以做什么事,這也就能使我們進(jìn)一步明晰它的功能、用途和意義。
  功能需求和剖析概括來(lái)講,網(wǎng)絡(luò )爬蟲(chóng)框架會(huì )反復執行如下步驟直到觸遇到停止條件。
  1) “下載器”下載與給定網(wǎng)路地址相對應的內容。其中,在下載“請求”的組裝方面,網(wǎng)絡(luò )爬蟲(chóng)框架為使用者盡量預留出訂制插口。使用者可以使用這種插口自定義“請求”的組裝方式。
  2) “分析器”分析下載到的內容,并從中篩選出可用的部份(以下稱(chēng)為“條目”)和須要訪(fǎng)問(wèn)的新網(wǎng)路地址。其中,在用于剖析和篩選內容的規則和策略方面,應該由網(wǎng)路爬蟲(chóng)框架提供靈活的訂制插口。
  換句話(huà)說(shuō),由于只有使用者自己才曉得她們真正想要的是哪些,所以應當準許她們對這種規則和策略進(jìn)行深入的訂制。網(wǎng)絡(luò )爬蟲(chóng)框架僅須要規定好訂制的方法即可。
  3) “分析器”把篩選出的“條目”發(fā)送給“條目處理管線(xiàn)”。同時(shí),它會(huì )把發(fā)覺(jué)的新網(wǎng)路地址和其他一些信息組裝成新的下載“請求”,然后把這種懇求發(fā)送給“下載器”。在此步驟中,我們會(huì )過(guò)濾掉一些不符合要求的網(wǎng)路地址,比如忽視超出有效邊界的網(wǎng)路地址。
  你可能早已注意到,在這幾個(gè)步驟中,我使用冒號突出展示了幾個(gè)名詞,即下載器、請求、分析器、條目和條目處理管線(xiàn),其中,請求和條目都代表了某類(lèi)數據,而其他 3 個(gè)名詞則代表了處理數據的子程序(可稱(chēng)為處理模塊或組件)。
  它們與上面早已提及過(guò)的網(wǎng)路內容(或稱(chēng)對懇求的響應)共同描述了數據在網(wǎng)路爬蟲(chóng)程序中的流轉形式。下圖演示了起始于首次懇求的數據流程圖。
  
  圖:起始于首次懇求的數據流程圖
  從上圖中,我們可以清晰地看見(jiàn)每一個(gè)處理模塊才能接受的輸入和可以形成的輸出。實(shí)際上,我們即將編撰的網(wǎng)路爬蟲(chóng)框架都會(huì )借此為根據產(chǎn)生幾個(gè)相對獨立的子程序。
  當然,為了維護它們的運行和協(xié)作的有效性,框架中都會(huì )存在其他一些子程序。關(guān)于它們,我會(huì )在旁邊相繼給以說(shuō)明。
  這里,我再度指出一下網(wǎng)路爬蟲(chóng)框架與網(wǎng)路爬蟲(chóng)實(shí)現的區別。作為一個(gè)框架,該程序在每位處理模塊中給與使用者盡量多的訂制技巧,而不去涉及各個(gè)處理步驟的實(shí)現細節。
  另外,框架更多地考慮使用者自定義的處理步驟在執行期間可能發(fā)生的各類(lèi)情況和問(wèn)題,并注意對這種問(wèn)題的處理方法,這樣就能在便于擴充的同時(shí)保證框架的穩定性。這方面的思索和策略會(huì )彰顯在該網(wǎng)路爬蟲(chóng)框架的各階段設計和編碼實(shí)現之中。
  下面我就依照上述剖析對這一程序進(jìn)行總體設計。
  總體設計通過(guò)上圖可知,網(wǎng)絡(luò )爬蟲(chóng)框架的處理模塊有 3 個(gè):下載器、分析器和條目處理管線(xiàn)。再加上調度和協(xié)調那些處理模塊運行的控制模塊,我們就可以明確該框架的模塊界定了。我把這兒提及的控制模塊稱(chēng)為調度器。下面是這 4 個(gè)模塊各自承當的職責。
  1) 下載器接受懇求類(lèi)型的數據,并根據該懇求獲得 HTTP 請求;將 HTTP 請求發(fā)送至與指定的網(wǎng)路地址對應的遠程服務(wù)器;在 HTTP 請求發(fā)送完畢以后,立即等待相應的 HTTP 響應的到來(lái);在收到 HTTP 響應以后,將其封裝成響應并作為輸出返回給下載器的調用方。
  其中,HTTP 客戶(hù)端程序可以由網(wǎng)路爬蟲(chóng)框架的使用方自行定義。另外,若在該子流程執行期間發(fā)生了錯誤,應該立刻以適當的方法告知使用方。對于其他模塊來(lái)講,也是這樣。
  2) 分析器接受響應類(lèi)型的數據,并根據該響應獲得 HTTP 響應;對該 HTTP 響應的內容進(jìn)行檢測,并按照給定的規則進(jìn)行剖析、篩選以及生成新的懇求或條目;將生成的懇求或條目作為輸出返回給分析器的調用方。
  在分析器的職責中,我可以想到的才能留給網(wǎng)路爬蟲(chóng)框架的使用方自定義的部份并不少。例如,對 HTTP 響應的前期檢測、對內容的篩選,以及生成懇求和條目的方法,等等。不過(guò),我在前面會(huì )對那些可以自定義的部份進(jìn)行一些抉擇。
  3) 條目處理管線(xiàn)接受條目類(lèi)型的數據,并對其執行若干步驟的處理;條目處理管線(xiàn)中可以產(chǎn)出最終的數據;這個(gè)最終的數據可以在其中的某個(gè)處理步驟中被持久化(不論是本地儲存還是發(fā)送給遠程的儲存服務(wù)器)以備后用。
  我們可以把這種處理步驟的具體實(shí)現留給網(wǎng)路爬蟲(chóng)框架的使用方自行定義。這樣,網(wǎng)絡(luò )爬蟲(chóng)框架就可以真正地與條目處理的細節脫離開(kāi)來(lái)。網(wǎng)絡(luò )爬蟲(chóng)框架絲毫不關(guān)心那些條目如何被處理和持久化,它僅僅負責控制整體的處理流程。我把負責單個(gè)處理步驟的程序稱(chēng)為條目處理器。
  條目處理器接受條目類(lèi)型的數據,并把處理完成的條目返回給條目處理管線(xiàn)。條目處理管線(xiàn)會(huì )緊接著(zhù)把該條目傳遞給下一個(gè)條目處理器,直至給定的條目處理器列表中的每位條目處理器都處理過(guò)該條目為止。
  4) 調度器調度器在啟動(dòng)時(shí)僅接受首次懇求,并且不會(huì )形成任何輸出。調度器的主要職責是調度各個(gè)處理模塊的運行。其中包括維護各個(gè)處理模塊的實(shí)例、在不同的處理模塊實(shí)例之間傳遞數據(包括懇求、響應和條目),以及監控所有那些被調度者的狀態(tài),等等。
  有了調度器的維護,各個(gè)處理模塊得以保持其職責的簡(jiǎn)約和專(zhuān)情。由于調度器是網(wǎng)路爬蟲(chóng)框架中最重要的一個(gè)模塊,所以還須要再編撰出一些工具來(lái)支撐起它的功能。
  在弄清楚網(wǎng)路爬蟲(chóng)框架中各個(gè)模塊的職責以后網(wǎng)絡(luò )爬蟲(chóng) 語(yǔ)言,你曉得它是以調度器為核心的。此外,為了并發(fā)執行的須要,除調度器之外的其他模塊都可以是多實(shí)例的,它們由調度器持有、維護和調用。反過(guò)來(lái)講,這些處理模塊的實(shí)例會(huì )從調度器那兒接受輸入,并在進(jìn)行相應的處理后將輸出返回給調度器。
  最后,與另外兩個(gè)處理模塊相比,條目處理管線(xiàn)是比較特殊的。顧名思義,它是以流式處理為基礎的,其設計靈感來(lái)自于我之前講過(guò)的 Linux 系統中的管線(xiàn)。
  我們可以不斷地向該管線(xiàn)發(fā)送條目,而該管線(xiàn)則會(huì )使其中的若干個(gè)條目處理器依次處理每一個(gè)條目。我們可以挺輕易地使用一些同步方式來(lái)保證條目處理管線(xiàn)的并發(fā)安全性,因此雖然調度器只持有該管線(xiàn)的一個(gè)實(shí)例,也不會(huì )有任何問(wèn)題。
  下圖展示了調度器與各個(gè)處理模塊之間的關(guān)系,圖中加入了一個(gè)新的元素——工具箱網(wǎng)絡(luò )爬蟲(chóng) 語(yǔ)言,之前所說(shuō)的用于支撐調度器功能的這些工具就是工具箱的一部分。顧名思義,工具箱不是一個(gè)完整的模塊,而是一些工具的集合,這些工具是調度器與所有處理模塊之間的橋梁。
  
  圖:調度器與各處理模塊的關(guān)系
  至此,大家對網(wǎng)路爬蟲(chóng)框架的設計有了一個(gè)宏觀(guān)上的認識。不過(guò),我還未提到在這個(gè)總體設計之下包含的大量設計方法和決策。這些方法和決策不但與一些通用的程序設計原則有關(guān),還涉及好多依賴(lài)于 Go語(yǔ)言的編程風(fēng)格和形式技巧。
  這也從側面說(shuō)明,由于幾乎所有語(yǔ)言都有著(zhù)十分鮮明的特征和比較擅長(cháng)的領(lǐng)域,所以在設計一個(gè)須要由特定語(yǔ)言實(shí)現的軟件或程序時(shí),多多少少會(huì )考慮到這門(mén)語(yǔ)言自身的特點(diǎn)。也就是說(shuō),軟件設計不是與具體的語(yǔ)言毫不相關(guān)的。反過(guò)來(lái)講,總會(huì )有一門(mén)或幾門(mén)語(yǔ)言十分適宜實(shí)現某一類(lèi)軟件或程序。 查看全部

  
  簡(jiǎn)單來(lái)說(shuō),網(wǎng)絡(luò )爬蟲(chóng)是互聯(lián)網(wǎng)終端用戶(hù)的模仿者。它模仿的主要對象有兩個(gè),一個(gè)是坐在計算器前使用網(wǎng)絡(luò )瀏覽器訪(fǎng)問(wèn)網(wǎng)路內容的人類(lèi)用戶(hù),另一個(gè)就是網(wǎng)絡(luò )瀏覽器。
  網(wǎng)絡(luò )爬蟲(chóng)會(huì )模仿人類(lèi)用戶(hù)輸入某個(gè)網(wǎng)站的網(wǎng)路地址,并企圖訪(fǎng)問(wèn)該網(wǎng)站上的內容,還會(huì )模仿網(wǎng)路瀏覽器按照給定的網(wǎng)路地址去下載相應的內容。這里所說(shuō)的內容可以是 HTML 頁(yè)面、圖片文件、音視頻數據流,等等。
  在下載到對應的內容以后,網(wǎng)絡(luò )爬蟲(chóng)會(huì )按照預設的規則對它進(jìn)行剖析和篩選。這些篩選岀的部份會(huì )馬上得到特定的處理。與此同時(shí),網(wǎng)絡(luò )爬蟲(chóng)都會(huì )象人類(lèi)用戶(hù)點(diǎn)擊網(wǎng)頁(yè)中某個(gè)他感興趣的鏈接那樣,繼續訪(fǎng)問(wèn)和下載相關(guān)聯(lián)的其他內容,然后再重復上述步驟,直到滿(mǎn)足停止的條件。
  如上所述,網(wǎng)絡(luò )爬蟲(chóng)應當按照使用者的意愿手動(dòng)下載、分析、篩選、統計以及儲存指定的網(wǎng)路內容。注意,這里的關(guān)鍵詞是“自動(dòng)”和“根據意愿”?!白詣?dòng)”的涵義是,網(wǎng)絡(luò )爬蟲(chóng)在啟動(dòng)后自己完成整個(gè)爬取過(guò)程而無(wú)需人工干預,并且能夠夠在過(guò)程結束以后手動(dòng)停止。而“根據意愿”則是說(shuō),網(wǎng)絡(luò )爬蟲(chóng)最大限度地準許使用者對其爬取過(guò)程進(jìn)行訂制。
  乍一看,要做到手動(dòng)爬取其實(shí)并不困難。我們只需使網(wǎng)路爬蟲(chóng)依據相關(guān)的網(wǎng)路地址不斷地下載對應的內容即可。但是,窺探其中就可以發(fā)覺(jué),這里有很多細節須要我們進(jìn)行非常處理,如下所示。
  在這種細節當中,有的是比較容易處理的,而有的則須要額外的解決方案。例如,我們都曉得,基于 HTML 的網(wǎng)頁(yè)中可以包含代表按鍵的 button 標簽。
  讓網(wǎng)絡(luò )瀏覽器在終端用戶(hù)點(diǎn)擊按鍵的時(shí)侯加載并顯示另一個(gè)網(wǎng)頁(yè)可以有很多種方式,其中,非常常用的一種方式就是為該標簽添加 onclick 屬性并把一些 JavaScript 語(yǔ)言的代碼作為它的值。
  雖然這個(gè)方式這么常用,但是我們要想使網(wǎng)絡(luò )爬蟲(chóng)可以從中提取出有效的網(wǎng)路地址卻是比較 困難的,因為這涉及對JavaScript程序的理解。JavaScript代碼的編撰方式繁雜,要想使 網(wǎng)絡(luò )爬蟲(chóng)完全理解它們,恐怕就須要用到某個(gè)JavaScript程序解析器的 Go語(yǔ)言實(shí)現了。
  另一方面,由于互聯(lián)網(wǎng)對人們生活和工作的全面滲透,我們可以通過(guò)各類(lèi)途徑找到各式各樣的網(wǎng)路爬蟲(chóng)實(shí)現,它們幾乎都有著(zhù)復雜而又奇特的邏輯。這些復雜的邏輯主要針對如下幾個(gè)方面。
  這些邏輯絕大多數都與網(wǎng)路爬蟲(chóng)使用者當時(shí)的意愿有關(guān)。換句話(huà)說(shuō),它們都與具體的使用目的有著(zhù)緊密的聯(lián)系。也許它們并不應當是網(wǎng)路爬蟲(chóng)的核心功能,而應當作為擴充功能或可訂制的功能存在。
  因此,我想我們更應當編撰一個(gè)容易被訂制和擴充的網(wǎng)路爬蟲(chóng)框架,而非一個(gè)滿(mǎn)足特定爬取目的的網(wǎng)路爬蟲(chóng),這樣就能讓這個(gè)程序成為一個(gè)可適用于不同應用場(chǎng)景的通用工具。
  既然這么,接下來(lái)我們就要搞清楚該程序應當或可以做什么事,這也就能使我們進(jìn)一步明晰它的功能、用途和意義。
  功能需求和剖析概括來(lái)講,網(wǎng)絡(luò )爬蟲(chóng)框架會(huì )反復執行如下步驟直到觸遇到停止條件。
  1) “下載器”下載與給定網(wǎng)路地址相對應的內容。其中,在下載“請求”的組裝方面,網(wǎng)絡(luò )爬蟲(chóng)框架為使用者盡量預留出訂制插口。使用者可以使用這種插口自定義“請求”的組裝方式。
  2) “分析器”分析下載到的內容,并從中篩選出可用的部份(以下稱(chēng)為“條目”)和須要訪(fǎng)問(wèn)的新網(wǎng)路地址。其中,在用于剖析和篩選內容的規則和策略方面,應該由網(wǎng)路爬蟲(chóng)框架提供靈活的訂制插口。
  換句話(huà)說(shuō),由于只有使用者自己才曉得她們真正想要的是哪些,所以應當準許她們對這種規則和策略進(jìn)行深入的訂制。網(wǎng)絡(luò )爬蟲(chóng)框架僅須要規定好訂制的方法即可。
  3) “分析器”把篩選出的“條目”發(fā)送給“條目處理管線(xiàn)”。同時(shí),它會(huì )把發(fā)覺(jué)的新網(wǎng)路地址和其他一些信息組裝成新的下載“請求”,然后把這種懇求發(fā)送給“下載器”。在此步驟中,我們會(huì )過(guò)濾掉一些不符合要求的網(wǎng)路地址,比如忽視超出有效邊界的網(wǎng)路地址。
  你可能早已注意到,在這幾個(gè)步驟中,我使用冒號突出展示了幾個(gè)名詞,即下載器、請求、分析器、條目和條目處理管線(xiàn),其中,請求和條目都代表了某類(lèi)數據,而其他 3 個(gè)名詞則代表了處理數據的子程序(可稱(chēng)為處理模塊或組件)。
  它們與上面早已提及過(guò)的網(wǎng)路內容(或稱(chēng)對懇求的響應)共同描述了數據在網(wǎng)路爬蟲(chóng)程序中的流轉形式。下圖演示了起始于首次懇求的數據流程圖。
  
  圖:起始于首次懇求的數據流程圖
  從上圖中,我們可以清晰地看見(jiàn)每一個(gè)處理模塊才能接受的輸入和可以形成的輸出。實(shí)際上,我們即將編撰的網(wǎng)路爬蟲(chóng)框架都會(huì )借此為根據產(chǎn)生幾個(gè)相對獨立的子程序。
  當然,為了維護它們的運行和協(xié)作的有效性,框架中都會(huì )存在其他一些子程序。關(guān)于它們,我會(huì )在旁邊相繼給以說(shuō)明。
  這里,我再度指出一下網(wǎng)路爬蟲(chóng)框架與網(wǎng)路爬蟲(chóng)實(shí)現的區別。作為一個(gè)框架,該程序在每位處理模塊中給與使用者盡量多的訂制技巧,而不去涉及各個(gè)處理步驟的實(shí)現細節。
  另外,框架更多地考慮使用者自定義的處理步驟在執行期間可能發(fā)生的各類(lèi)情況和問(wèn)題,并注意對這種問(wèn)題的處理方法,這樣就能在便于擴充的同時(shí)保證框架的穩定性。這方面的思索和策略會(huì )彰顯在該網(wǎng)路爬蟲(chóng)框架的各階段設計和編碼實(shí)現之中。
  下面我就依照上述剖析對這一程序進(jìn)行總體設計。
  總體設計通過(guò)上圖可知,網(wǎng)絡(luò )爬蟲(chóng)框架的處理模塊有 3 個(gè):下載器、分析器和條目處理管線(xiàn)。再加上調度和協(xié)調那些處理模塊運行的控制模塊,我們就可以明確該框架的模塊界定了。我把這兒提及的控制模塊稱(chēng)為調度器。下面是這 4 個(gè)模塊各自承當的職責。
  1) 下載器接受懇求類(lèi)型的數據,并根據該懇求獲得 HTTP 請求;將 HTTP 請求發(fā)送至與指定的網(wǎng)路地址對應的遠程服務(wù)器;在 HTTP 請求發(fā)送完畢以后,立即等待相應的 HTTP 響應的到來(lái);在收到 HTTP 響應以后,將其封裝成響應并作為輸出返回給下載器的調用方。
  其中,HTTP 客戶(hù)端程序可以由網(wǎng)路爬蟲(chóng)框架的使用方自行定義。另外,若在該子流程執行期間發(fā)生了錯誤,應該立刻以適當的方法告知使用方。對于其他模塊來(lái)講,也是這樣。
  2) 分析器接受響應類(lèi)型的數據,并根據該響應獲得 HTTP 響應;對該 HTTP 響應的內容進(jìn)行檢測,并按照給定的規則進(jìn)行剖析、篩選以及生成新的懇求或條目;將生成的懇求或條目作為輸出返回給分析器的調用方。
  在分析器的職責中,我可以想到的才能留給網(wǎng)路爬蟲(chóng)框架的使用方自定義的部份并不少。例如,對 HTTP 響應的前期檢測、對內容的篩選,以及生成懇求和條目的方法,等等。不過(guò),我在前面會(huì )對那些可以自定義的部份進(jìn)行一些抉擇。
  3) 條目處理管線(xiàn)接受條目類(lèi)型的數據,并對其執行若干步驟的處理;條目處理管線(xiàn)中可以產(chǎn)出最終的數據;這個(gè)最終的數據可以在其中的某個(gè)處理步驟中被持久化(不論是本地儲存還是發(fā)送給遠程的儲存服務(wù)器)以備后用。
  我們可以把這種處理步驟的具體實(shí)現留給網(wǎng)路爬蟲(chóng)框架的使用方自行定義。這樣,網(wǎng)絡(luò )爬蟲(chóng)框架就可以真正地與條目處理的細節脫離開(kāi)來(lái)。網(wǎng)絡(luò )爬蟲(chóng)框架絲毫不關(guān)心那些條目如何被處理和持久化,它僅僅負責控制整體的處理流程。我把負責單個(gè)處理步驟的程序稱(chēng)為條目處理器。
  條目處理器接受條目類(lèi)型的數據,并把處理完成的條目返回給條目處理管線(xiàn)。條目處理管線(xiàn)會(huì )緊接著(zhù)把該條目傳遞給下一個(gè)條目處理器,直至給定的條目處理器列表中的每位條目處理器都處理過(guò)該條目為止。
  4) 調度器調度器在啟動(dòng)時(shí)僅接受首次懇求,并且不會(huì )形成任何輸出。調度器的主要職責是調度各個(gè)處理模塊的運行。其中包括維護各個(gè)處理模塊的實(shí)例、在不同的處理模塊實(shí)例之間傳遞數據(包括懇求、響應和條目),以及監控所有那些被調度者的狀態(tài),等等。
  有了調度器的維護,各個(gè)處理模塊得以保持其職責的簡(jiǎn)約和專(zhuān)情。由于調度器是網(wǎng)路爬蟲(chóng)框架中最重要的一個(gè)模塊,所以還須要再編撰出一些工具來(lái)支撐起它的功能。
  在弄清楚網(wǎng)路爬蟲(chóng)框架中各個(gè)模塊的職責以后網(wǎng)絡(luò )爬蟲(chóng) 語(yǔ)言,你曉得它是以調度器為核心的。此外,為了并發(fā)執行的須要,除調度器之外的其他模塊都可以是多實(shí)例的,它們由調度器持有、維護和調用。反過(guò)來(lái)講,這些處理模塊的實(shí)例會(huì )從調度器那兒接受輸入,并在進(jìn)行相應的處理后將輸出返回給調度器。
  最后,與另外兩個(gè)處理模塊相比,條目處理管線(xiàn)是比較特殊的。顧名思義,它是以流式處理為基礎的,其設計靈感來(lái)自于我之前講過(guò)的 Linux 系統中的管線(xiàn)。
  我們可以不斷地向該管線(xiàn)發(fā)送條目,而該管線(xiàn)則會(huì )使其中的若干個(gè)條目處理器依次處理每一個(gè)條目。我們可以挺輕易地使用一些同步方式來(lái)保證條目處理管線(xiàn)的并發(fā)安全性,因此雖然調度器只持有該管線(xiàn)的一個(gè)實(shí)例,也不會(huì )有任何問(wèn)題。
  下圖展示了調度器與各個(gè)處理模塊之間的關(guān)系,圖中加入了一個(gè)新的元素——工具箱網(wǎng)絡(luò )爬蟲(chóng) 語(yǔ)言,之前所說(shuō)的用于支撐調度器功能的這些工具就是工具箱的一部分。顧名思義,工具箱不是一個(gè)完整的模塊,而是一些工具的集合,這些工具是調度器與所有處理模塊之間的橋梁。
  
  圖:調度器與各處理模塊的關(guān)系
  至此,大家對網(wǎng)路爬蟲(chóng)框架的設計有了一個(gè)宏觀(guān)上的認識。不過(guò),我還未提到在這個(gè)總體設計之下包含的大量設計方法和決策。這些方法和決策不但與一些通用的程序設計原則有關(guān),還涉及好多依賴(lài)于 Go語(yǔ)言的編程風(fēng)格和形式技巧。
  這也從側面說(shuō)明,由于幾乎所有語(yǔ)言都有著(zhù)十分鮮明的特征和比較擅長(cháng)的領(lǐng)域,所以在設計一個(gè)須要由特定語(yǔ)言實(shí)現的軟件或程序時(shí),多多少少會(huì )考慮到這門(mén)語(yǔ)言自身的特點(diǎn)。也就是說(shuō),軟件設計不是與具體的語(yǔ)言毫不相關(guān)的。反過(guò)來(lái)講,總會(huì )有一門(mén)或幾門(mén)語(yǔ)言十分適宜實(shí)現某一類(lèi)軟件或程序。

設計和實(shí)現一款輕量級的爬蟲(chóng)框架

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 327 次瀏覽 ? 2020-05-05 08:05 ? 來(lái)自相關(guān)話(huà)題

  
  說(shuō)起爬蟲(chóng),大家能否想起 Python 里赫赫有名的 Scrapy 框架, 在本文中我們參考這個(gè)設計思想使用 Java 語(yǔ)言來(lái)實(shí)現一款自己的爬蟲(chóng)框(lun)架(zi)。 我們從起點(diǎn)一步一步剖析爬蟲(chóng)框架的誕生過(guò)程。
  我把這個(gè)爬蟲(chóng)框架的源碼置于 github上,里面有幾個(gè)事例可以運行。
  
  關(guān)于爬蟲(chóng)的一切
  下面我們來(lái)介紹哪些是爬蟲(chóng)?以及爬蟲(chóng)框架的設計和碰到的問(wèn)題。
  什么是爬蟲(chóng)?
  “爬蟲(chóng)”不是一只生活在泥土里的小蟲(chóng)子,網(wǎng)絡(luò )爬蟲(chóng)(web crawler),也叫網(wǎng)路蜘蛛(spider),是一種拿來(lái)手動(dòng)瀏覽網(wǎng)路上內容的機器人。 爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站的過(guò)程會(huì )消耗目標系統資源,很多網(wǎng)站不容許被爬蟲(chóng)抓?。ㄟ@就是你遇見(jiàn)過(guò)的 robots.txt 文件, 這個(gè)文件可以要求機器人只對網(wǎng)站的一部分進(jìn)行索引,或完全不作處理)。 因此在訪(fǎng)問(wèn)大量頁(yè)面時(shí),爬蟲(chóng)須要考慮到規劃、負載,還須要講“禮貌”(大兄弟,慢點(diǎn))。
  互聯(lián)網(wǎng)上的頁(yè)面極多,即使是最大的爬蟲(chóng)系統也未能作出完整的索引。因此在公元2000年之前的萬(wàn)維網(wǎng)出現早期,搜索引擎常常找不到多少相關(guān)結果。 現在的搜索引擎在這方面早已進(jìn)步好多,能夠即刻給出高質(zhì)量結果。
  網(wǎng)絡(luò )爬蟲(chóng)會(huì )碰到的問(wèn)題
  既然有人想抓取,就會(huì )有人想防御。網(wǎng)絡(luò )爬蟲(chóng)在運行的過(guò)程中會(huì )碰到一些阻撓,在業(yè)內稱(chēng)之為 反爬蟲(chóng)策略 我們來(lái)列舉一些常見(jiàn)的。
  這些是傳統的反爬蟲(chóng)手段,當然未來(lái)也會(huì )愈加先進(jìn),技術(shù)的革新永遠會(huì )推動(dòng)多個(gè)行業(yè)的發(fā)展,畢竟 AI 的時(shí)代早已到來(lái), 爬蟲(chóng)和反爬蟲(chóng)的斗爭仍然持續進(jìn)行。
  爬蟲(chóng)框架要考慮哪些
  設計我們的框架
  我們要設計一款爬蟲(chóng)框架,是基于 Scrapy 的設計思路來(lái)完成的,先來(lái)瞧瞧在沒(méi)有爬蟲(chóng)框架的時(shí)侯我們是怎樣抓取頁(yè)面信息的。 一個(gè)常見(jiàn)的事例是使用 HttpClient 包或則 Jsoup 來(lái)處理,對于一個(gè)簡(jiǎn)單的小爬蟲(chóng)而言這足夠了。
  下面來(lái)演示一段沒(méi)有爬蟲(chóng)框架的時(shí)侯抓取頁(yè)面的代碼,這是我在網(wǎng)路上搜索的
  public class Reptile {
public static void main(String[] args) {
//傳入你所要爬取的頁(yè)面地址
String url1 = "";
//創(chuàng )建輸入流用于讀取流
InputStream is = null;
//包裝流,加快讀取速度
BufferedReader br = null;
//用來(lái)保存讀取頁(yè)面的數據.
StringBuffer html = new StringBuffer();
//創(chuàng )建臨時(shí)字符串用于保存每一次讀的一行數據,然后html調用append方法寫(xiě)入temp;
String temp = "";
try {
//獲取URL;
URL url2 = new URL(url1);
//打開(kāi)流,準備開(kāi)始讀取數據;
is = url2.openStream();
//將流包裝成字符流,調用br.readLine()可以提高讀取效率,每次讀取一行;
br= new BufferedReader(new InputStreamReader(is));
//讀取數據,調用br.readLine()方法每次讀取一行數據,并賦值給temp,如果沒(méi)數據則值==null,跳出循環(huán);
while ((temp = br.readLine()) != null) {
//將temp的值追加給html,這里注意的時(shí)String跟StringBuffere的區別前者不是可變的后者是可變的;
html.append(temp);
}
//接下來(lái)是關(guān)閉流,防止資源的浪費;
if(is != null) {
is.close();
is = null;
}
//通過(guò)Jsoup解析頁(yè)面,生成一個(gè)document對象;
Document doc = Jsoup.parse(html.toString());
//通過(guò)class的名字得到(即XX),一個(gè)數組對象Elements里面有我們想要的數據,至于這個(gè)div的值呢你打開(kāi)瀏覽器按下F12就知道了;
Elements elements = doc.getElementsByClass("XX");
for (Element element : elements) {
//打印出每一個(gè)節點(diǎn)的信息;你可以選擇性的保留你想要的數據,一般都是獲取個(gè)固定的索引;
System.out.println(element.text());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
  從這么豐富的注釋中我感受到了作者的耐心,我們來(lái)剖析一下這個(gè)爬蟲(chóng)在干哪些?
  大概就是這樣的步驟,代碼也十分簡(jiǎn)約,我們設計框架的目的是將這種流程統一化,把通用的功能進(jìn)行具象,減少重復工作。 還有一些沒(méi)考慮到的誘因添加進(jìn)去爬蟲(chóng)框架,那么設計爬蟲(chóng)框架要有什么組成呢?
  分別來(lái)解釋一下每位組成的作用是哪些。
  URL管理器
  爬蟲(chóng)框架要處理好多的URL,我們須要設計一個(gè)隊列儲存所有要處理的URL,這種先進(jìn)先出的數據結構十分符合這個(gè)需求。 將所有要下載的URL存貯在待處理隊列中,每次下載會(huì )取出一個(gè),隊列中還會(huì )少一個(gè)。我們曉得有些URL的下載會(huì )有反爬蟲(chóng)策略, 所以針對那些懇求須要做一些特殊的設置,進(jìn)而可以對URL進(jìn)行封裝抽出 Request。
  網(wǎng)頁(yè)下載器
  在上面的簡(jiǎn)單事例中可以看出,如果沒(méi)有網(wǎng)頁(yè)下載器,用戶(hù)就要編撰網(wǎng)路懇求的處理代碼,這無(wú)疑對每位URL都是相同的動(dòng)作。 所以在框架設計中我們直接加入它就好了,至于使用哪些庫來(lái)進(jìn)行下載都是可以的,你可以用 httpclient 也可以用 okhttp, 在本文中我們使用一個(gè)超輕量級的網(wǎng)路懇求庫 oh-my-request (沒(méi)錯,就是在下搞的)。 優(yōu)秀的框架設計會(huì )將這個(gè)下載組件置為可替換,提供默認的即可。
  爬蟲(chóng)調度器
  調度器和我們在開(kāi)發(fā) web 應用中的控制器是一個(gè)類(lèi)似的概念,它用于在下載器、解析器之間做流轉處理。 解析器可以解析到更多的URL發(fā)送給調度器,調度器再度的傳輸給下載器,這樣才會(huì )使各個(gè)組件有條不紊的進(jìn)行工作。
  網(wǎng)頁(yè)解析器
  我們曉得當一個(gè)頁(yè)面下載完成后就是一段 HTML 的 DOM 字符串表示,但還須要提取出真正須要的數據, 以前的做法是通過(guò) String 的 API 或者正則表達式的形式在 DOM 中搜救,這樣是很麻煩的,框架 應該提供一種合理、常用、方便的方法來(lái)幫助用戶(hù)完成提取數據這件事兒。常用的手段是通過(guò) xpath 或者 css 選擇器從 DOM 中進(jìn)行提取,而且學(xué)習這項技能在幾乎所有的爬蟲(chóng)框架中都是適用的。
  數據處理器
  普通的爬蟲(chóng)程序中是把 網(wǎng)頁(yè)解析器 和 數據處理器 合在一起的,解析到數據后馬上處理。 在一個(gè)標準化的爬蟲(chóng)程序中,他們應當是各司其職的,我們先通過(guò)解析器將須要的數據解析下來(lái),可能是封裝成對象。 然后傳遞給數據處理器,處理器接收到數據后可能是儲存到數據庫,也可能通過(guò)插口發(fā)送給老王。
  基本特點(diǎn)
  上面說(shuō)了這么多,我們設計的爬蟲(chóng)框架有以下幾個(gè)特點(diǎn),沒(méi)有做到大而全,可以稱(chēng)得上輕量迷你很好用。
  架構圖
  
  整個(gè)流程和 Scrapy 是一致的,但簡(jiǎn)化了一些操作
  執行流程圖
  
  項目結構
  該項目使用 Maven3、Java8 進(jìn)行完善,代碼結構如下:
  .
└── elves
├── Elves.java
├── ElvesEngine.java
├── config
├── download
├── event
├── pipeline
├── request
├── response
├── scheduler
├── spider
└── utils
  編碼要點(diǎn)
  前面設計思路明白以后,編程不過(guò)是順手之作,至于寫(xiě)的怎么審視的是程序員對編程語(yǔ)言的使用熟練度以及構架上的思索, 優(yōu)秀的代碼是經(jīng)驗和優(yōu)化而至的,下面我們來(lái)看幾個(gè)框架中的代碼示例。
  使用觀(guān)察者模式的思想來(lái)實(shí)現基于風(fēng)波驅動(dòng)的功能
  public enum ElvesEvent {
GLOBAL_STARTED,
SPIDER_STARTED
}
public class EventManager {
private static final Map<ElvesEvent, List<Consumer<Config>>> elvesEventConsumerMap = new HashMap<>();
// 注冊事件
public static void registerEvent(ElvesEvent elvesEvent, Consumer<Config> consumer) {
List<Consumer<Config>> consumers = elvesEventConsumerMap.get(elvesEvent);
if (null == consumers) {
consumers = new ArrayList<>();
}
consumers.add(consumer);
elvesEventConsumerMap.put(elvesEvent, consumers);
}
// 執行事件
public static void fireEvent(ElvesEvent elvesEvent, Config config) {
Optional.ofNullable(elvesEventConsumerMap.get(elvesEvent)).ifPresent(consumers -> consumers.forEach(consumer -> consumer.accept(config)));
}
}
  這段代碼中使用一個(gè) Map 來(lái)儲存所有風(fēng)波,提供兩個(gè)方式:注冊一個(gè)風(fēng)波、執行某個(gè)風(fēng)波。
  阻塞隊列儲存懇求響應
  public class Scheduler {
private BlockingQueue<Request> pending = new LinkedBlockingQueue<>();
private BlockingQueue<Response> result = new LinkedBlockingQueue<>();
public void addRequest(Request request) {
try {
this.pending.put(request);
} catch (InterruptedException e) {
log.error("向調度器添加 Request 出錯", e);
}
}
public void addResponse(Response response) {
try {
this.result.put(response);
} catch (InterruptedException e) {
log.error("向調度器添加 Response 出錯", e);
}
}
public boolean hasRequest() {
return pending.size() > 0;
}
public Request nextRequest() {
try {
return pending.take();
} catch (InterruptedException e) {
log.error("從調度器獲取 Request 出錯", e);
return null;
}
}
public boolean hasResponse() {
return result.size() > 0;
}
public Response nextResponse() {
try {
return result.take();
} catch (InterruptedException e) {
log.error("從調度器獲取 Response 出錯", e);
return null;
}
}
public void addRequests(List<Request> requests) {
requests.forEach(this::addRequest);
}
}
  pending 存儲等待處理的URL懇求,result 存儲下載成功的響應,調度器負責懇求和響應的獲取和添加流轉。
  舉個(gè)栗子
  設計好我們的爬蟲(chóng)框架后來(lái)試一下吧,這個(gè)事例我們來(lái)爬取豆瓣影片的標題。豆瓣影片中有很多分類(lèi),我們可以選擇幾個(gè)作為開(kāi)始抓取的 URL。
  public class DoubanSpider extends Spider {
public DoubanSpider(String name) {
super(name);
}
@Override
public void onStart(Config config) {
this.startUrls(
"https://movie.douban.com/tag/愛(ài)情",
"https://movie.douban.com/tag/喜劇",
"https://movie.douban.com/tag/動(dòng)畫(huà)",
"https://movie.douban.com/tag/動(dòng)作",
"https://movie.douban.com/tag/史詩(shī)",
"https://movie.douban.com/tag/犯罪");
this.addPipeline((Pipeline<List<String>>) (item, request) -> log.info("保存到文件: {}", item));
}
public Result parse(Response response) {
Result<List<String>> result = new Result<>();
Elements elements = response.body().css("#content table .pl2 a");
List<String> titles = elements.stream().map(Element::text).collect(Collectors.toList());
result.setItem(titles);
// 獲取下一頁(yè) URL
Elements nextEl = response.body().css("#content > div > div.article > div.paginator > span.next > a");
if (null != nextEl && nextEl.size() > 0) {
String nextPageUrl = nextEl.get(0).attr("href");
Request nextReq = this.makeRequest(nextPageUrl, this::parse);
result.addRequest(nextReq);
}
return result;
}
}
public static void main(String[] args) {
DoubanSpider doubanSpider = new DoubanSpider("豆瓣電影");
Elves.me(doubanSpider, Config.me()).start();
}
  這段代碼中在 onStart 方法是爬蟲(chóng)啟動(dòng)時(shí)的一個(gè)風(fēng)波,會(huì )在啟動(dòng)該爬蟲(chóng)的時(shí)侯執行,在這里我們設置了啟動(dòng)要抓取的URL列表。 然后添加了一個(gè)數據處理的 Pipeline,在這里處理管線(xiàn)中只進(jìn)行了輸出,你也可以?xún)Υ妗?br />   在 parse 方法中做了兩件事,首先解析當前抓取到的所有影片標題,將標題數據搜集為 List 傳遞給 Pipeline; 其次按照當前頁(yè)面繼續抓取下一頁(yè),將下一頁(yè)懇求傳遞給調度器爬蟲(chóng)框架,由調度器轉發(fā)給下載器。這里我們使用一個(gè) Result 對象接收。
  總結
  設計一款爬蟲(chóng)框架的基本要點(diǎn)在文中早已論述,要做的更好還有好多細節須要打磨,比如分布式、容錯恢復、動(dòng)態(tài)頁(yè)面抓取等問(wèn)題。 歡迎在 elves 中遞交你的意見(jiàn)。
  參考文獻 查看全部

  
  說(shuō)起爬蟲(chóng),大家能否想起 Python 里赫赫有名的 Scrapy 框架, 在本文中我們參考這個(gè)設計思想使用 Java 語(yǔ)言來(lái)實(shí)現一款自己的爬蟲(chóng)框(lun)架(zi)。 我們從起點(diǎn)一步一步剖析爬蟲(chóng)框架的誕生過(guò)程。
  我把這個(gè)爬蟲(chóng)框架的源碼置于 github上,里面有幾個(gè)事例可以運行。
  
  關(guān)于爬蟲(chóng)的一切
  下面我們來(lái)介紹哪些是爬蟲(chóng)?以及爬蟲(chóng)框架的設計和碰到的問(wèn)題。
  什么是爬蟲(chóng)?
  “爬蟲(chóng)”不是一只生活在泥土里的小蟲(chóng)子,網(wǎng)絡(luò )爬蟲(chóng)(web crawler),也叫網(wǎng)路蜘蛛(spider),是一種拿來(lái)手動(dòng)瀏覽網(wǎng)路上內容的機器人。 爬蟲(chóng)訪(fǎng)問(wèn)網(wǎng)站的過(guò)程會(huì )消耗目標系統資源,很多網(wǎng)站不容許被爬蟲(chóng)抓?。ㄟ@就是你遇見(jiàn)過(guò)的 robots.txt 文件, 這個(gè)文件可以要求機器人只對網(wǎng)站的一部分進(jìn)行索引,或完全不作處理)。 因此在訪(fǎng)問(wèn)大量頁(yè)面時(shí),爬蟲(chóng)須要考慮到規劃、負載,還須要講“禮貌”(大兄弟,慢點(diǎn))。
  互聯(lián)網(wǎng)上的頁(yè)面極多,即使是最大的爬蟲(chóng)系統也未能作出完整的索引。因此在公元2000年之前的萬(wàn)維網(wǎng)出現早期,搜索引擎常常找不到多少相關(guān)結果。 現在的搜索引擎在這方面早已進(jìn)步好多,能夠即刻給出高質(zhì)量結果。
  網(wǎng)絡(luò )爬蟲(chóng)會(huì )碰到的問(wèn)題
  既然有人想抓取,就會(huì )有人想防御。網(wǎng)絡(luò )爬蟲(chóng)在運行的過(guò)程中會(huì )碰到一些阻撓,在業(yè)內稱(chēng)之為 反爬蟲(chóng)策略 我們來(lái)列舉一些常見(jiàn)的。
  這些是傳統的反爬蟲(chóng)手段,當然未來(lái)也會(huì )愈加先進(jìn),技術(shù)的革新永遠會(huì )推動(dòng)多個(gè)行業(yè)的發(fā)展,畢竟 AI 的時(shí)代早已到來(lái), 爬蟲(chóng)和反爬蟲(chóng)的斗爭仍然持續進(jìn)行。
  爬蟲(chóng)框架要考慮哪些
  設計我們的框架
  我們要設計一款爬蟲(chóng)框架,是基于 Scrapy 的設計思路來(lái)完成的,先來(lái)瞧瞧在沒(méi)有爬蟲(chóng)框架的時(shí)侯我們是怎樣抓取頁(yè)面信息的。 一個(gè)常見(jiàn)的事例是使用 HttpClient 包或則 Jsoup 來(lái)處理,對于一個(gè)簡(jiǎn)單的小爬蟲(chóng)而言這足夠了。
  下面來(lái)演示一段沒(méi)有爬蟲(chóng)框架的時(shí)侯抓取頁(yè)面的代碼,這是我在網(wǎng)路上搜索的
  public class Reptile {
public static void main(String[] args) {
//傳入你所要爬取的頁(yè)面地址
String url1 = "";
//創(chuàng )建輸入流用于讀取流
InputStream is = null;
//包裝流,加快讀取速度
BufferedReader br = null;
//用來(lái)保存讀取頁(yè)面的數據.
StringBuffer html = new StringBuffer();
//創(chuàng )建臨時(shí)字符串用于保存每一次讀的一行數據,然后html調用append方法寫(xiě)入temp;
String temp = "";
try {
//獲取URL;
URL url2 = new URL(url1);
//打開(kāi)流,準備開(kāi)始讀取數據;
is = url2.openStream();
//將流包裝成字符流,調用br.readLine()可以提高讀取效率,每次讀取一行;
br= new BufferedReader(new InputStreamReader(is));
//讀取數據,調用br.readLine()方法每次讀取一行數據,并賦值給temp,如果沒(méi)數據則值==null,跳出循環(huán);
while ((temp = br.readLine()) != null) {
//將temp的值追加給html,這里注意的時(shí)String跟StringBuffere的區別前者不是可變的后者是可變的;
html.append(temp);
}
//接下來(lái)是關(guān)閉流,防止資源的浪費;
if(is != null) {
is.close();
is = null;
}
//通過(guò)Jsoup解析頁(yè)面,生成一個(gè)document對象;
Document doc = Jsoup.parse(html.toString());
//通過(guò)class的名字得到(即XX),一個(gè)數組對象Elements里面有我們想要的數據,至于這個(gè)div的值呢你打開(kāi)瀏覽器按下F12就知道了;
Elements elements = doc.getElementsByClass("XX");
for (Element element : elements) {
//打印出每一個(gè)節點(diǎn)的信息;你可以選擇性的保留你想要的數據,一般都是獲取個(gè)固定的索引;
System.out.println(element.text());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
  從這么豐富的注釋中我感受到了作者的耐心,我們來(lái)剖析一下這個(gè)爬蟲(chóng)在干哪些?
  大概就是這樣的步驟,代碼也十分簡(jiǎn)約,我們設計框架的目的是將這種流程統一化,把通用的功能進(jìn)行具象,減少重復工作。 還有一些沒(méi)考慮到的誘因添加進(jìn)去爬蟲(chóng)框架,那么設計爬蟲(chóng)框架要有什么組成呢?
  分別來(lái)解釋一下每位組成的作用是哪些。
  URL管理器
  爬蟲(chóng)框架要處理好多的URL,我們須要設計一個(gè)隊列儲存所有要處理的URL,這種先進(jìn)先出的數據結構十分符合這個(gè)需求。 將所有要下載的URL存貯在待處理隊列中,每次下載會(huì )取出一個(gè),隊列中還會(huì )少一個(gè)。我們曉得有些URL的下載會(huì )有反爬蟲(chóng)策略, 所以針對那些懇求須要做一些特殊的設置,進(jìn)而可以對URL進(jìn)行封裝抽出 Request。
  網(wǎng)頁(yè)下載器
  在上面的簡(jiǎn)單事例中可以看出,如果沒(méi)有網(wǎng)頁(yè)下載器,用戶(hù)就要編撰網(wǎng)路懇求的處理代碼,這無(wú)疑對每位URL都是相同的動(dòng)作。 所以在框架設計中我們直接加入它就好了,至于使用哪些庫來(lái)進(jìn)行下載都是可以的,你可以用 httpclient 也可以用 okhttp, 在本文中我們使用一個(gè)超輕量級的網(wǎng)路懇求庫 oh-my-request (沒(méi)錯,就是在下搞的)。 優(yōu)秀的框架設計會(huì )將這個(gè)下載組件置為可替換,提供默認的即可。
  爬蟲(chóng)調度器
  調度器和我們在開(kāi)發(fā) web 應用中的控制器是一個(gè)類(lèi)似的概念,它用于在下載器、解析器之間做流轉處理。 解析器可以解析到更多的URL發(fā)送給調度器,調度器再度的傳輸給下載器,這樣才會(huì )使各個(gè)組件有條不紊的進(jìn)行工作。
  網(wǎng)頁(yè)解析器
  我們曉得當一個(gè)頁(yè)面下載完成后就是一段 HTML 的 DOM 字符串表示,但還須要提取出真正須要的數據, 以前的做法是通過(guò) String 的 API 或者正則表達式的形式在 DOM 中搜救,這樣是很麻煩的,框架 應該提供一種合理、常用、方便的方法來(lái)幫助用戶(hù)完成提取數據這件事兒。常用的手段是通過(guò) xpath 或者 css 選擇器從 DOM 中進(jìn)行提取,而且學(xué)習這項技能在幾乎所有的爬蟲(chóng)框架中都是適用的。
  數據處理器
  普通的爬蟲(chóng)程序中是把 網(wǎng)頁(yè)解析器 和 數據處理器 合在一起的,解析到數據后馬上處理。 在一個(gè)標準化的爬蟲(chóng)程序中,他們應當是各司其職的,我們先通過(guò)解析器將須要的數據解析下來(lái),可能是封裝成對象。 然后傳遞給數據處理器,處理器接收到數據后可能是儲存到數據庫,也可能通過(guò)插口發(fā)送給老王。
  基本特點(diǎn)
  上面說(shuō)了這么多,我們設計的爬蟲(chóng)框架有以下幾個(gè)特點(diǎn),沒(méi)有做到大而全,可以稱(chēng)得上輕量迷你很好用。
  架構圖
  
  整個(gè)流程和 Scrapy 是一致的,但簡(jiǎn)化了一些操作
  執行流程圖
  
  項目結構
  該項目使用 Maven3、Java8 進(jìn)行完善,代碼結構如下:
  .
└── elves
├── Elves.java
├── ElvesEngine.java
├── config
├── download
├── event
├── pipeline
├── request
├── response
├── scheduler
├── spider
└── utils
  編碼要點(diǎn)
  前面設計思路明白以后,編程不過(guò)是順手之作,至于寫(xiě)的怎么審視的是程序員對編程語(yǔ)言的使用熟練度以及構架上的思索, 優(yōu)秀的代碼是經(jīng)驗和優(yōu)化而至的,下面我們來(lái)看幾個(gè)框架中的代碼示例。
  使用觀(guān)察者模式的思想來(lái)實(shí)現基于風(fēng)波驅動(dòng)的功能
  public enum ElvesEvent {
GLOBAL_STARTED,
SPIDER_STARTED
}
public class EventManager {
private static final Map<ElvesEvent, List<Consumer<Config>>> elvesEventConsumerMap = new HashMap<>();
// 注冊事件
public static void registerEvent(ElvesEvent elvesEvent, Consumer<Config> consumer) {
List<Consumer<Config>> consumers = elvesEventConsumerMap.get(elvesEvent);
if (null == consumers) {
consumers = new ArrayList<>();
}
consumers.add(consumer);
elvesEventConsumerMap.put(elvesEvent, consumers);
}
// 執行事件
public static void fireEvent(ElvesEvent elvesEvent, Config config) {
Optional.ofNullable(elvesEventConsumerMap.get(elvesEvent)).ifPresent(consumers -> consumers.forEach(consumer -> consumer.accept(config)));
}
}
  這段代碼中使用一個(gè) Map 來(lái)儲存所有風(fēng)波,提供兩個(gè)方式:注冊一個(gè)風(fēng)波、執行某個(gè)風(fēng)波。
  阻塞隊列儲存懇求響應
  public class Scheduler {
private BlockingQueue<Request> pending = new LinkedBlockingQueue<>();
private BlockingQueue<Response> result = new LinkedBlockingQueue<>();
public void addRequest(Request request) {
try {
this.pending.put(request);
} catch (InterruptedException e) {
log.error("向調度器添加 Request 出錯", e);
}
}
public void addResponse(Response response) {
try {
this.result.put(response);
} catch (InterruptedException e) {
log.error("向調度器添加 Response 出錯", e);
}
}
public boolean hasRequest() {
return pending.size() > 0;
}
public Request nextRequest() {
try {
return pending.take();
} catch (InterruptedException e) {
log.error("從調度器獲取 Request 出錯", e);
return null;
}
}
public boolean hasResponse() {
return result.size() > 0;
}
public Response nextResponse() {
try {
return result.take();
} catch (InterruptedException e) {
log.error("從調度器獲取 Response 出錯", e);
return null;
}
}
public void addRequests(List<Request> requests) {
requests.forEach(this::addRequest);
}
}
  pending 存儲等待處理的URL懇求,result 存儲下載成功的響應,調度器負責懇求和響應的獲取和添加流轉。
  舉個(gè)栗子
  設計好我們的爬蟲(chóng)框架后來(lái)試一下吧,這個(gè)事例我們來(lái)爬取豆瓣影片的標題。豆瓣影片中有很多分類(lèi),我們可以選擇幾個(gè)作為開(kāi)始抓取的 URL。
  public class DoubanSpider extends Spider {
public DoubanSpider(String name) {
super(name);
}
@Override
public void onStart(Config config) {
this.startUrls(
"https://movie.douban.com/tag/愛(ài)情",
"https://movie.douban.com/tag/喜劇",
"https://movie.douban.com/tag/動(dòng)畫(huà)",
"https://movie.douban.com/tag/動(dòng)作",
"https://movie.douban.com/tag/史詩(shī)",
"https://movie.douban.com/tag/犯罪");
this.addPipeline((Pipeline<List<String>>) (item, request) -> log.info("保存到文件: {}", item));
}
public Result parse(Response response) {
Result<List<String>> result = new Result<>();
Elements elements = response.body().css("#content table .pl2 a");
List<String> titles = elements.stream().map(Element::text).collect(Collectors.toList());
result.setItem(titles);
// 獲取下一頁(yè) URL
Elements nextEl = response.body().css("#content > div > div.article > div.paginator > span.next > a");
if (null != nextEl && nextEl.size() > 0) {
String nextPageUrl = nextEl.get(0).attr("href");
Request nextReq = this.makeRequest(nextPageUrl, this::parse);
result.addRequest(nextReq);
}
return result;
}
}
public static void main(String[] args) {
DoubanSpider doubanSpider = new DoubanSpider("豆瓣電影");
Elves.me(doubanSpider, Config.me()).start();
}
  這段代碼中在 onStart 方法是爬蟲(chóng)啟動(dòng)時(shí)的一個(gè)風(fēng)波,會(huì )在啟動(dòng)該爬蟲(chóng)的時(shí)侯執行,在這里我們設置了啟動(dòng)要抓取的URL列表。 然后添加了一個(gè)數據處理的 Pipeline,在這里處理管線(xiàn)中只進(jìn)行了輸出,你也可以?xún)Υ妗?br />   在 parse 方法中做了兩件事,首先解析當前抓取到的所有影片標題,將標題數據搜集為 List 傳遞給 Pipeline; 其次按照當前頁(yè)面繼續抓取下一頁(yè),將下一頁(yè)懇求傳遞給調度器爬蟲(chóng)框架,由調度器轉發(fā)給下載器。這里我們使用一個(gè) Result 對象接收。
  總結
  設計一款爬蟲(chóng)框架的基本要點(diǎn)在文中早已論述,要做的更好還有好多細節須要打磨,比如分布式、容錯恢復、動(dòng)態(tài)頁(yè)面抓取等問(wèn)題。 歡迎在 elves 中遞交你的意見(jiàn)。
  參考文獻

[申精]淘寶網(wǎng)爬蟲(chóng)引擎設計構架圖等

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 300 次瀏覽 ? 2020-05-05 08:03 ? 來(lái)自相關(guān)話(huà)題

  
  
  
  
  更多貼子
  豬孩子啊啊大大
  
  本版專(zhuān)家分:0
  在《淘寶網(wǎng)》購物時(shí)爬蟲(chóng)框架設計,顧客最關(guān)心的就是這兩個(gè)頁(yè)面(這兩個(gè)頁(yè)面的網(wǎng)址sample分別為
  ;item_num_id=3899429723&cm_cat=50010388和),因此這兩個(gè)頁(yè)面的信息對于客戶(hù)至關(guān)重要,這也是我的搜索引擎信息搜集的地方。由于有成千上萬(wàn)的這樣格式的頁(yè)面,所以我的目標就是設計出一個(gè)爬蟲(chóng)引擎在《淘寶網(wǎng)》上不斷地爬,以零下載為條件,直接將目標信息數據導出我創(chuàng )建的數據庫中,再進(jìn)行搜索。
  綜合剖析這兩個(gè)典型頁(yè)面,我們可以得到這樣的信息:大部分《淘寶網(wǎng)》的商品和商家信息都是根據這兩個(gè)頁(yè)面的格式方式存在的。所以借此便可以寫(xiě)出程序推算出整個(gè)《淘寶網(wǎng)》的數據。
  
  頁(yè)面HTML源碼關(guān)鍵點(diǎn)
  我在網(wǎng)上詳盡查閱了有關(guān)爬蟲(chóng)引擎的資料和仔細選購了開(kāi)源框架后。決定使用以下幾個(gè)框架作為我的爬蟲(chóng)引擎的主要框架。
  1.HtmlParser
  這個(gè)開(kāi)源框架主要用于解析Html格式的頁(yè)面,這個(gè)框架的目的就是從當前頁(yè)面將關(guān)鍵數據提取下來(lái),從而在零下載的情況下得到數據。由于這個(gè)框架時(shí)間比較早,未免有些比較陳舊的做法,比如NodeList類(lèi)沒(méi)有實(shí)現Iterator插口爬蟲(chóng)框架設計,沒(méi)有借助類(lèi)庫等。以后的項目中可以替換為較新較成熟的框架。
  2.ApacheCommonsChain
  在網(wǎng)頁(yè)提取過(guò)程中,每個(gè)不同頁(yè)面究竟該用那個(gè)類(lèi)來(lái)負責解析呢?仔細剖析后,我個(gè)人認為使用【設計模式】中的責任鏈模式可以極大地減少代碼耦合性,達到【軟件工程】中開(kāi)閉原則的療效。減少ifelse繁雜的判定,使代碼更清晰。
  3.iBatis
  我經(jīng)過(guò)對比,選擇了iBatis作為DAO層的數據儲存框架,由于其可以靈活的配置SQL句子,以及輕量級設計,可以使我使用一些數據庫存儲過(guò)程等維持字段的約束。
  4.ApacheCommonsBeanutils
  這個(gè)框架的BeanMap是一個(gè)挺好的東西,它采用了一個(gè)反射的做法給我提供了一個(gè)可以將Map屬性通配符對轉化為bean類(lèi)的方式,利用這個(gè)類(lèi)可以讓頁(yè)面提取出的Map中包含的數據用一個(gè)統一的方式轉化為實(shí)體類(lèi),再存入數據庫。
  
  爬蟲(chóng)引擎程序流程圖
  最終,得到了大量的《淘寶網(wǎng)》的商品和店家的數據庫表中的數據,由于這個(gè)爬蟲(chóng)引擎借助“責任鏈模式”解析數據,可以靈活地擴充到其他不同結構的網(wǎng)頁(yè)中去提取數據,在此基礎上再實(shí)現搜索。(很抱歉,由于我下班后業(yè)余時(shí)間之作,時(shí)間匆忙,全文搜索這部份未完成,考慮計劃使用ApacheLucene開(kāi)源框架做智能全文搜索框架) 查看全部

  
  
  
  
  更多貼子
  豬孩子啊啊大大
  
  本版專(zhuān)家分:0
  在《淘寶網(wǎng)》購物時(shí)爬蟲(chóng)框架設計,顧客最關(guān)心的就是這兩個(gè)頁(yè)面(這兩個(gè)頁(yè)面的網(wǎng)址sample分別為
  ;item_num_id=3899429723&cm_cat=50010388和),因此這兩個(gè)頁(yè)面的信息對于客戶(hù)至關(guān)重要,這也是我的搜索引擎信息搜集的地方。由于有成千上萬(wàn)的這樣格式的頁(yè)面,所以我的目標就是設計出一個(gè)爬蟲(chóng)引擎在《淘寶網(wǎng)》上不斷地爬,以零下載為條件,直接將目標信息數據導出我創(chuàng )建的數據庫中,再進(jìn)行搜索。
  綜合剖析這兩個(gè)典型頁(yè)面,我們可以得到這樣的信息:大部分《淘寶網(wǎng)》的商品和商家信息都是根據這兩個(gè)頁(yè)面的格式方式存在的。所以借此便可以寫(xiě)出程序推算出整個(gè)《淘寶網(wǎng)》的數據。
  
  頁(yè)面HTML源碼關(guān)鍵點(diǎn)
  我在網(wǎng)上詳盡查閱了有關(guān)爬蟲(chóng)引擎的資料和仔細選購了開(kāi)源框架后。決定使用以下幾個(gè)框架作為我的爬蟲(chóng)引擎的主要框架。
  1.HtmlParser
  這個(gè)開(kāi)源框架主要用于解析Html格式的頁(yè)面,這個(gè)框架的目的就是從當前頁(yè)面將關(guān)鍵數據提取下來(lái),從而在零下載的情況下得到數據。由于這個(gè)框架時(shí)間比較早,未免有些比較陳舊的做法,比如NodeList類(lèi)沒(méi)有實(shí)現Iterator插口爬蟲(chóng)框架設計,沒(méi)有借助類(lèi)庫等。以后的項目中可以替換為較新較成熟的框架。
  2.ApacheCommonsChain
  在網(wǎng)頁(yè)提取過(guò)程中,每個(gè)不同頁(yè)面究竟該用那個(gè)類(lèi)來(lái)負責解析呢?仔細剖析后,我個(gè)人認為使用【設計模式】中的責任鏈模式可以極大地減少代碼耦合性,達到【軟件工程】中開(kāi)閉原則的療效。減少ifelse繁雜的判定,使代碼更清晰。
  3.iBatis
  我經(jīng)過(guò)對比,選擇了iBatis作為DAO層的數據儲存框架,由于其可以靈活的配置SQL句子,以及輕量級設計,可以使我使用一些數據庫存儲過(guò)程等維持字段的約束。
  4.ApacheCommonsBeanutils
  這個(gè)框架的BeanMap是一個(gè)挺好的東西,它采用了一個(gè)反射的做法給我提供了一個(gè)可以將Map屬性通配符對轉化為bean類(lèi)的方式,利用這個(gè)類(lèi)可以讓頁(yè)面提取出的Map中包含的數據用一個(gè)統一的方式轉化為實(shí)體類(lèi),再存入數據庫。
  
  爬蟲(chóng)引擎程序流程圖
  最終,得到了大量的《淘寶網(wǎng)》的商品和店家的數據庫表中的數據,由于這個(gè)爬蟲(chóng)引擎借助“責任鏈模式”解析數據,可以靈活地擴充到其他不同結構的網(wǎng)頁(yè)中去提取數據,在此基礎上再實(shí)現搜索。(很抱歉,由于我下班后業(yè)余時(shí)間之作,時(shí)間匆忙,全文搜索這部份未完成,考慮計劃使用ApacheLucene開(kāi)源框架做智能全文搜索框架)

爬蟲(chóng)框架是哪些?常見(jiàn)的Python爬蟲(chóng)框架有什么?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 309 次瀏覽 ? 2020-05-02 08:09 ? 來(lái)自相關(guān)話(huà)題

  爬蟲(chóng)框架是哪些?常見(jiàn)的 Python 爬蟲(chóng)框架有什么?學(xué)習爬蟲(chóng)的人對爬蟲(chóng)框架并不陌生,在爬蟲(chóng)漸漸入門(mén)以后,可以有兩個(gè)選擇。 一個(gè)是深入學(xué)習, 比如設計模式相關(guān)的一些知識, 強化 Python 相關(guān)知識,自己動(dòng)手造輪子爬蟲(chóng)框架, 繼續為自己的爬蟲(chóng)降低分布式,多線(xiàn)程等功能擴充。另一條路便是學(xué)習一些優(yōu)秀的框架, 先把這種框架用熟, 可以確保才能應付一些基本的爬蟲(chóng) 任務(wù),也就是可以解決基本的爬蟲(chóng)問(wèn)題,然后再深入學(xué)習它的源碼等知識,進(jìn)一步加強。所以,爬蟲(chóng)框架就是前人積累出來(lái)的,可以滿(mǎn)足自己爬蟲(chóng)需求,又可以以此提高自己的爬蟲(chóng) 水平。那么,爬蟲(chóng)框架都有什么呢?常見(jiàn) python 爬蟲(chóng)框架(1)Scrapy:很強悍的爬蟲(chóng)框架,可以滿(mǎn)足簡(jiǎn)單的頁(yè)面爬?。ū热缈梢悦魑弥?url pattern 的 情況) 。用這個(gè)框架可以輕松爬出來(lái)如亞馬遜商品信息之類(lèi)的數據。但是對于稍稍復雜一點(diǎn) 的頁(yè)面爬蟲(chóng)框架,如 weibo 的頁(yè)面信息,這個(gè)框架就滿(mǎn)足不了需求了。(2)Crawley: 高速爬取對應網(wǎng)站的內容, 支持關(guān)系和非關(guān)系數據庫, 數據可以導入為 JSON、 XML 等(3)Portia:可視化爬取網(wǎng)頁(yè)內容(4)newspaper:提取新聞、文章以及內容剖析(5)python-goose:java 寫(xiě)的文章提取工具(6)Beautiful Soup:名氣大,整合了一些常用爬蟲(chóng)需求。缺點(diǎn):不能加載 JS。(7)mechanize:優(yōu)點(diǎn):可以加載 JS。缺點(diǎn):文檔嚴重缺位。不過(guò)通過(guò)官方的 example 以及 人肉嘗試的方式,還是勉強能用的。(8)selenium:這是一個(gè)調用瀏覽器的 driver, 通過(guò)這個(gè)庫你可以直接調用瀏覽器完成個(gè)別操 作,比如輸入驗證碼。(9)cola:一個(gè)分布式爬蟲(chóng)框架。項目整體設計有點(diǎn)糟,模塊間耦合度較高。 查看全部

  爬蟲(chóng)框架是哪些?常見(jiàn)的 Python 爬蟲(chóng)框架有什么?學(xué)習爬蟲(chóng)的人對爬蟲(chóng)框架并不陌生,在爬蟲(chóng)漸漸入門(mén)以后,可以有兩個(gè)選擇。 一個(gè)是深入學(xué)習, 比如設計模式相關(guān)的一些知識, 強化 Python 相關(guān)知識,自己動(dòng)手造輪子爬蟲(chóng)框架, 繼續為自己的爬蟲(chóng)降低分布式,多線(xiàn)程等功能擴充。另一條路便是學(xué)習一些優(yōu)秀的框架, 先把這種框架用熟, 可以確保才能應付一些基本的爬蟲(chóng) 任務(wù),也就是可以解決基本的爬蟲(chóng)問(wèn)題,然后再深入學(xué)習它的源碼等知識,進(jìn)一步加強。所以,爬蟲(chóng)框架就是前人積累出來(lái)的,可以滿(mǎn)足自己爬蟲(chóng)需求,又可以以此提高自己的爬蟲(chóng) 水平。那么,爬蟲(chóng)框架都有什么呢?常見(jiàn) python 爬蟲(chóng)框架(1)Scrapy:很強悍的爬蟲(chóng)框架,可以滿(mǎn)足簡(jiǎn)單的頁(yè)面爬?。ū热缈梢悦魑弥?url pattern 的 情況) 。用這個(gè)框架可以輕松爬出來(lái)如亞馬遜商品信息之類(lèi)的數據。但是對于稍稍復雜一點(diǎn) 的頁(yè)面爬蟲(chóng)框架,如 weibo 的頁(yè)面信息,這個(gè)框架就滿(mǎn)足不了需求了。(2)Crawley: 高速爬取對應網(wǎng)站的內容, 支持關(guān)系和非關(guān)系數據庫, 數據可以導入為 JSON、 XML 等(3)Portia:可視化爬取網(wǎng)頁(yè)內容(4)newspaper:提取新聞、文章以及內容剖析(5)python-goose:java 寫(xiě)的文章提取工具(6)Beautiful Soup:名氣大,整合了一些常用爬蟲(chóng)需求。缺點(diǎn):不能加載 JS。(7)mechanize:優(yōu)點(diǎn):可以加載 JS。缺點(diǎn):文檔嚴重缺位。不過(guò)通過(guò)官方的 example 以及 人肉嘗試的方式,還是勉強能用的。(8)selenium:這是一個(gè)調用瀏覽器的 driver, 通過(guò)這個(gè)庫你可以直接調用瀏覽器完成個(gè)別操 作,比如輸入驗證碼。(9)cola:一個(gè)分布式爬蟲(chóng)框架。項目整體設計有點(diǎn)糟,模塊間耦合度較高。

官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久