最近做的爬蟲一些事


最近做的爬蟲一些事

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


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

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,所以就放棄了這種方法。

js

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM