框架
Gecco爬蟲(chóng)框架官網(wǎng)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 463 次瀏覽 ? 2020-06-09 10:24
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)行設計爬蟲(chóng)框架,對更改關(guān)掉、對擴充開(kāi)放。同時(shí)Gecco基于非常開(kāi)放的MIT開(kāi)源協(xié)議,無(wú)論你是使用者還是希望共同建立Gecco的開(kāi)發(fā)者,歡迎pull request。如果你喜歡這款爬蟲(chóng)框架請star 或者 fork!
@Gecco(matchUrl="{user}/{project}", pipelines="consolePipeline")
public class MyGithub implements HtmlBean {
private static final long serialVersionUID = -70687225L;
@RequestParameter("user")
private String user;//url中的{user}值
@RequestParameter("project")
private String project;//url中的{project}值
@Text
@HtmlField(cssPath=".repository-meta-content")
private String title;//抽取頁(yè)面中的title
@Text
@HtmlField(cssPath=".pagehead-actions li:nth-child(2) .social-count")
private int star;//抽取頁(yè)面中的star
@Text
@HtmlField(cssPath=".pagehead-actions li:nth-child(3) .social-count")
private int fork;//抽取頁(yè)面中的fork
@Html
@HtmlField(cssPath=".entry-content")
private String readme;//抽取頁(yè)面中的readme
public String getReadme() {
return readme;
}
public void setReadme(String readme) {
this.readme = readme;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getProject() {
return project;
}
public void setProject(String project) {
this.project = project;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getStar() {
return star;
}
public void setStar(int star) {
this.star = star;
}
public int getFork() {
return fork;
}
public void setFork(int fork) {
this.fork = fork;
}
public static void main(String[] args) {
GeccoEngine.create()
//工程的包路徑
.classpath("com.geccocrawler.gecco.demo")
//開(kāi)始抓取的頁(yè)面地址
.start("")
//開(kāi)啟幾個(gè)爬蟲(chóng)線(xiàn)程
.thread(1)
//單個(gè)爬蟲(chóng)每次抓取完一個(gè)請求后的間隔時(shí)間
.interval(2000)
//循環(huán)抓取
.loop(true)
//使用pc端userAgent
.mobile(false)
//開(kāi)始運行
.run();
}
}
DynamicGecco的目的是在不定義SpiderBean的情況下實(shí)現爬取規則的運行時(shí)配置。其實(shí)現原理是采用字節碼編程,動(dòng)態(tài)生成SpiderBean,而且通過(guò)自定義的GeccoClassLoader實(shí)現了抓取規則的熱布署。下面是一個(gè)簡(jiǎn)單Demo,更復雜的Demo可以參考com.geccocrawler.gecco.demo.dynamic下的反例。
下面的代碼實(shí)現了爬取規則的運行時(shí)配置:
DynamicGecco.html()
.gecco("{user}/{project}", "consolePipeline")
.requestField("request").request().build()
.stringField("user").requestParameter("user").build()
.stringField("project").requestParameter().build()
.stringField("title").csspath(".repository-meta-content").text(false).build()
.intField("star").csspath(".pagehead-actions li:nth-child(2) .social-count").text(false).build()
.intField("fork").csspath(".pagehead-actions li:nth-child(3) .social-count").text().build()
.stringField("contributors").csspath("ul.numbers-summary > li:nth-child(4) > a").href().build()
.register();
//開(kāi)始抓取
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo")
.start("")
.run();
可以看見(jiàn)爬蟲(chóng)框架,DynamicGecco的方法相比傳統的注解形式代碼量大大降低,而且太酷的一點(diǎn)是DynamicGecco支持運行時(shí)定義和更改規則。
請遵循開(kāi)源協(xié)議MIT 查看全部

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)行設計爬蟲(chóng)框架,對更改關(guān)掉、對擴充開(kāi)放。同時(shí)Gecco基于非常開(kāi)放的MIT開(kāi)源協(xié)議,無(wú)論你是使用者還是希望共同建立Gecco的開(kāi)發(fā)者,歡迎pull request。如果你喜歡這款爬蟲(chóng)框架請star 或者 fork!
@Gecco(matchUrl="{user}/{project}", pipelines="consolePipeline")
public class MyGithub implements HtmlBean {
private static final long serialVersionUID = -70687225L;
@RequestParameter("user")
private String user;//url中的{user}值
@RequestParameter("project")
private String project;//url中的{project}值
@Text
@HtmlField(cssPath=".repository-meta-content")
private String title;//抽取頁(yè)面中的title
@Text
@HtmlField(cssPath=".pagehead-actions li:nth-child(2) .social-count")
private int star;//抽取頁(yè)面中的star
@Text
@HtmlField(cssPath=".pagehead-actions li:nth-child(3) .social-count")
private int fork;//抽取頁(yè)面中的fork
@Html
@HtmlField(cssPath=".entry-content")
private String readme;//抽取頁(yè)面中的readme
public String getReadme() {
return readme;
}
public void setReadme(String readme) {
this.readme = readme;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getProject() {
return project;
}
public void setProject(String project) {
this.project = project;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getStar() {
return star;
}
public void setStar(int star) {
this.star = star;
}
public int getFork() {
return fork;
}
public void setFork(int fork) {
this.fork = fork;
}
public static void main(String[] args) {
GeccoEngine.create()
//工程的包路徑
.classpath("com.geccocrawler.gecco.demo")
//開(kāi)始抓取的頁(yè)面地址
.start("")
//開(kāi)啟幾個(gè)爬蟲(chóng)線(xiàn)程
.thread(1)
//單個(gè)爬蟲(chóng)每次抓取完一個(gè)請求后的間隔時(shí)間
.interval(2000)
//循環(huán)抓取
.loop(true)
//使用pc端userAgent
.mobile(false)
//開(kāi)始運行
.run();
}
}
DynamicGecco的目的是在不定義SpiderBean的情況下實(shí)現爬取規則的運行時(shí)配置。其實(shí)現原理是采用字節碼編程,動(dòng)態(tài)生成SpiderBean,而且通過(guò)自定義的GeccoClassLoader實(shí)現了抓取規則的熱布署。下面是一個(gè)簡(jiǎn)單Demo,更復雜的Demo可以參考com.geccocrawler.gecco.demo.dynamic下的反例。
下面的代碼實(shí)現了爬取規則的運行時(shí)配置:
DynamicGecco.html()
.gecco("{user}/{project}", "consolePipeline")
.requestField("request").request().build()
.stringField("user").requestParameter("user").build()
.stringField("project").requestParameter().build()
.stringField("title").csspath(".repository-meta-content").text(false).build()
.intField("star").csspath(".pagehead-actions li:nth-child(2) .social-count").text(false).build()
.intField("fork").csspath(".pagehead-actions li:nth-child(3) .social-count").text().build()
.stringField("contributors").csspath("ul.numbers-summary > li:nth-child(4) > a").href().build()
.register();
//開(kāi)始抓取
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo")
.start("")
.run();
可以看見(jiàn)爬蟲(chóng)框架,DynamicGecco的方法相比傳統的注解形式代碼量大大降低,而且太酷的一點(diǎn)是DynamicGecco支持運行時(shí)定義和更改規則。
請遵循開(kāi)源協(xié)議MIT
干貨丨推薦八款高效率的爬蟲(chóng)框架,你用過(guò)幾個(gè)?
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 436 次瀏覽 ? 2020-05-24 08:01
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ù)是透明的。
BillyYang
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 331 次瀏覽 ? 2020-05-08 08:03
有人抓取,就會(huì )有人想要防御。網(wǎng)絡(luò )爬蟲(chóng)在運行過(guò)程中也會(huì )碰到反爬蟲(chóng)策略。常見(jiàn)的有:
這些只是傳統的反爬蟲(chóng)手段,隨著(zhù)AI時(shí)代的到來(lái),也會(huì )有更先進(jìn)的手段的到來(lái)。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Reptile {
public static void main(String[] args) {
// 傳入你所要爬取的頁(yè)面地址
String url1 = "http://www.xxxx.com.cn/";
// 創(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 跟 StringBuffer
// 的區別前者不是可變的后者是可變的;
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();
}
}
}
示例剖析:
輸入想要爬取的url地址;發(fā)送網(wǎng)路懇求獲取頁(yè)面內容;使用jsoup解析dom;獲取須要的數據,輸出到控制臺。
設計框架的目的就是將這種流程統一化,將通用的功能進(jìn)行具象,減少重復工作。設計網(wǎng)路爬蟲(chóng)框架須要什么組件呢?
url管理;網(wǎng)頁(yè)下載器;爬蟲(chóng)調度器;網(wǎng)頁(yè)解析器;數據處理器。
爬蟲(chóng)框架要處理好多的 URL,我們須要設計一個(gè)隊列儲存所有要處理的 URL,這種先進(jìn)先出的數據結構十分符合這個(gè)需求。 將所有要下載的 URL 存儲在待處理隊列中,每次下載會(huì )取出一個(gè),隊列中還會(huì )少一個(gè)。我們曉得有些 URL 的下載會(huì )有反爬蟲(chóng)策略, 所以針對那些懇求須要做一些特殊的設置,進(jìn)而可以對 URL 進(jìn)行封裝抽出 Request。
如果沒(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è)下載組件置為可替換,提供默認的即可。
調度器和我們在開(kāi)發(fā) web 應用中的控制器是一個(gè)類(lèi)似的概念,它用于在下載器、解析器之間做流轉處理。 解析器可以解析到更多的 URL 發(fā)送給調度器,調度器再度的傳輸給下載器,這樣才會(huì )使各個(gè)組件有條不紊的進(jìn)行工作。
我們曉得當一個(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),可能是封裝成對象。 然后傳遞給數據處理器,處理器接收到數據后可能是儲存到數據庫網(wǎng)絡(luò )爬蟲(chóng),也可能通過(guò)插口發(fā)送給老王。
上面說(shuō)了這么多,我們設計的爬蟲(chóng)框架有以下幾個(gè)特點(diǎn),沒(méi)有做到大而全,可以稱(chēng)得上輕量迷你很好用。 查看全部
網(wǎng)絡(luò )爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò )機器人,在FOAF社區中間,更時(shí)不時(shí)的稱(chēng)為網(wǎng)頁(yè)追逐者)網(wǎng)絡(luò )爬蟲(chóng),是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本。另外一些不常使用的名子還有螞蟻、自動(dòng)索引、模擬程序或則蠕蟲(chóng)。
有人抓取,就會(huì )有人想要防御。網(wǎng)絡(luò )爬蟲(chóng)在運行過(guò)程中也會(huì )碰到反爬蟲(chóng)策略。常見(jiàn)的有:
這些只是傳統的反爬蟲(chóng)手段,隨著(zhù)AI時(shí)代的到來(lái),也會(huì )有更先進(jìn)的手段的到來(lái)。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Reptile {
public static void main(String[] args) {
// 傳入你所要爬取的頁(yè)面地址
String url1 = "http://www.xxxx.com.cn/";
// 創(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 跟 StringBuffer
// 的區別前者不是可變的后者是可變的;
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();
}
}
}
示例剖析:
輸入想要爬取的url地址;發(fā)送網(wǎng)路懇求獲取頁(yè)面內容;使用jsoup解析dom;獲取須要的數據,輸出到控制臺。
設計框架的目的就是將這種流程統一化,將通用的功能進(jìn)行具象,減少重復工作。設計網(wǎng)路爬蟲(chóng)框架須要什么組件呢?
url管理;網(wǎng)頁(yè)下載器;爬蟲(chóng)調度器;網(wǎng)頁(yè)解析器;數據處理器。
爬蟲(chóng)框架要處理好多的 URL,我們須要設計一個(gè)隊列儲存所有要處理的 URL,這種先進(jìn)先出的數據結構十分符合這個(gè)需求。 將所有要下載的 URL 存儲在待處理隊列中,每次下載會(huì )取出一個(gè),隊列中還會(huì )少一個(gè)。我們曉得有些 URL 的下載會(huì )有反爬蟲(chóng)策略, 所以針對那些懇求須要做一些特殊的設置,進(jìn)而可以對 URL 進(jìn)行封裝抽出 Request。
如果沒(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è)下載組件置為可替換,提供默認的即可。
調度器和我們在開(kāi)發(fā) web 應用中的控制器是一個(gè)類(lèi)似的概念,它用于在下載器、解析器之間做流轉處理。 解析器可以解析到更多的 URL 發(fā)送給調度器,調度器再度的傳輸給下載器,這樣才會(huì )使各個(gè)組件有條不紊的進(jìn)行工作。
我們曉得當一個(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),可能是封裝成對象。 然后傳遞給數據處理器,處理器接收到數據后可能是儲存到數據庫網(wǎng)絡(luò )爬蟲(chóng),也可能通過(guò)插口發(fā)送給老王。
上面說(shuō)了這么多,我們設計的爬蟲(chóng)框架有以下幾個(gè)特點(diǎn),沒(méi)有做到大而全,可以稱(chēng)得上輕量迷你很好用。
高拓展性的Java多線(xiàn)程爬蟲(chóng)框架reptile(個(gè)人開(kāi)源項目)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 341 次瀏覽 ? 2020-05-07 08:03
Reptile.png
Reptile作為爬蟲(chóng)主體可在主線(xiàn)程運行也可以異步運行,爬蟲(chóng)主要有四個(gè)核心組件:
Downloader 執行懇求下載與解析響應ResponseHandler 由使用者提供實(shí)現來(lái)對響應處理,生成Result結果與新的爬取懇求RequestConsumer 來(lái)對處理的結果Result進(jìn)行消費,例如持久化儲存java單機爬蟲(chóng)框架,用戶(hù)可自定義其具體實(shí)現
四個(gè)組件之間的關(guān)系如構架圖所示,它們之間的相互調用產(chǎn)生一個(gè)完整的工作流并在Workflow線(xiàn)程中運行,Reptile爬蟲(chóng)會(huì )依照配置的線(xiàn)程數目通過(guò)線(xiàn)程池創(chuàng )建指定數目的工作流線(xiàn)程并發(fā)執行工作流任務(wù)。
clone項目并建立發(fā)布到本地庫房
git clone git@github.com:xiepuhuan/reptile.git
cd reptile
mvn -Dmaven.test.skip=true
在項目中使用Maven引入對應的依賴(lài)
<dependency>
<groupId>com.xiepuhuan</groupId>
<artifactId>reptile</artifactId>
<version>0.3</version>
</dependency>
實(shí)現ResponseHandler插口,重寫(xiě)isSupport與handle技巧。實(shí)現Consumer插口java單機爬蟲(chóng)框架,重寫(xiě)consume方式,執行對數據的消費,可在該方式中對響應處理結果進(jìn)行持久化等操作,目前提供了ConsoleConsumer,JsonFileConsumer, MongoDBConsumer等實(shí)現,默認使用ConsoleConsumer。
public class ZhihuPageHandler implements ResponseHandler {
private static final String[] URLS = new String[] {
"https://www.zhihu.com/api/v4/s ... ot%3B
};
@Override
public List<Request> handle(Response response, Result result) {
Content content = response.getContent();
JSONObject jsonObject = JSON.parseObject(content.getContent(), JSONObject.class);
result.setResults(jsonObject.getInnerMap());
JSONObject paging = jsonObject.getJSONObject("paging");
if (!paging.getBoolean("is_end")) {
List<Request> requests = new ArrayList<>();
requests.add(new Request(paging.getString("next")));
return requests;
}
return null;
}
@Override
public boolean isSupport(Request request, Response response) {
return true;
}
public static void main(String[] args) {
// 構建Reptile爬蟲(chóng)配置類(lèi),
ReptileConfig config = ReptileConfig.Builder.cutom()
.setThreadCount(8)
.appendResponseHandlers(new ZhihuPageHandler())
.setDeploymentMode(DeploymentModeEnum.SINGLE)
.setConsumer(new ConsoleConsumer())
.build();
// 根據reptile配置構建Reptile爬蟲(chóng)并添加爬去的URL
Reptile reptile = Reptile.create(config).addUrls(URLS);
// 啟動(dòng)爬蟲(chóng)
reptile.start();
}
}
分布式布署時(shí),創(chuàng )建配置類(lèi)時(shí)須要通過(guò)setDeploymentMode方式指定布署模式為DeploymentModeEnum.Distributed,并且須要通過(guò)setScheduler方式設置一個(gè)Redis隊列調度器,可以使用RedisFIFOQueueScheduler作為實(shí)現。 查看全部
Reptile是一個(gè)具有高拓展性的可支持單機與集群布署Java多線(xiàn)程爬蟲(chóng)框架,該框架可簡(jiǎn)化爬蟲(chóng)的開(kāi)發(fā)流程。該框架各個(gè)組件高內聚松耦合的特點(diǎn)使用戶(hù)可以對不同組件進(jìn)行訂制來(lái)滿(mǎn)足不同的需求。

