goodcrawler(web crawler) Java網絡爬蟲
為什么叫goodcrawler?
首先它是個crawler,其次它不bad。我覺得不bad那就是good了,所以起名goodcrawler。 它是如何工作的?
goodcrawler借用了crawler4j的一點點代碼(只保留了Page等相關結構,刪除了sleepycat的所有東西),當然依然使用
httpclient。
首先種子會被放入url隊列中,然后爬取工人(fetchWorker)會從url隊列中取url并爬取。
然后爬到的頁面在在page隊列中,由抽取工人(extractWorker)從隊列中取出并抽取信息。
接著,抽取或者提煉出來的信息會被放入store隊列中再由存儲工人(storeWorker)負責存儲。
當然這些都是可擴展的,目前實現了66影視的提取器。本地文件系統的存儲器、elasticsearch的存儲器。。。
這一切的工作都是多線程的,所以效率很高。 后期還會實現hdfs的存儲器、mongodb的存儲器等等。
如何抽取內容?
goodcrawler的默認抽取器使用Jsoup對頁面進行解析,對于頁面結構設計良好的網頁,只需要在配置文件中填上需要抽取的元素的
Xpath路徑就可以自動實現抽取,而無需使用者自己去編寫抽取器。 配置文件
conf.properties文件
pending.urls.queue.size=10000
pending.pages.queue.size=5000
failed.pages.queue.size=5000
pending.store.pages.queue.size=20000
failed.pages.backup.path=./failed-pages/
ignore.failed.pages=true這個文件主要配置全局信息,隊列大小等 job_conf.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--全局配置 -->
<conf>
<globalSettings>
<threadPoolSize>30</threadPoolSize>
<timeout>3000</timeout>
<reportProcess>true</reportProcess>
</globalSettings>
<!--作業配置 -->
<jobs>
<job>
<name>testJob</name>
<storageType>localFile</storageType>
<agent>Kindle</agent>
<threadNum>2</threadNum>
<delayBetweenRequests>100</delayBetweenRequests>
<maxDepthOfCrawling>-1</maxDepthOfCrawling>
<maxOutgoingLinksToFollow>1000</maxOutgoingLinksToFollow>
<fetchBinaryContent>true</fetchBinaryContent>
<fileSuffix>gif,jpg,png,zip,rar,aiv,mtk</fileSuffix>
<https>true</https>
<onlyDomain>true</onlyDomain>
<connection>
<socketTimeoutMilliseconds>10000</socketTimeoutMilliseconds>
<connectionTimeout>10000</connectionTimeout>
<maxTotalConnections>120</maxTotalConnections>
<maxConnectionsPerHost>100</maxConnectionsPerHost>
<maxDownloadSizePerPage>1048576</maxDownloadSizePerPage>
</connection>
<proxy>
<proxyHost></proxyHost>
<proxyPort></proxyPort>
<proxyUsername></proxyUsername>
<proxyPassword></proxyPassword>
</proxy>
<!-- job運行時效,-1表示直到爬完全部,60表示一個小時后job自動結束 -->
<timeout>-1</timeout>
<seeds>
<seed>http://www.66e.cc</seed>
</seeds>
<urlFilters>
<urlFileter value="http://www\.66e\.cc/\[a-zA-Z]+/\d{4}?/\d{2}/\w[^_]+\.html"/>
</urlFilters>
<selects>
<!-- 選擇抓取的網頁類容 -->
<select name="title" value="#title" />
<select name="subTitle" value=".subTitle" />
</selects>
</job>
</jobs>
</conf></pre>
每一個job元素代表一個抓取工程,不同的job相互獨立。
如何使用
就這么簡單!!!
public static void main(String[] args) {
JobConfigurationManager manager = new JobConfigurationManager();
List<JobConfiguration> jobs;
try {
jobs = manager.loadJobConfigurations(
new File("D:\\pioneer\\goodcrawler\\src\\main\\resources\\job_conf.xml"));
for(JobConfiguration conf:jobs){
// fetch
FetchForeman.start(conf);
// extract
ExtractForeman.start(conf);
// store
StoreForeman.start(conf);
}
} catch (ConfigurationException e) {
e.getMessage();
}
} 沒有任何編碼負擔。
待解決的問題和以后的規劃
這個項目是一時興起的小玩物,目前的任務是完善和調整軟件結構,實現更多特性(session、form提交等等)。后期打算將url隊列單獨分離出來作為一個種子庫放在server Center上,爬取器和存儲器分散開來以實現分布式爬取。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!