最近公司有一個新的需求,就是需要爬某一天飛機票的數據,先讓我爬攜程,去哪兒網的數據,攜程的話,還是比較簡單的,但是在去哪兒網就遇到問題了,剛開始的時候我是用requests模塊來爬去哪兒網,在請求的頭信息,有一些隨機值,每次請求都不一樣,即使你使用上一次請求的隨機值,還是會給你返回假數據。我自己給它生成一些隨機字符串去請求,但依然返回假數據。最后沒有辦法,我只能使用selenium大法了。
在使用selenium的過程中,去哪兒網還做了一些反selenum爬蟲:
1. 用js識別了selenium
當我把地點,時間都選好了,點擊加載,進入到各個航班信息頁面,其他部分都顯示了,核心數據,一直加載中,我電腦都死機了好幾次。
這種反爬第一次遇到,只能百度了,最后在這位大神找到解決辦法,鏈接:https://www.cnblogs.com/xieqiankun/p/hide-webdriver.html
解決:
在option加參數, 試瀏覽器停止“開發者模式運行”;我使用的chrome瀏覽器,所以:
option.add_experimental_option('excludeSwitches', ['enable-automation'])
然后數據就成功顯示出來,
2. 在飛機票價格上,使用css,把價格打亂,讓你爬不到真正的價格
在我以為即將成功的時候,發現一個新的問題了,使用xpath匹配的數據,有很多打亂的數據,而且還有一些干擾數據在里面:
<em class="rel"> <b style="width:48px;left:-48px"> <i style=width: 16px;"">6</i> <i style=width: 16px;"">5</i> <i style=width: 16px;"">6</i> </b> <b style="width: 16px;left:-48px">7</b> </em>
真正的價格:756
規則:
主要看css寬度
如上面:
總寬度48px
展示的值b標簽里面的i標簽的text值,除了一個b標簽是用來展示的,其他b標簽的值替換i標簽中text值即為真正的值。
每個b標簽里面style中left值表示位置,如left:-48px, 替換第一個i, 如果left:-16px, 就替換第3個i。
思路就是這樣的了,代碼我放到github上面的,鏈接:https://github.com/bobos008/Airticket