Reptile.png
Reptile作為爬蟲(chóng)主體可在主線(xiàn)程運行也可以異步運行,爬蟲(chóng)主要有四個(gè)核心組件:
Downloader 執行懇求下載與解析響應ResponseHandler 由使用者提供實(shí)現來(lái)對響應處理,生成Result結果與新的爬取懇求RequestConsumer 來(lái)對處理的結果Result進(jìn)行消費,例如持久化儲存java單機爬蟲(chóng)框架,用戶(hù)可自定義其具體實(shí)現
四個(gè)組件之間的關(guān)系如構架圖所示,它們之間的相互調用產(chǎn)生一個(gè)完整的工作流并在Workflow線(xiàn)程中運行,Reptile爬蟲(chóng)會(huì )依照配置的線(xiàn)程數目通過(guò)線(xiàn)程池創(chuàng )建指定數目的工作流線(xiàn)程并發(fā)執行工作流任務(wù)。
clone項目并建立發(fā)布到本地庫房
git clone git@github.com:xiepuhuan/reptile.git
cd reptile
mvn -Dmaven.test.skip=true
在項目中使用Maven引入對應的依賴(lài)
<dependency>
<groupId>com.xiepuhuan</groupId>
<artifactId>reptile</artifactId>
<version>0.3</version>
</dependency>
實(shí)現ResponseHandler插口,重寫(xiě)isSupport與handle技巧。實(shí)現Consumer插口java單機爬蟲(chóng)框架,重寫(xiě)consume方式,執行對數據的消費,可在該方式中對響應處理結果進(jìn)行持久化等操作,目前提供了ConsoleConsumer,JsonFileConsumer, MongoDBConsumer等實(shí)現,默認使用ConsoleConsumer。
public class ZhihuPageHandler implements ResponseHandler {
private static final String[] URLS = new String[] {
"https://www.zhihu.com/api/v4/s ... ot%3B
};
@Override
public List<Request> handle(Response response, Result result) {
Content content = response.getContent();
JSONObject jsonObject = JSON.parseObject(content.getContent(), JSONObject.class);
result.setResults(jsonObject.getInnerMap());
JSONObject paging = jsonObject.getJSONObject("paging");
if (!paging.getBoolean("is_end")) {
List<Request> requests = new ArrayList<>();
requests.add(new Request(paging.getString("next")));
return requests;
}
return null;
}
@Override
public boolean isSupport(Request request, Response response) {
return true;
}
public static void main(String[] args) {
// 構建Reptile爬蟲(chóng)配置類(lèi),
ReptileConfig config = ReptileConfig.Builder.cutom()
.setThreadCount(8)
.appendResponseHandlers(new ZhihuPageHandler())
.setDeploymentMode(DeploymentModeEnum.SINGLE)
.setConsumer(new ConsoleConsumer())
.build();
// 根據reptile配置構建Reptile爬蟲(chóng)并添加爬去的URL
Reptile reptile = Reptile.create(config).addUrls(URLS);
// 啟動(dòng)爬蟲(chóng)
reptile.start();
}
}
分布式布署時(shí),創(chuàng )建配置類(lèi)時(shí)須要通過(guò)setDeploymentMode方式指定布署模式為DeploymentModeEnum.Distributed,并且須要通過(guò)setScheduler方式設置一個(gè)Redis隊列調度器,可以使用RedisFIFOQueueScheduler作為實(shí)現。
如何完整寫(xiě)一個(gè)爬蟲(chóng)框架
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 431 次瀏覽 ? 2020-05-03 08:02
本文主要為你們分享一篇怎么完整寫(xiě)一個(gè)爬蟲(chóng)框架的懇求方式,具有挺好的參考價(jià)值,希望對你們有所幫助。一起追隨小編過(guò)來(lái)瞧瞧吧爬蟲(chóng)框架,希望能幫助到你們。
產(chǎn)生爬蟲(chóng)框架:
1、建立一個(gè)scrapy爬蟲(chóng)工程
2、在工程中形成一個(gè)scrapy爬蟲(chóng)
3、配置spider爬蟲(chóng)
4、運行爬蟲(chóng),獲取網(wǎng)頁(yè)
具體操作:
1、建立工程
定義一個(gè)工程,名稱(chēng)為:python123demo
方法:
在cmd中,d: 步入盤(pán)符, cd pycodes 步入文件pycodes
然后輸入
scrapy startproject python123demo
在pycodes中會(huì )生成一個(gè)文件:
_init_.py不需要用戶(hù)編撰
2、在工程中形成一個(gè)scrapy爬蟲(chóng)
執行一條命令,給出爬蟲(chóng)名子和爬取的網(wǎng)站
產(chǎn)生爬蟲(chóng):
生成一個(gè)名稱(chēng)為 demo 的spider
僅限生成 demo.py,其內容為:
name = 'demo' 當前爬蟲(chóng)名子為demo
allowed_domains = " 爬取該網(wǎng)站域名以下的鏈接,該域名由cmd命令臺輸入
start_urls = [] 爬取的初始頁(yè)面
parse()用于處理相應,解析內容產(chǎn)生字典,發(fā)現新的url爬取懇求
3、配置形成的spider爬蟲(chóng),使之滿(mǎn)足我們的需求
將解析的頁(yè)面保存成文件
修改demo.py文件
4、運行爬蟲(chóng),獲取網(wǎng)頁(yè)
打開(kāi)cmd輸入命令行進(jìn)行爬蟲(chóng)
然后我的筆記本上出現了一個(gè)錯誤
windows系統上出現這個(gè)問(wèn)題的解決須要安裝Py32Win模塊,但是直接通過(guò)官網(wǎng)鏈接裝exe會(huì )出現幾百個(gè)錯誤,更方便的做法是
pip3 install pypiwin32
這是py3的解決方案
注意:py3版本假如用 pip install pypiwin32指令會(huì )發(fā)生錯誤
安裝完成后,重新進(jìn)行爬蟲(chóng)爬蟲(chóng)框架,成功!撒花!
捕獲頁(yè)面儲存在 demo.html文件中
demo.py 所對應的完整代碼:
兩版本等價(jià):
以上就是怎么完整寫(xiě)一個(gè)爬蟲(chóng)框架的詳盡內容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章! 查看全部

本文主要為你們分享一篇怎么完整寫(xiě)一個(gè)爬蟲(chóng)框架的懇求方式,具有挺好的參考價(jià)值,希望對你們有所幫助。一起追隨小編過(guò)來(lái)瞧瞧吧爬蟲(chóng)框架,希望能幫助到你們。
產(chǎn)生爬蟲(chóng)框架:
1、建立一個(gè)scrapy爬蟲(chóng)工程
2、在工程中形成一個(gè)scrapy爬蟲(chóng)
3、配置spider爬蟲(chóng)
4、運行爬蟲(chóng),獲取網(wǎng)頁(yè)
具體操作:
1、建立工程
定義一個(gè)工程,名稱(chēng)為:python123demo
方法:
在cmd中,d: 步入盤(pán)符, cd pycodes 步入文件pycodes
然后輸入
scrapy startproject python123demo
在pycodes中會(huì )生成一個(gè)文件:


_init_.py不需要用戶(hù)編撰


2、在工程中形成一個(gè)scrapy爬蟲(chóng)
執行一條命令,給出爬蟲(chóng)名子和爬取的網(wǎng)站
產(chǎn)生爬蟲(chóng):

生成一個(gè)名稱(chēng)為 demo 的spider
僅限生成 demo.py,其內容為:

