必威体育Betway必威体育官网
当前位置:首页 > IT技术

爬取去哪儿网机票数据

时间:2019-11-06 03:14:33来源:IT技术作者:seo实验室小编阅读:77次「手机版」
 

去哪儿机票

抓取去哪儿网机票数据

此次,我们使用webdriver测试抓取去哪儿网机票数据,为什么不爬取主站而爬取 m站,因为主站机票价格通过css操作使网页显示价格与html元素呈现的价格不一样,虽然可以解决但比较繁琐。但是m站价格两者是相同的,所以我们抓取m站点的数据,感兴趣的可以自行破解css混淆抓取主站数据。

移动端数据

主站PC端

通过分析得知数据获取url如下

所以我们只需要通过webdriver请求上述地址,更改相应的参数就能获取到数据。

requests_dic  = {
    'depCity': from_city,  出发地
    'arrCity': to_city, 到达地
    'goDate': '2019-02-27' 日期
}

请求网址:driver_url = 'https://m.flight.qunar.com/ncs/page/flightlist?

%s&from=touch_index_search&child=0&baby=0&cabinType=0'%requestjdic

注意:webdriver要设置的相关参数

mobile_emulation = {"deviceName": "iPhone X"}
options = Options()
# 很重要破解webDiver检测 避免js检测webdriver机制
options.add_experimental_option('excludeSwitches', ['enable-automation'])
options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome(options=options)

去哪网有webdriver 检测机制,单纯使用webdriver 会遭到反爬, 在console 中输入window.navigator.webdriver, 正常的浏览器会显示 undefined, webdriver下会显示 true。有兴趣的自行测试。


在js判断window.navigator.webdriver返回值就可以检测,懂js的可能会想到覆盖这个值,比如使用如下代码Object.defineProperties(navigator,{webdriver:{get:()=>undefined}}),确实可以修改成功。这种写法还是存在某些问题的,如果此时你在模拟浏览器中通过点击链接、输入网址进入另一个页面,或者开启新的窗口,你会发现window.navigator.webdriver又变成了true.那么是不是可以在每一个页面都打开以后,再次通过webdriver执行上面的js代码,从而实现在每个页面都把window.navigator.webdriver设置为undefined呢?也不行。因为当你执行:driver.get(网址)的时候,浏览器会打开网站,加载页面并运行网站自带的js代码。所以在你重设window.navigator.webdriver之前,实际上网站早就已经知道你是模拟浏览器了。在启动Chromedriver之前,为Chrome开启实验性功能参数excludeSwitches,它的值为['enable-automation']从而解决这个问题。

现在就可以使用webdriver 爬取页面, 进入页面可以看到。

我们只需要控制webdriver向下滑动并且点击加载更多的元素就可以获取更多的数据。

# 屏幕向下滑动到最低端
driver.execute_script("window.scrollTo(100, document.body.scrollheight);")
more_list = driver.find_element_by_xpath(".//section[@class='list-getmore']")
print(more_list.text)
# 选择加载更多按钮并且点击
driver.find_element_by_xpath(".//section[@class='list-getmore']").click()

通过xpath进行数据的提取

from_time = text(driver.find_elements_by_xpath('//p[@class="from-info"]/p[1]'))
from_airport = text(driver.find_elements_by_xpath('//p[@class="from-info"]/p[2]'))
to_time = text(driver.find_elements_by_xpath('//p[@class="to-info"]/p[1]'))
to_airport = text(driver.find_elements_by_xpath('//p[@class="to-info"]/p[2]'))
company_main = driver.find_elements_by_xpath('//p[@class="company-info"]')
price = text(driver.find_elements_by_xpath('//p[@class="price-info"]'))

pandas写文件

df = pd.DataFrame(
    {'from_time': from_time, 'from_airport': from_airport, 'to_time': to_time, 'to_airport': to_airport,
     'the_plane': plane_list, 'company': company_list, 'real_price_list': price})
df.to_csv("qunaer.csv", header=0, mode='a+', index=0)

部分结果如下

关于Chrome的excludeSwitches等相关参数含义自行Google

想要获取源码  关注公众号 <程序员之心>  后台回复  <去哪儿网>  就可获取。

文章最后发布于: 2019-08-10 11:03:11

相关阅读

面对数据线小烦恼,锐班3C数码配件有妙招

刚用了几个月的数据线破皮了,出门时放在包里总是会乱成一团,白色的数据线在长时间使用后会变得有点脏,这些场景大家肯定都不陌生。那

网站制作教程:新手怎么自己建网站

很多企业或个人都想自己建网站,苦于没有网站建设经验和基础,一直不清楚怎么自己网站网站,下面小熊优化的小编就告诉大家,没有网站建设

淘宝开不了虚拟网店吗?怎么办?

网购的方便以及货物品种的齐全,越来越多的人已经成为了网购达人。面对全国如此巨大的顾客群体或潜在顾客群。有很多的人开始在淘宝

从360安全卫士卸载金山网盾看产品设计

做产品的要学会分析用户心理,诱导用户按我们的意愿办事,但还得看起来像是用户做了英明的决策。该文非常多智慧的火花,收藏学习。闹得

powerdesign建Oracle数据库设置某个属性值自增

两种方式,一种是通过执行PowerDesign生成的触发器语句,一种是通过SqlDeveloper内创建触发器,但是两种方法使用之前都需要创建序列seq

分享到:

栏目导航

推荐阅读

热门阅读