大家好日川,說起爬蟲相信很多程序員都聽到過,簡(jiǎn)單來講就是自動(dòng)批量抓網(wǎng)絡(luò)上信息的程序譬圣。接下來我結(jié)合github上一個(gè)爬蟲框架NetDiscovery進(jìn)行演示腹纳。
1 )為什么要用框架?
框架能夠幫助我們處理一些基礎(chǔ)的诗越、與目標(biāo)任務(wù)沒直接聯(lián)系的工作砖瞧,讓我們專注在目標(biāo)任務(wù)上。尤其對(duì)于爬蟲初學(xué)者來說嚷狞,很快就能體會(huì)到操作爬蟲帶來的效果與成就感块促,而不必去操心額外的事情。等入了門感耙,再嘗試不依賴框架獨(dú)立從零寫一個(gè)爬蟲程序褂乍,然后再去研究別人已經(jīng)搭建好的爬蟲框架,等到能閱讀爬蟲框架源代碼以后即硼,相信您已經(jīng)對(duì)網(wǎng)絡(luò)爬蟲有一定的研究了逃片。
2 )演示環(huán)境
Java JDK8、IntelliJ IDEA只酥、Google Chrome
爬蟲框架NetDiscovery:https://github.com/fengzhizi715/NetDiscovery/
3 )確定爬蟲任務(wù)
從某人才招聘網(wǎng)上獲取指定的崗位信息:公司名稱褥实、崗位名稱
4 )人肉分析網(wǎng)頁
用chrome瀏覽器打開目標(biāo)網(wǎng)頁,輸入查詢條件裂允,找到展示崗位信息的網(wǎng)頁:
紅框位置里的文字是我們計(jì)劃要寫程序去自動(dòng)獲取的信息损离。
這個(gè)環(huán)節(jié)的分析工作很重要,我們要對(duì)抓取的目標(biāo)網(wǎng)頁绝编、目標(biāo)數(shù)據(jù)有明確的了解僻澎。人眼已經(jīng)能看到這些信息了貌踏,接下來就是寫程序教電腦去幫我們抓取。
5 )創(chuàng)建Java工程
創(chuàng)建一個(gè)gradle的java工程:
在項(xiàng)目中添加爬蟲框架NetDiscovery的兩個(gè)jar包窟勃,目前版本是0.0.9.3祖乳,版本不高,但版本的更新迭代很快秉氧,相信是一個(gè)有成長(zhǎng)力的框架眷昆。
group 'com.sinkinka'
version '1.0-SNAPSHOT'
apply plugin: 'java'
sourceCompatibility = 1.8
repositories {
maven{url 'http://maven.aliyun.com/nexus/content/groups/public/'}
mavenCentral()
jcenter();
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
implementation 'com.cv4j.netdiscovery:netdiscovery-core:0.0.9.3'
implementation 'com.cv4j.netdiscovery:netdiscovery-extra:0.0.9.3'
}
如果下載不了,請(qǐng)配上阿里云鏡像地址:
http://maven.aliyun.com/nexus/content/groups/public/
6 )代碼實(shí)現(xiàn)
參考框架中example模塊下的示例代碼汁咏,以及另一個(gè)實(shí)例項(xiàng)目:
https://github.com/fengzhizi715/user-agent-list
- 創(chuàng)建main方法的入口類亚斋,在main里啟動(dòng)爬蟲
- 針對(duì)目標(biāo)網(wǎng)頁的解析,需要?jiǎng)?chuàng)建實(shí)現(xiàn)parser接口的類
- 從html字符串中抓取目標(biāo)內(nèi)容有多種方法攘滩,比如xpath帅刊、jsoup、正則表達(dá)式等
在java的main方法里編寫如下代碼:
package com.sinkinka;
import com.cv4j.netdiscovery.core.Spider;
import com.sinkinka.parser.TestParser;
public class TestSpider {
public static void main(String[] args) {
//目標(biāo)任務(wù)的網(wǎng)頁地址轰驳,可以拷貝到瀏覽器去查看
String url = "http://www.szrc.cn/HrMarket/WLZP/ZP/0/%E6%95%B0%E6%8D%AE";
//依靠NetDiscovery厚掷,我們只需要寫一個(gè)parser類就可以實(shí)現(xiàn)基本的爬蟲功能了
Spider.create()
.name("spider-1") //名字隨便起
.url(url)
.parser(new TestParser()) //parser類
.run();
}
}
TestParser類的代碼:
package com.sinkinka.parser;
import com.cv4j.netdiscovery.core.domain.Page;
import com.cv4j.netdiscovery.core.parser.Parser;
import com.cv4j.netdiscovery.core.parser.selector.Selectable;
import java.util.List;
/**
* 針對(duì)目標(biāo)網(wǎng)頁的解析類
*/
public class TestParser implements Parser {
@Override
public void process(Page page) {
String xpathStr = "http://*[@id=\"grid\"]/div/div[1]/table/tbody/tr";
List<Selectable> trList = page.getHtml().xpath(xpathStr).nodes();
for(Selectable tr : trList) {
String companyName = tr.xpath("http://td[@class='td_companyName']/text()").get();
String positionName = tr.xpath("http://td[@class='td_positionName']/a/text()").get();
if(null != companyName && null != positionName) {
System.out.println(companyName+"------"+positionName);
}
}
}
}
運(yùn)行結(jié)果:
7 )總結(jié)
本文依賴爬蟲框架,用盡量簡(jiǎn)單的代碼演示了抓取網(wǎng)頁信息的一種方法级解。后續(xù)會(huì)發(fā)布更多實(shí)操性的內(nèi)容供大家參考冒黑。
NetDiscovery爬蟲框架的基本原理圖