name = 'demo' 當前爬蟲(chóng)名子為demo
allowed_domains = " 爬取該網(wǎng)站域名以下的鏈接,該域名由cmd命令臺輸入
start_urls = [] 爬取的初始頁(yè)面
parse()用于處理相應,解析內容產(chǎn)生字典,發(fā)現新的url爬取懇求
3、配置形成的spider爬蟲(chóng),使之滿(mǎn)足我們的需求
將解析的頁(yè)面保存成文件
修改demo.py文件

4、運行爬蟲(chóng),獲取網(wǎng)頁(yè)
打開(kāi)cmd輸入命令行進(jìn)行爬蟲(chóng)

然后我的筆記本上出現了一個(gè)錯誤

windows系統上出現這個(gè)問(wèn)題的解決須要安裝Py32Win模塊,但是直接通過(guò)官網(wǎng)鏈接裝exe會(huì )出現幾百個(gè)錯誤,更方便的做法是
pip3 install pypiwin32
這是py3的解決方案
注意:py3版本假如用 pip install pypiwin32指令會(huì )發(fā)生錯誤
安裝完成后,重新進(jìn)行爬蟲(chóng)爬蟲(chóng)框架,成功!撒花!

捕獲頁(yè)面儲存在 demo.html文件中

demo.py 所對應的完整代碼:

兩版本等價(jià):

