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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!