最近作的爬蟲一些事

最近作的爬蟲一些事

標籤(空格分隔): 雜亂之地html


最近在作爬蟲,主要是抓取淘寶商品的銷量數據。在搜索頁很容易就能抓到細覽頁的數據,主要問題難點是在抓取細覽頁中,頁面的銷量及評價數據是經過ajax來動態加載的。這一部分處理比較麻煩。同時又要解決屏蔽的問題。這幾天一直在找解決訪問。通常的爬蟲都是不支持ajax數據的爬取的。寫一下這幾天作的各類工具的demo吧。
如今(2016年1月)市面上可以抓取ajax數據的主要有如下技術:htmlunit,casperjs,phantomjs,selenium.java

htmlunit

  • 代碼
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;
            }
        }
    }
}
  • 經過htmlunit能夠得到到銷量數據。可是因爲要解決屏蔽及效率問題(多線程),因此確定要使用代理的,可是我機器上設置代理不起做用不知道爲何,因此放棄了使用htmlunit
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

    js

  • casperjs&phantomjs
    這兩個都是js的自動測試框架。經過js來模擬點擊瀏覽器操做,屬於無界面的瀏覽器。經過實驗發現也是能夠而且很輕鬆的可以得到經過ajax加載的數據。可是隻能經過shell命令來輸入代理。因此這種方式最後也是放棄了。
  • selenium
    selenium也是一個自動測試框架,屬於有界面的,原理與上面的js是同樣的。經過命令來肯定發送操做瀏覽器的指令。通過一翻實驗發現,對於代理的操做相對來講也不是很方便,並且屬於有界面的,還不如使用chrome來開發插件的方式來解決這個問題。也方便非it人員調用。ajax

總結:
1.若是須要頻繁抓取,目前的解決方案是chrome+插件來解決。
2.若是能解決htmlunit的代理問題。效果優於1.
3.htmlunit代理問題不侷限於代理不上,還有對於socks支持的問題。chrome

相關文章
相關標籤/搜索