github项目:https://github.com/wzyblowfire/flightsmonitor

页面分析

首先进入携程网的国际机票网页分析,可以看出该网页是一个动态页面,也就是说单一的请求获取response是无法得到我们需要的数据的,所以我们需要用后台分析一下我们真正所需要的数据到底在哪。

当搜索从香港到曼彻斯特的航班时,从Chrome控制台Network可以看到, 有个batchSearch的请求,获得了这一页中的所有航班信息,这时候我试了一下直接请求这个URL,加上对应的请求头和请求data,确实可以获取内容。

但是随后我发现了一个问题,如果我需要获取别的行程的信息,比如香港去伦敦,必须自己再一次手动去复制那个搜索的headers,因为headers中的sign和transactionid每一次搜索是唯一的,并且没有规律可循,也无法通过请求爬取。

为了解决需要手动复制这个问题,我使用了多种办法,最终选择了使用Selenium和Browsermob-proxy这两个库来实现。

库安装

1、Selenium安装

Selenium是一个浏览器自动化测试工具。

命令行输入

pip install selenium

安装完后注意,3.x以上版本的selenium是需要手动配置webdriver的。

配置教程:https://www.cnblogs.com/lvzuwen/p/7309341.html

记得按照自己电脑上浏览器的版本号下载对应版本的chromedriver.exe或geckodriver.exe。

2、Browsermob-proxy安装

Browsermob-prox是一个 浏览器代理服务器工具,可以监听浏览器的访问过程。

首先电脑上必须拥有java的环境,java配置:https://www.cnblogs.com/ssrs-wanghao/articles/8994856.html

Browsermob-proxy安装:https://blog.csdn.net/m0_37618247/article/details/85066272

记得Browsermob在github官网上release那里下载Browsermob-proxy包:https://github.com/lightbody/browsermob-proxy/releases,我下的是2.1.4版本。

代码