以上就是怎么完整寫(xiě)一個(gè)爬蟲(chóng)框架的詳盡內容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!
Gecco爬蟲(chóng)框架官網(wǎng)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 463 次瀏覽 ? 2020-06-09 10:24
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)行設計爬蟲(chóng)框架,對更改關(guān)掉、對擴充開(kāi)放。同時(shí)Gecco基于非常開(kāi)放的MIT開(kāi)源協(xié)議,無(wú)論你是使用者還是希望共同建立Gecco的開(kāi)發(fā)者,歡迎pull request。如果你喜歡這款爬蟲(chóng)框架請star 或者 fork!
@Gecco(matchUrl="{user}/{project}", pipelines="consolePipeline")
public class MyGithub implements HtmlBean {
private static final long serialVersionUID = -70687225L;
@RequestParameter("user")
private String user;//url中的{user}值
@RequestParameter("project")
private String project;//url中的{project}值
@Text
@HtmlField(cssPath=".repository-meta-content")
private String title;//抽取頁(yè)面中的title
@Text
@HtmlField(cssPath=".pagehead-actions li:nth-child(2) .social-count")
private int star;//抽取頁(yè)面中的star
@Text
@HtmlField(cssPath=".pagehead-actions li:nth-child(3) .social-count")
private int fork;//抽取頁(yè)面中的fork
@Html
@HtmlField(cssPath=".entry-content")
private String readme;//抽取頁(yè)面中的readme
public String getReadme() {
return readme;
}
public void setReadme(String readme) {
this.readme = readme;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getProject() {
return project;
}
public void setProject(String project) {
this.project = project;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getStar() {
return star;
}
public void setStar(int star) {
this.star = star;
}
public int getFork() {
return fork;
}
public void setFork(int fork) {
this.fork = fork;
}
public static void main(String[] args) {
GeccoEngine.create()
//工程的包路徑
.classpath("com.geccocrawler.gecco.demo")
//開(kāi)始抓取的頁(yè)面地址
.start("")
//開(kāi)啟幾個(gè)爬蟲(chóng)線(xiàn)程
.thread(1)
//單個(gè)爬蟲(chóng)每次抓取完一個(gè)請求后的間隔時(shí)間
.interval(2000)
//循環(huán)抓取
.loop(true)
//使用pc端userAgent
.mobile(false)
//開(kāi)始運行
.run();
}
}
DynamicGecco的目的是在不定義SpiderBean的情況下實(shí)現爬取規則的運行時(shí)配置。其實(shí)現原理是采用字節碼編程,動(dòng)態(tài)生成SpiderBean,而且通過(guò)自定義的GeccoClassLoader實(shí)現了抓取規則的熱布署。下面是一個(gè)簡(jiǎn)單Demo,更復雜的Demo可以參考com.geccocrawler.gecco.demo.dynamic下的反例。
下面的代碼實(shí)現了爬取規則的運行時(shí)配置:
DynamicGecco.html()
.gecco("{user}/{project}", "consolePipeline")
.requestField("request").request().build()
.stringField("user").requestParameter("user").build()
.stringField("project").requestParameter().build()
.stringField("title").csspath(".repository-meta-content").text(false).build()
.intField("star").csspath(".pagehead-actions li:nth-child(2) .social-count").text(false).build()
.intField("fork").csspath(".pagehead-actions li:nth-child(3) .social-count").text().build()
.stringField("contributors").csspath("ul.numbers-summary > li:nth-child(4) > a").href().build()
.register();
//開(kāi)始抓取
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo")
.start("")
.run();
可以看見(jiàn)爬蟲(chóng)框架,DynamicGecco的方法相比傳統的注解形式代碼量大大降低,而且太酷的一點(diǎn)是DynamicGecco支持運行時(shí)定義和更改規則。
請遵循開(kāi)源協(xié)議MIT 查看全部

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)行設計爬蟲(chóng)框架,對更改關(guān)掉、對擴充開(kāi)放。同時(shí)Gecco基于非常開(kāi)放的MIT開(kāi)源協(xié)議,無(wú)論你是使用者還是希望共同建立Gecco的開(kāi)發(fā)者,歡迎pull request。如果你喜歡這款爬蟲(chóng)框架請star 或者 fork!
@Gecco(matchUrl="{user}/{project}", pipelines="consolePipeline")
public class MyGithub implements HtmlBean {
private static final long serialVersionUID = -70687225L;
@RequestParameter("user")
private String user;//url中的{user}值
@RequestParameter("project")
private String project;//url中的{project}值
@Text
@HtmlField(cssPath=".repository-meta-content")
private String title;//抽取頁(yè)面中的title
@Text
@HtmlField(cssPath=".pagehead-actions li:nth-child(2) .social-count")
private int star;//抽取頁(yè)面中的star
@Text
@HtmlField(cssPath=".pagehead-actions li:nth-child(3) .social-count")
private int fork;//抽取頁(yè)面中的fork
@Html
@HtmlField(cssPath=".entry-content")
private String readme;//抽取頁(yè)面中的readme
public String getReadme() {
return readme;
}
public void setReadme(String readme) {
this.readme = readme;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getProject() {
return project;
}
public void setProject(String project) {
this.project = project;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getStar() {
return star;
}
public void setStar(int star) {
this.star = star;
}
public int getFork() {
return fork;
}
public void setFork(int fork) {
this.fork = fork;
}
public static void main(String[] args) {
GeccoEngine.create()
//工程的包路徑
.classpath("com.geccocrawler.gecco.demo")
//開(kāi)始抓取的頁(yè)面地址
.start("")
//開(kāi)啟幾個(gè)爬蟲(chóng)線(xiàn)程
.thread(1)
//單個(gè)爬蟲(chóng)每次抓取完一個(gè)請求后的間隔時(shí)間
.interval(2000)
//循環(huán)抓取
.loop(true)
//使用pc端userAgent
.mobile(false)
//開(kāi)始運行
.run();
}
}
DynamicGecco的目的是在不定義SpiderBean的情況下實(shí)現爬取規則的運行時(shí)配置。其實(shí)現原理是采用字節碼編程,動(dòng)態(tài)生成SpiderBean,而且通過(guò)自定義的GeccoClassLoader實(shí)現了抓取規則的熱布署。下面是一個(gè)簡(jiǎn)單Demo,更復雜的Demo可以參考com.geccocrawler.gecco.demo.dynamic下的反例。
下面的代碼實(shí)現了爬取規則的運行時(shí)配置:
DynamicGecco.html()
.gecco("{user}/{project}", "consolePipeline")
.requestField("request").request().build()
.stringField("user").requestParameter("user").build()
.stringField("project").requestParameter().build()
.stringField("title").csspath(".repository-meta-content").text(false).build()
.intField("star").csspath(".pagehead-actions li:nth-child(2) .social-count").text(false).build()
.intField("fork").csspath(".pagehead-actions li:nth-child(3) .social-count").text().build()
.stringField("contributors").csspath("ul.numbers-summary > li:nth-child(4) > a").href().build()
.register();
//開(kāi)始抓取
GeccoEngine.create()
.classpath("com.geccocrawler.gecco.demo")
.start("")
.run();
可以看見(jiàn)爬蟲(chóng)框架,DynamicGecco的方法相比傳統的注解形式代碼量大大降低,而且太酷的一點(diǎn)是DynamicGecco支持運行時(shí)定義和更改規則。
請遵循開(kāi)源協(xié)議MIT
干貨丨推薦八款高效率的爬蟲(chóng)框架,你用過(guò)幾個(gè)?
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 436 次瀏覽 ? 2020-05-24 08:01
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ù)是透明的。
BillyYang
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 331 次瀏覽 ? 2020-05-08 08:03
有人抓取,就會(huì )有人想要防御。網(wǎng)絡(luò )爬蟲(chóng)在運行過(guò)程中也會(huì )碰到反爬蟲(chóng)策略。常見(jiàn)的有:
這些只是傳統的反爬蟲(chóng)手段,隨著(zhù)AI時(shí)代的到來(lái),也會(huì )有更先進(jìn)的手段的到來(lái)。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Reptile {
public static void main(String[] args) {
// 傳入你所要爬取的頁(yè)面地址
String url1 = "http://www.xxxx.com.cn/";
// 創(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 跟 StringBuffer
// 的區別前者不是可變的后者是可變的;
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();
}
}
}
示例剖析:
輸入想要爬取的url地址;發(fā)送網(wǎng)路懇求獲取頁(yè)面內容;使用jsoup解析dom;獲取須要的數據,輸出到控制臺。
設計框架的目的就是將這種流程統一化,將通用的功能進(jìn)行具象,減少重復工作。設計網(wǎng)路爬蟲(chóng)框架須要什么組件呢?
url管理;網(wǎng)頁(yè)下載器;爬蟲(chóng)調度器;網(wǎng)頁(yè)解析器;數據處理器。
爬蟲(chóng)框架要處理好多的 URL,我們須要設計一個(gè)隊列儲存所有要處理的 URL,這種先進(jìn)先出的數據結構十分符合這個(gè)需求。 將所有要下載的 URL 存儲在待處理隊列中,每次下載會(huì )取出一個(gè),隊列中還會(huì )少一個(gè)。我們曉得有些 URL 的下載會(huì )有反爬蟲(chóng)策略, 所以針對那些懇求須要做一些特殊的設置,進(jìn)而可以對 URL 進(jìn)行封裝抽出 Request。
如果沒(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è)下載組件置為可替換,提供默認的即可。
調度器和我們在開(kāi)發(fā) web 應用中的控制器是一個(gè)類(lèi)似的概念,它用于在下載器、解析器之間做流轉處理。 解析器可以解析到更多的 URL 發(fā)送給調度器,調度器再度的傳輸給下載器,這樣才會(huì )使各個(gè)組件有條不紊的進(jìn)行工作。
我們曉得當一個(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),可能是封裝成對象。 然后傳遞給數據處理器,處理器接收到數據后可能是儲存到數據庫網(wǎng)絡(luò )爬蟲(chóng),也可能通過(guò)插口發(fā)送給老王。
上面說(shuō)了這么多,我們設計的爬蟲(chóng)框架有以下幾個(gè)特點(diǎn),沒(méi)有做到大而全,可以稱(chēng)得上輕量迷你很好用。 查看全部
網(wǎng)絡(luò )爬蟲(chóng)(又被稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò )機器人,在FOAF社區中間,更時(shí)不時(shí)的稱(chēng)為網(wǎng)頁(yè)追逐者)網(wǎng)絡(luò )爬蟲(chóng),是一種根據一定的規則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或則腳本。另外一些不常使用的名子還有螞蟻、自動(dòng)索引、模擬程序或則蠕蟲(chóng)。
有人抓取,就會(huì )有人想要防御。網(wǎng)絡(luò )爬蟲(chóng)在運行過(guò)程中也會(huì )碰到反爬蟲(chóng)策略。常見(jiàn)的有:
這些只是傳統的反爬蟲(chóng)手段,隨著(zhù)AI時(shí)代的到來(lái),也會(huì )有更先進(jìn)的手段的到來(lái)。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Reptile {
public static void main(String[] args) {
// 傳入你所要爬取的頁(yè)面地址
String url1 = "http://www.xxxx.com.cn/";
// 創(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 跟 StringBuffer
// 的區別前者不是可變的后者是可變的;
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();
}
}
}
示例剖析:
輸入想要爬取的url地址;發(fā)送網(wǎng)路懇求獲取頁(yè)面內容;使用jsoup解析dom;獲取須要的數據,輸出到控制臺。
設計框架的目的就是將這種流程統一化,將通用的功能進(jìn)行具象,減少重復工作。設計網(wǎng)路爬蟲(chóng)框架須要什么組件呢?
url管理;網(wǎng)頁(yè)下載器;爬蟲(chóng)調度器;網(wǎng)頁(yè)解析器;數據處理器。
爬蟲(chóng)框架要處理好多的 URL,我們須要設計一個(gè)隊列儲存所有要處理的 URL,這種先進(jìn)先出的數據結構十分符合這個(gè)需求。 將所有要下載的 URL 存儲在待處理隊列中,每次下載會(huì )取出一個(gè),隊列中還會(huì )少一個(gè)。我們曉得有些 URL 的下載會(huì )有反爬蟲(chóng)策略, 所以針對那些懇求須要做一些特殊的設置,進(jìn)而可以對 URL 進(jìn)行封裝抽出 Request。
如果沒(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è)下載組件置為可替換,提供默認的即可。
調度器和我們在開(kāi)發(fā) web 應用中的控制器是一個(gè)類(lèi)似的概念,它用于在下載器、解析器之間做流轉處理。 解析器可以解析到更多的 URL 發(fā)送給調度器,調度器再度的傳輸給下載器,這樣才會(huì )使各個(gè)組件有條不紊的進(jìn)行工作。
我們曉得當一個(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),可能是封裝成對象。 然后傳遞給數據處理器,處理器接收到數據后可能是儲存到數據庫網(wǎng)絡(luò )爬蟲(chóng),也可能通過(guò)插口發(fā)送給老王。
上面說(shuō)了這么多,我們設計的爬蟲(chóng)框架有以下幾個(gè)特點(diǎn),沒(méi)有做到大而全,可以稱(chēng)得上輕量迷你很好用。
高拓展性的Java多線(xiàn)程爬蟲(chóng)框架reptile(個(gè)人開(kāi)源項目)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 341 次瀏覽 ? 2020-05-07 08:03
Reptile.png
Reptile作為爬蟲(chóng)主體可在主線(xiàn)程運行也可以異步運行,爬蟲(chóng)主要有四個(gè)核心組件:
Downloader 執行懇求下載與解析響應ResponseHandler 由使用者提供實(shí)現來(lái)對響應處理,生成Result結果與新的爬取懇求RequestConsumer 來(lái)對處理的結果Result進(jìn)行消費,例如持久化儲存java單機爬蟲(chóng)框架,用戶(hù)可自定義其具體實(shí)現
四個(gè)組件之間的關(guān)系如構架圖所示,它們之間的相互調用產(chǎn)生一個(gè)完整的工作流并在Workflow線(xiàn)程中運行,Reptile爬蟲(chóng)會(huì )依照配置的線(xiàn)程數目通過(guò)線(xiàn)程池創(chuàng )建指定數目的工作流線(xiàn)程并發(fā)執行工作流任務(wù)。
clone項目并建立發(fā)布到本地庫房
git clone git@github.com:xiepuhuan/reptile.git
cd reptile
mvn -Dmaven.test.skip=true
在項目中使用Maven引入對應的依賴(lài)
<dependency>
<groupId>com.xiepuhuan</groupId>
<artifactId>reptile</artifactId>
<version>0.3</version>
</dependency>
實(shí)現ResponseHandler插口,重寫(xiě)isSupport與handle技巧。實(shí)現Consumer插口java單機爬蟲(chóng)框架,重寫(xiě)consume方式,執行對數據的消費,可在該方式中對響應處理結果進(jìn)行持久化等操作,目前提供了ConsoleConsumer,JsonFileConsumer, MongoDBConsumer等實(shí)現,默認使用ConsoleConsumer。
public class ZhihuPageHandler implements ResponseHandler {
private static final String[] URLS = new String[] {
"https://www.zhihu.com/api/v4/s ... ot%3B
};
@Override
public List<Request> handle(Response response, Result result) {
Content content = response.getContent();
JSONObject jsonObject = JSON.parseObject(content.getContent(), JSONObject.class);
result.setResults(jsonObject.getInnerMap());
JSONObject paging = jsonObject.getJSONObject("paging");
if (!paging.getBoolean("is_end")) {
List<Request> requests = new ArrayList<>();
requests.add(new Request(paging.getString("next")));
return requests;
}
return null;
}
@Override
public boolean isSupport(Request request, Response response) {
return true;
}
public static void main(String[] args) {
// 構建Reptile爬蟲(chóng)配置類(lèi),
ReptileConfig config = ReptileConfig.Builder.cutom()
.setThreadCount(8)
.appendResponseHandlers(new ZhihuPageHandler())
.setDeploymentMode(DeploymentModeEnum.SINGLE)
.setConsumer(new ConsoleConsumer())
.build();
// 根據reptile配置構建Reptile爬蟲(chóng)并添加爬去的URL
Reptile reptile = Reptile.create(config).addUrls(URLS);
// 啟動(dòng)爬蟲(chóng)
reptile.start();
}
}
分布式布署時(shí),創(chuàng )建配置類(lèi)時(shí)須要通過(guò)setDeploymentMode方式指定布署模式為DeploymentModeEnum.Distributed,并且須要通過(guò)setScheduler方式設置一個(gè)Redis隊列調度器,可以使用RedisFIFOQueueScheduler作為實(shí)現。 查看全部
Reptile是一個(gè)具有高拓展性的可支持單機與集群布署Java多線(xiàn)程爬蟲(chóng)框架,該框架可簡(jiǎn)化爬蟲(chóng)的開(kāi)發(fā)流程。該框架各個(gè)組件高內聚松耦合的特點(diǎn)使用戶(hù)可以對不同組件進(jìn)行訂制來(lái)滿(mǎn)足不同的需求。

