爬蟲項目(二)用phantomjs做爬蟲

這幾天有事沒怎麼研究,最開始用的java爬蟲想爬取攜程,結果失敗告終。

主要表現在:

1.抓取不到對應的標籤,jsoup語法對應的element個數是0,推測是因爲直接用get方法獲取機票信息時,該網站不顯示和價格信息有關的elemengt,故抓取不到。

2.抓取到的數據是錯誤的。價格和真正標價的相去甚遠。

據說qunar和xiecheng之類的網站在反爬蟲上下了些功夫。爲了達到目標我也進行了一些嘗試,屢敗屢戰,修改了一下爬蟲代碼,和思路。今天嘗試了phantomjs做爬蟲,成功爬取了,phantomjs腳本文件的代碼好像是js代碼,和JAVA也差不多,很容易上手。

方法1.訪問網站的手機版,下個瀏覽器的user-agent switch插件,把agent改成手機瀏覽器就成。然後照常執行爬蟲任務,相對的手機網頁比電腦版簡潔好抓一些,但是還是failed。

方法2.增加請求頭僞裝瀏覽器,和真實瀏覽器差別太大,無效,failed。

方法3.既然不給非瀏覽器發數據,那我就用真瀏覽器,phantomjs開源瀏覽器內核,說白了就是一個沒有GUI的瀏覽器,需要通過操作檯和代碼行使用,當然好處就是開源的東西可以整進自己想要的功能,比如爬蟲。

暫時放下前面的java爬蟲,用phantomjs來做個小爬蟲,專門爬機票。最後經過嘗試,success。只是暫時嘗試,代碼很簡單,參照API寫的:

var page = require('webpage').create();
phantom.outputEncoding="gbk";
page.open('http://flights.ctrip.com/booking/XMN-BJS-day-1.html?DDate1=2017-02-18', function (status) {
    var flight = page.evaluate(function () {
        return document.getElementById('J_flightlist2').textContent;
    });
    console.log(flight);
	phantom.exit();
});
抓取的數據如下圖:



因爲和jsoup的用法有點出入,暫時沒細寫,直接抓了一小片的數據,看起來有點雜,而且直接抓取價格位置的標籤還是抓取不到。已經實現數據整個加載,推測攜程的防爬蟲規則應該是需要載入某個不相關標籤後纔會顯示價格。後續再提取也沒問題,數據既然都獲取到了,篩選就不是什麼難事兒了。同樣,如果有進展的話還有後續文章。

Tips:

在phantomjs使用的時候,返回cmd命令行的中文數據是亂碼的,這個問題是因爲有些網站採用的是GBK編碼,而phantomjs默認編碼是UTF-8,在代碼行裏插入下面這句代碼,可以改變編碼,解決中文亂碼的問題。

phantom.outputEncoding="gbk";修改輸出編碼,解決中文亂碼的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章