(gitbub项目:https://github.com/wzyblowfire/flightsmonitor)

配置环境之后,就直接上代码了,首先是存储航班信息的类代码,这里只选择了数据中的一些信息,其实获取的信息中有很多信息,可根据自己的需求更改。

flights.py:

# -*- coding: utf-8 -*-
"""
Created on Wed Jul 31 15:02:31 2019@author: wzyblowfire
"""class Flights:def __init__(self, data_dict):self.fid = data_dict['itineraryId'].replace(',', '-')   # 航班号self.name = data_dict['flightSegments'][0]['airlineName']   # 航空公司dur = data_dict['flightSegments'][0]['duration']   hour = int(dur/60)minute = dur%60self.duration = str(hour)+'h'+str(minute)+'m'   # 行时长self.detime = data_dict['flightSegments'][0]['flightList'][0]['departureDateTime']  # 出发时间self.decity = data_dict['flightSegments'][0]['flightList'][0]['departureCityName']  # 出发地self.arcity = []self.artime = []for x in data_dict['flightSegments'][0]['flightList']:self.arcity.append(x['arrivalCityName'])    # 达到城市(包括中转)self.artime.append(x['arrivalDateTime'])    # 达到时间(包括中转)  self.price = []for x in data_dict['priceList']:self.price.append(x['adultPrice']+x['adultTax'])    # 机票价格self.minprice = min(self.price)     # 最低价格def __str__(self):# 信息输出stri = 'name: ' +self.name+'\n'+\'fid: '+self.fid+'\n'+\'detime: '+str(self.detime)+' '+str(self.decity)+'\n'+\'artime: '+str(self.artime)+' '+str(self.arcity)+'\n'+\'duration: '+self.duration+'\n'+\'minprice: '+str(self.minprice)return stri

爬虫代码,每60秒获取一次信息,这里使用的是chrome浏览器,由于Selenium的速度较慢,所以这里选择先使用Selenium获取后续访问batchSearch的hearders和request data,然后后续持续访问就可以直接使用requests中的方法,提高效率,而且避免浏览器弹框。

selen.py:

# -*- coding: utf-8 -*-
"""
Created on Mon Aug  5 15:19:27 2019@author: wzyblowfire
"""
import os
import time
import json
import requests
from browsermobproxy import Server
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Optionsimport spider
from flight import Flightsdef search_url(depport, arrport, depdate):"""获取携程国际机票搜索的url参数:depport:出发机场码(机场码可参考(https://github.com/wzyblowfire/flightsmonitor)data文件夹下的world-airports.csv或访问http://ourairports.com/airports.html下载)arrport: 到达机场码depdate: 出发日期返回值:international_url:国际航班搜索url"""international_url = ('https://flights.ctrip.com/international/search/oneway-%s-%s?' + \'depdate=%s&cabin=y_s&adult=1&child=0&infant=0') % (depport, arrport, depdate)return international_urldef get_initinfo(url):"""本函数用于获取签名sign信息,transactionID和后续请求data.其中使用了selenium和browsermob-proxy.参数:url: 携程搜索国际航班的url返回值:headers:后续请求头信息postdata: 后续持续获取航班信息请求头中的提交json信息"""# browsermob-proxy配置路径,请将这里填写为自己电脑上的路径path = os.path.join('D:\code\env', 'browsermob-proxy-2.1.4','bin','browsermob-proxy.bat')   server = Server(path)   # 设置服务器脚本路径server.start()          proxy = server.create_proxy()   # 创建一个浏览器代理# chrome测试配置chrome_options = Options()chrome_options.add_argument('--ignore-certificate-errors')chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))chrome_options.add_argument('--disable-gpu')     driver = webdriver.Chrome(chrome_options = chrome_options)  # 使用selenium创建浏览器窗口proxy.new_har(url, options={'captureContent':True, 'captureHeaders':True})  # 代理服务器开始监测,捕捉文本和请求头信息driver.get(url)# 显示等待5秒,因为网页会持续加载,需要等待一段时间,直到航空公司内容出现,说明加载成功WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.CLASS_NAME,'airline-name'))) result = proxy.harserver.stop()driver.quit()# 获取https://flights.ctrip.com/international/search/api/search/batchSearch这个访问过程中的重要信息headers = {}for entry in result['log']['entries']:if 'batchSearch' in entry['request']['url']:postdata = entry['request']['postData']['text']header = entry['request']['headers']  for x in header:headers[x['name']] = x['value']         return headers, postdatadef spider_searchflights(headers, post_data):"""后续持续获取数据函数参数:headers:请求头信息post_data: 请求头中的数据信息(json)返回:dict_json: 航班信息(字典)"""search_URL = 'https://flights.ctrip.com/international/search/api/search/batchSearch?v='response = requests.post(search_URL, data=post_data, headers=headers)dict_json = json.loads(response.text)# 如果请求不成功,输出信息if dict_json['status'] != 0:print(dict_json['msg'])return dict_jsonif __name__ == '__main__':url = search_url('hkg', 'man', '2019-09-20')headers, postdata = get_initinfo(url)postdata = json.loads(postdata)postdata = json.dumps(postdata)while True:result = spider.spider_searchflights(headers, postdata)result = result['data']['flightItineraryList']flights = {}for x in result:flight = Flights(x)print(flight)time.sleep(60)  #每60秒更新一次

数据展示

Python 爬虫实战(二)爬取携程(国际)机票相关推荐

  1. 携程ajax,Python爬虫实战之爬取携程评论

    一.分析数据源 这里的数据源是指html网页?还是Aajx异步.对于爬虫初学者来说,可能不知道怎么判断,这里辰哥也手把手过一遍. 提示:以下操作均不需要登录(当然登录也可以) 咱们先在浏览器里面搜索携 ...

  2. Python爬虫案例:爬取携程评论

    前言 之前爬取美团,马蜂窝等网站的数据都挺顺利,大众点评(这个反爬机制有点麻烦)在磕磕绊绊中也算成功(重点是网页页数的变化和关键字的隐藏替换)但携程居然遇到了瓶颈. 主要是查看源代码时发现关键商户信息 ...

  3. Python爬虫实战(二):爬取天涯帖子(只看楼主)

    先上代码 #coding=utf-8 import requests from bs4 import Tag from bs4 import BeautifulSoup def getHtml(url ...

  4. python爬虫爬取携程国际机票航班信息,返回json串

    # -*- coding: utf-8 -*- import requests, json import hashlib import re# 此处的参数是json 出发三字码,达到三字码,出发时间, ...

  5. python中飞机票购买程序_「最低折扣机票查询」Python 爬取携程所有机票找出最低折扣机票,让你无忧回家过年 - seo实验室...

    最低折扣机票查询 前言 对于平时出行大多数人都是选择坐高铁,当然了如果这是对于距离比较近的行程是最划算的,如果对于路途长远的人言,提前购买飞机票价格可能比高铁票更加的便宜,如果我们可以爬取机票数据并分 ...

  6. Python爬虫实战之爬取网站全部图片(一)

    Python爬虫实战之爬取网站全部图片(二) Python爬虫实战之通过ajax获得图片地址实现全站图片下载(三) 一.获得图片地址 和 图片名称 1.进入网址之后 按F12  打开开发人员工具点击e ...

  7. Python爬虫实战之爬取糗事百科段子

    Python爬虫实战之爬取糗事百科段子 完整代码地址:Python爬虫实战之爬取糗事百科段子 程序代码详解: Spider1-qiushibaike.py:爬取糗事百科的8小时最新页的段子.包含的信息 ...

  8. Python爬虫实战之爬取百度贴吧帖子

    Python爬虫实战之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 对百度贴吧的 ...

  9. Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(下)

    在Python爬虫实战(1) | 爬取豆瓣网排名前250的电影(上)中,我们最后爬出来的结果不是很完美,这对于"精益求精.追求完美的"程序猿来说怎么能够甘心 所以,今天,用pyth ...

  10. python爬取携程网游记_Python爬虫案例:爬取携程评论

    前言 之前爬取美团,马蜂窝等网站的数据都挺顺利,大众点评(这个反爬机制有点麻烦)在磕磕绊绊中也算成功(重点是网页页数的变化和关键字的隐藏替换)但携程居然遇到了瓶颈. 主要是查看源代码时发现关键商户信息 ...

最新文章

  1. 不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令
  2. Hibernate总结(二)
  3. Android开发出现Warning:Gradle version 2.10 is required. Current version is 2.8
  4. oracle 中 to_date 函数的用法
  5. 微软:本周三个安全更新 暂不会修正Excel漏洞
  6. HALCON 1D Measure 算子初识
  7. java 中的chartdata_获取Helm Charts中的文件夹列表
  8. 再来说说我喜欢的 Dotnet 5.0 C# 9
  9. code函数oracle列子,Oracle Pivot函数语法详解及应用实例
  10. jQuery获取iframe中页面的高度
  11. 张一鸣的大学四年收获及工作感悟
  12. 项目评价指标 误差回归_了解回归误差指标
  13. oracle热备是什么意思,Oracle冷备和热备脚本
  14. 判断分数是否为无限循环小数
  15. 林信良(良葛格)在CSDN上也开专栏了~
  16. 学习C C++的必备技能(1)
  17. 【经济学视频课程】科斯定理的本质…
  18. win10安装PS和AI后报代码为16的错误解决方法
  19. mysql如何盈利_mysql到底是不是免费的?
  20. 唯品会php接口,唯品会开放平台

热门文章

  1. linux 0.0.1
  2. 关于量子力学的我们胡思乱想(一)
  3. google官方《搜索引擎优化指南》
  4. 和软件MVP相比,打造硬件产品的MVP真的更难吗?
  5. ZigBee网络基础
  6. 音频视频解决方案:GStreamer-ffmpeg-ffdshow-directshow-vfw
  7. 解决插件在word中的宏禁用问题。MathType, Microsoft Office, powerpoint
  8. 使用脚本创建客户虚拟机模板 (文档 ID 2089028.1)
  9. java 二进制位运算_Java中的二进制与位运算
  10. c++商品销售管理系统实现