Reptile.png
Reptile作為爬蟲(chóng)主體可在主線(xiàn)程運行也可以異步運行,爬蟲(chóng)主要有四個(gè)核心組件:
Downloader 執行懇求下載與解析響應ResponseHandler 由使用者提供實(shí)現來(lái)對響應處理,生成Result結果與新的爬取懇求RequestConsumer 來(lái)對處理的結果Result進(jìn)行消費,例如持久化儲存java單機爬蟲(chóng)框架,用戶(hù)可自定義其具體實(shí)現
四個(gè)組件之間的關(guān)系如構架圖所示,它們之間的相互調用產(chǎn)生一個(gè)完整的工作流并在Workflow線(xiàn)程中運行,Reptile爬蟲(chóng)會(huì )依照配置的線(xiàn)程數目通過(guò)線(xiàn)程池創(chuàng )建指定數目的工作流線(xiàn)程并發(fā)執行工作流任務(wù)。
clone項目并建立發(fā)布到本地庫房
git clone git@github.com:xiepuhuan/reptile.git
cd reptile
mvn -Dmaven.test.skip=true
在項目中使用Maven引入對應的依賴(lài)
<dependency>
<groupId>com.xiepuhuan</groupId>
<artifactId>reptile</artifactId>
<version>0.3</version>
</dependency>
實(shí)現ResponseHandler插口,重寫(xiě)isSupport與handle技巧。實(shí)現Consumer插口java單機爬蟲(chóng)框架,重寫(xiě)consume方式,執行對數據的消費,可在該方式中對響應處理結果進(jìn)行持久化等操作,目前提供了ConsoleConsumer,JsonFileConsumer, MongoDBConsumer等實(shí)現,默認使用ConsoleConsumer。
public class ZhihuPageHandler implements ResponseHandler {
private static final String[] URLS = new String[] {
"https://www.zhihu.com/api/v4/s ... ot%3B
};
@Override
public List<Request> handle(Response response, Result result) {
Content content = response.getContent();
JSONObject jsonObject = JSON.parseObject(content.getContent(), JSONObject.class);
result.setResults(jsonObject.getInnerMap());
JSONObject paging = jsonObject.getJSONObject("paging");
if (!paging.getBoolean("is_end")) {
List<Request> requests = new ArrayList<>();
requests.add(new Request(paging.getString("next")));
return requests;
}
return null;
}
@Override
public boolean isSupport(Request request, Response response) {
return true;
}
public static void main(String[] args) {
// 構建Reptile爬蟲(chóng)配置類(lèi),
ReptileConfig config = ReptileConfig.Builder.cutom()
.setThreadCount(8)
.appendResponseHandlers(new ZhihuPageHandler())
.setDeploymentMode(DeploymentModeEnum.SINGLE)
.setConsumer(new ConsoleConsumer())
.build();
// 根據reptile配置構建Reptile爬蟲(chóng)并添加爬去的URL
Reptile reptile = Reptile.create(config).addUrls(URLS);
// 啟動(dòng)爬蟲(chóng)
reptile.start();
}
}
分布式布署時(shí),創(chuàng )建配置類(lèi)時(shí)須要通過(guò)setDeploymentMode方式指定布署模式為DeploymentModeEnum.Distributed,并且須要通過(guò)setScheduler方式設置一個(gè)Redis隊列調度器,可以使用RedisFIFOQueueScheduler作為實(shí)現。
如何完整寫(xiě)一個(gè)爬蟲(chóng)框架
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 431 次瀏覽 ? 2020-05-03 08:02
本文主要為你們分享一篇怎么完整寫(xiě)一個(gè)爬蟲(chóng)框架的懇求方式,具有挺好的參考價(jià)值,希望對你們有所幫助。一起追隨小編過(guò)來(lái)瞧瞧吧爬蟲(chóng)框架,希望能幫助到你們。
產(chǎn)生爬蟲(chóng)框架:
1、建立一個(gè)scrapy爬蟲(chóng)工程
2、在工程中形成一個(gè)scrapy爬蟲(chóng)
3、配置spider爬蟲(chóng)
4、運行爬蟲(chóng),獲取網(wǎng)頁(yè)
具體操作:
1、建立工程
定義一個(gè)工程,名稱(chēng)為:python123demo
方法:
在cmd中,d: 步入盤(pán)符, cd pycodes 步入文件pycodes
然后輸入
scrapy startproject python123demo
在pycodes中會(huì )生成一個(gè)文件:
_init_.py不需要用戶(hù)編撰
2、在工程中形成一個(gè)scrapy爬蟲(chóng)
執行一條命令,給出爬蟲(chóng)名子和爬取的網(wǎng)站
產(chǎn)生爬蟲(chóng):
生成一個(gè)名稱(chēng)為 demo 的spider
僅限生成 demo.py,其內容為:
name = 'demo' 當前爬蟲(chóng)名子為demo
allowed_domains = " 爬取該網(wǎng)站域名以下的鏈接,該域名由cmd命令臺輸入
start_urls = [] 爬取的初始頁(yè)面
parse()用于處理相應,解析內容產(chǎn)生字典,發(fā)現新的url爬取懇求
3、配置形成的spider爬蟲(chóng),使之滿(mǎn)足我們的需求
將解析的頁(yè)面保存成文件
修改demo.py文件
4、運行爬蟲(chóng),獲取網(wǎng)頁(yè)
打開(kāi)cmd輸入命令行進(jìn)行爬蟲(chóng)
然后我的筆記本上出現了一個(gè)錯誤
windows系統上出現這個(gè)問(wèn)題的解決須要安裝Py32Win模塊,但是直接通過(guò)官網(wǎng)鏈接裝exe會(huì )出現幾百個(gè)錯誤,更方便的做法是
pip3 install pypiwin32
這是py3的解決方案
注意:py3版本假如用 pip install pypiwin32指令會(huì )發(fā)生錯誤
安裝完成后,重新進(jìn)行爬蟲(chóng)爬蟲(chóng)框架,成功!撒花!
捕獲頁(yè)面儲存在 demo.html文件中
demo.py 所對應的完整代碼:
兩版本等價(jià):
以上就是怎么完整寫(xiě)一個(gè)爬蟲(chóng)框架的詳盡內容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章! 查看全部

