標籤(空格分隔): 雜亂之地html
最近在作爬蟲,主要是抓取淘寶商品的銷量數據。在搜索頁很容易就能抓到細覽頁的數據,主要問題難點是在抓取細覽頁中,頁面的銷量及評價數據是經過ajax來動態加載的。這一部分處理比較麻煩。同時又要解決屏蔽的問題。這幾天一直在找解決訪問。通常的爬蟲都是不支持ajax數據的爬取的。寫一下這幾天作的各類工具的demo吧。
如今(2016年1月)市面上可以抓取ajax數據的主要有如下技術:htmlunit,casperjs,phantomjs,selenium.java
package com.kis; import com.gargoylesoftware.htmlunit.*; import com.gargoylesoftware.htmlunit.html.*; import java.io.IOException; import java.net.URL; import java.util.Properties; /** * Created by wanglong on 16-1-21. */ public class TestProxy { public static void main(String[] args) throws IOException { String url = "https://item.taobao.com/item.htm?id=520081147502&ns=1&abbucket=11#detail"; WebClient webClient = new WebClient(BrowserVersion.FIREFOX_38);//設置瀏覽器的User-Agent webClient.setJavaScriptTimeout(100000);//設置JS執行的超時時間 webClient.getOptions().setThrowExceptionOnScriptError(false);//當JS執行出錯的時候是否拋出異常 webClient.getOptions().setRedirectEnabled(true); webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//當HTTP的狀態非200時是否拋出異常 webClient.getOptions().setTimeout(30000);//設置「瀏覽器」的請求超時時間 webClient.getOptions().setCssEnabled(false);//是否啓用CSS webClient.getOptions().setJavaScriptEnabled(true); //很重要,啓用JS webClient.waitForBackgroundJavaScript(100000);//設置JS後臺等待執行時間 webClient.getOptions().setThrowExceptionOnScriptError(false); webClient.setAjaxController(new NicelyResynchronizingAjaxController());//設置支持AJAX HtmlPage resultPage = webClient.getPage(url); HtmlStrong strong; webClient.waitForBackgroundJavaScript(2000); Long start = System.currentTimeMillis(); for (int i = 0; i < 20; i++) { strong = resultPage.getFirstByXPath("//*[@id=\"J_SellCounter\"]"); if (strong.asText().equals("-")) { webClient.waitForBackgroundJavaScript(1000); } else { Long end = System.currentTimeMillis(); System.out.println(strong.asText()); System.out.print(" 所用時間爲" + (end - start) / 1000 + "秒"); break; } } } }
Properties prop = System.getProperties(); prop.setProperty("proxySet", "true"); prop.setProperty("http.proxyHost", "61.191.27.117"); prop.setProperty("http.proxyPort", "443");
WebRequest webRequest = new WebRequest(new URL(url)); webRequest.setProxyHost("202.103.241.169"); webRequest.setProxyPort(1080); webRequest.setSocksProxy(true);
經過以上兩種方式設置的代理都無論用,經過訪問www.ip138.com得到的ip仍是我本機的ip,因此就放棄了這種方法。web
selenium
selenium也是一個自動測試框架,屬於有界面的,原理與上面的js是同樣的。經過命令來肯定發送操做瀏覽器的指令。通過一翻實驗發現,對於代理的操做相對來講也不是很方便,並且屬於有界面的,還不如使用chrome來開發插件的方式來解決這個問題。也方便非it人員調用。ajax
總結:
1.若是須要頻繁抓取,目前的解決方案是chrome+插件來解決。
2.若是能解決htmlunit的代理問題。效果優於1.
3.htmlunit代理問題不侷限於代理不上,還有對於socks支持的問題。chrome