Linux企業級專案實踐之網路爬蟲(24)——定製規則擴充套件為垂直爬蟲
在垂直搜尋的索引建立之前,我們需要到垂直網站上抓取資源並做一定的處理。垂直搜尋與通用搜尋不同之處在於,通用搜尋不需要理會網站哪些資源是需要的,哪些是不需要的,一併抓取並將其文字部分做索引。而垂直搜尋裡,我們的目標網站往往在某一領域具有其專業性,其整體網站的結構相當規範(否則使用者體驗也是個災難,想想東一篇文章西一篇文章基本沒人會喜歡),並且垂直搜尋往往只需要其中一部分具有垂直性的資源,所以垂直爬蟲相比通用爬蟲更加精確。
垂直爬蟲爬取資源步驟:
首先選定需要抓取的目標網站,輸入資料庫的站源表sitelist,然後url crawler會讀取出來存入map,並提出對應站點的正則解析規則。
然後根據事先制定的url列表頁正規表示式,url crawler到列表頁爬取列表並提取出來存入資源url表urllist,當中涉及一些列表頁分頁功能,具體視每個網站分頁url規則而定。
從資料庫的資源url表讀出urls及其資源頁的爬取規則,存入一個同步的佇列中(一般做法會將url做md5處理,用於去重,以免重複爬取相同url,浪費資源),多執行緒下的每個爬蟲程式將從此佇列讀取urls(若佇列為空執行緒將進入等待),然後爬取每個資源頁並保持頁面。
垂直爬蟲爬取資源步驟:
首先選定需要抓取的目標網站,輸入資料庫的站源表sitelist,然後url crawler會讀取出來存入map,並提出對應站點的正則解析規則。
然後根據事先制定的url列表頁正規表示式,url crawler到列表頁爬取列表並提取出來存入資源url表urllist,當中涉及一些列表頁分頁功能,具體視每個網站分頁url規則而定。
從資料庫的資源url表讀出urls及其資源頁的爬取規則,存入一個同步的佇列中(一般做法會將url做md5處理,用於去重,以免重複爬取相同url,浪費資源),多執行緒下的每個爬蟲程式將從此佇列讀取urls(若佇列為空執行緒將進入等待),然後爬取每個資源頁並保持頁面。
最後根據爬取到的頁面,進行進一步的處理。
int extract_url(regex_t *re, char *str, Url *ourl)
{
const size_t nmatch = 2;
regmatch_t matchptr[nmatch];
int len;
char *p = str;
while (regexec(re, p, nmatch, matchptr, 0) != REG_NOMATCH) {
len = (matchptr[1].rm_eo - matchptr[1].rm_so);
p = p + matchptr[1].rm_so;
char *tmp = (char *)calloc(len+1, 1);
strncpy(tmp, p, len);
tmp[len] = '\0';
p = p + len + (matchptr[0].rm_eo - matchptr[1].rm_eo);
/* exclude binary file */
if (is_bin_url(tmp)) {
free(tmp);
continue;
}
char *url = attach_domain(tmp, ourl->domain);
if (url != NULL) {
SPIDER_LOG(SPIDER_LEVEL_DEBUG, "I find a url: %s", url);
Surl * surl = (Surl *)malloc(sizeof(Surl));
surl->level = ourl->level + 1;
surl->type = TYPE_HTML;
/* normalize url */
if ((surl->url = url_normalized(url)) == NULL) {
SPIDER_LOG(SPIDER_LEVEL_WARN, "Normalize url fail");
free(surl);
continue;
}
if (iscrawled(surl->url)) { /* if is crawled */
SPIDER_LOG(SPIDER_LEVEL_DEBUG, "I seen this url: %s", surl->url);
free(surl->url);
free(surl);
continue;
} else {
push_surlqueue(surl);
}
}
}
return (p-str);
}
相關文章
- Linux企業級專案實踐之網路爬蟲(21)——擴充套件為多工爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(20)——擴充套件成為規則外掛模式Linux爬蟲套件模式
- Linux企業級專案實踐之網路爬蟲(28)——爬蟲socket處理Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(7)——DNS解析Linux爬蟲DNS
- Linux企業級專案實踐之網路爬蟲(19)——epoll介面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(4)——主程式流程Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(8)——認識URLLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(17)——儲存頁面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(18)——佇列處理Linux爬蟲佇列
- Linux企業級專案實踐之網路爬蟲(26)——執行緒池Linux爬蟲執行緒
- Linux企業級專案實踐之網路爬蟲(27)——多路IO複用Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(29)——遵守robots.txtLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(25)——管理原始碼之SVNLinux爬蟲原始碼
- Linux企業級專案實踐之網路爬蟲(5)——處理配置檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(22)——編寫爬蟲系統服務控制指令碼Linux爬蟲指令碼
- Linux企業級專案實踐之網路爬蟲(13)——處理user-agentLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(10)——處理HTTP狀態碼Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(11)——處理http請求頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(12)——處理HTTP應答頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(30)——通過查閱RFC文件擴充更加複雜的功能Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(6)——將程式設計成為守護程式Linux爬蟲程式設計
- Linux企業級專案實踐之網路爬蟲(14)——使用正規表示式抽取HTML正文和URLLinux爬蟲HTML
- Linux企業級專案實踐之網路爬蟲(9)——通過URL抓取網頁內容Linux爬蟲網頁
- [Python] 網路爬蟲與資訊提取(1) 網路爬蟲之規則Python爬蟲
- Python3 大型網路爬蟲實戰 — 給 scrapy 爬蟲專案設定為防反爬Python爬蟲
- 網路爬蟲專案爬蟲
- Linux企業級專案實踐之網路爬蟲(23)——系統測試:找出系統中的bugLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(15)——區分文字檔案和二進位制檔案Linux爬蟲
- Java 爬蟲專案實戰之爬蟲簡介Java爬蟲
- 網路爬蟲——爬蟲實戰(一)爬蟲
- 網路爬蟲專案蒐集爬蟲
- 企業資料爬蟲專案爬蟲
- Linux企業級專案實踐之網路爬蟲(16)——使用base64傳輸二進位制資料Linux爬蟲
- 精通Scrapy網路爬蟲【一】第一個爬蟲專案爬蟲
- Scrapy 輕鬆定製網路爬蟲爬蟲
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- 專案--python網路爬蟲Python爬蟲
- 網路爬蟲(python專案)爬蟲Python