本文主要為你們分享一篇怎么完整寫(xiě)一個(gè)爬蟲(chóng)框架的懇求方式,具有挺好的參考價(jià)值,希望對你們有所幫助。一起追隨小編過(guò)來(lái)瞧瞧吧爬蟲(chóng)框架,希望能幫助到你們。
產(chǎn)生爬蟲(chóng)框架:
1、建立一個(gè)scrapy爬蟲(chóng)工程
2、在工程中形成一個(gè)scrapy爬蟲(chóng)
3、配置spider爬蟲(chóng)
4、運行爬蟲(chóng),獲取網(wǎng)頁(yè)
具體操作:
1、建立工程
定義一個(gè)工程,名稱(chēng)為:python123demo
方法:
在cmd中,d: 步入盤(pán)符, cd pycodes 步入文件pycodes
然后輸入
scrapy startproject python123demo
在pycodes中會(huì )生成一個(gè)文件:


_init_.py不需要用戶(hù)編撰


2、在工程中形成一個(gè)scrapy爬蟲(chóng)
執行一條命令,給出爬蟲(chóng)名子和爬取的網(wǎng)站
產(chǎn)生爬蟲(chóng):

生成一個(gè)名稱(chēng)為 demo 的spider
僅限生成 demo.py,其內容為:

