最近公司有一個新的需求,就是須要爬某一天飛機票的數據,先讓我爬攜程,去哪兒網的數據,攜程的話,仍是比較簡單的,可是在去哪兒網就遇到問題了,剛開始的時候我是用requests模塊來爬去哪兒網,在請求的頭信息,有一些隨機值,每次請求都不同,即便你使用上一次請求的隨機值,仍是會給你返回假數據。我本身給它生成一些隨機字符串去請求,但依然返回假數據。最後沒有辦法,我只能使用selenium大法了。css
在使用selenium的過程當中,去哪兒網還作了一些反selenum爬蟲:html
1. 用js識別了seleniumgit
當我把地點,時間都選好了,點擊加載,進入到各個航班信息頁面,其餘部分都顯示了,核心數據,一直加載中,我電腦都死機了好幾回。github
這種反爬第一次遇到,只能百度了,最後在這位大神找到解決辦法,連接:https://www.cnblogs.com/xieqiankun/p/hide-webdriver.htmlweb
解決:chrome
在option加參數, 試瀏覽器中止「開發者模式運行」;我使用的chrome瀏覽器,因此:瀏覽器
option.add_experimental_option('excludeSwitches', ['enable-automation'])
而後數據就成功顯示出來,ide
2. 在飛機票價格上,使用css,把價格打亂,讓你爬不到真正的價格spa
在我覺得即將成功的時候,發現一個新的問題了,使用xpath匹配的數據,有不少打亂的數據,並且還有一些干擾數據在裏面:code
<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