crawler 爬蟲的基本結構

2022-08-23 19:42:12 字數 1730 閱讀 5180

目前我所知道的爬蟲在獲取頁面資訊上,分為靜態爬蟲和動態爬蟲;靜態爬蟲主要用於獲取靜態頁面,獲取速度一般也比較快;但是現在很多**的頁面都是採用動態頁面,當我們用爬蟲去獲取資訊的時候,頁面的資訊可能還沒有完全生成,所以我們很難獲取完整的網頁內容資訊。

所以我們需要構建動態爬蟲,目前比較好用的幾個工具是phantomjs, selenium等:

phantomjs類似於瀏覽器內建的webkit,支援各種web標準: dom 處理, css 選擇器, json, canvas, 和 svg;可以理解成乙個瀏覽器。

selenium是現在使用最為廣泛的一款開源自動化測試工具,我們可以用它進行對獲取的頁面內容進行解析,通常採用xpath,jsoup等等。

1.構建乙個基本的爬蟲:

1)jsoup 與 httpclient就可以構建乙個簡單的靜態爬蟲

2)  phantomjs 與 selenium可以構建乙個動態爬蟲

動態爬蟲的原理:

當我們將乙個請求傳送出去後,為了獲取完整的頁面資訊,我們需要等待js完全載入後才能獲取;所以我們可以將這個過程交給類似瀏覽器的工具去完成,等到頁面完全載入完成後我們在獲取完整的頁面內容進行解析。

這是一段網路上selenium應用的**:

file pathtobinary = new file("d:\\program files (x86)\\mozilla firefox\\firefox.exe");         

firefoxbinary ffbinary = new firefoxbinary(pathtobinary); 

firefoxprofile firefoxprofile = new firefoxprofile();

firefoxdriver driver = new firefoxdriver(ffbinary,firefoxprofile); 

driver.get(""); 

arraylist list = new arraylist();

list.add("");

list.add("");

list.add("");

list.add("");

long start,end;

for(int i=0;i我們可以通過設定去除一些我們不需要的內容如,css元素,廣告,flash等等

例:firefoxprofile.setpreference("permissions.default.image")

不足的地方是每次我們獲取頁面都要啟動driver,這非常耗時,對於大量的請求頁面獲取這種操作處理的效能不是太好。

可取的一些想法是:

把這些操作做成分布式的

我們可以寫乙個自己的客戶端程式提供一些頁面或者瀏覽器能訪問的位址,我們將獲取資訊的響應**到瀏覽器中執行(實際將響應的內容傳送到某個頁面給瀏覽器載入),然後在通過某些操作將結果返回給瀏覽器處理。

這裡的關鍵問題在於頁面載入完成的時間我們怎樣確定?

· 我們可以通過設定相應的抓取目標然後開多個客戶端非同步執行緒進行頁面抓取(這裡的關鍵在於爬蟲佇列的設計,以及內容的儲存方式)

· 頁面的載入可以通過定時來解決,但是定時策略不是乙個很好的辦法,因為我們仍然沒法確定在一定的時間頁面是否能載入完成

· 還有一種解決方法是將響應的內容用某個js函式執行,然後我們可以通過js**來確定獲取通過ajax請求某個內容然後通過**函式來確定

當然我們可以設計的更好一點:

2.爬蟲設計的一些問題

crawler的簡單運用(類似phpquery)

參考 中文 官方英文 因為是專案中運用,首先composer下composer require symfony dom crawler然後use寫 html hello crawler 我是p標籤11 我是p標籤22 html crawler new crawler html echo crawle...

爬蟲的基本框架

import requests 呼叫這個庫檔案 defgethtml url 定義名為gethtml的函式 try r requests.get url,timeout 30 獲取傳入的url這個位址的資料,在獲取時間,超過30秒,則判定網頁假死。r.raise for status 如果返回值不是...

爬蟲學習 爬蟲基本流程

標籤 空格分隔 資料探勘 爬蟲 1 發起請求 2 獲取相應內容 3 解析網路內容 4 儲存資料 結構化儲存 user server request server user response 1 請求方式 get,post,head,put,delete 2 get和post的區別 請求的引數包含的部...