name = 'demo' 當前爬蟲(chóng)名子為demo
allowed_domains = " 爬取該網(wǎng)站域名以下的鏈接,該域名由cmd命令臺輸入
start_urls = [] 爬取的初始頁(yè)面
parse()用于處理相應,解析內容產(chǎn)生字典,發(fā)現新的url爬取懇求
3、配置形成的spider爬蟲(chóng),使之滿(mǎn)足我們的需求
將解析的頁(yè)面保存成文件
修改demo.py文件

4、運行爬蟲(chóng),獲取網(wǎng)頁(yè)
打開(kāi)cmd輸入命令行進(jìn)行爬蟲(chóng)

然后我的筆記本上出現了一個(gè)錯誤

windows系統上出現這個(gè)問(wèn)題的解決須要安裝Py32Win模塊,但是直接通過(guò)官網(wǎng)鏈接裝exe會(huì )出現幾百個(gè)錯誤,更方便的做法是
pip3 install pypiwin32
這是py3的解決方案
注意:py3版本假如用 pip install pypiwin32指令會(huì )發(fā)生錯誤
安裝完成后,重新進(jìn)行爬蟲(chóng)爬蟲(chóng)框架,成功!撒花!

捕獲頁(yè)面儲存在 demo.html文件中

demo.py 所對應的完整代碼:

兩版本等價(jià):

以上就是怎么完整寫(xiě)一個(gè)爬蟲(chóng)框架的詳盡內容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


