初学 python 。

近期公司由于业务原因,需要想办法获取到携程与去哪儿的机票信息。

于是我尝试用 python+urllib 对这两个网站上的信息进行抓取。

去哪儿的爬虫代码如下:(初学 python 。代码有很多不合理之处。望海涵。)

# -*- coding:utf-8 -*-

import urllib

from urllib import request

class QunaerSpider:

__query_flights_base_url = 'http://flight.qunar.com/twelli/longwell?'

__user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103'

__referer_base_url = 'http://flight.qunar.com/site/interroundtrip_compare.htm?'

__referer_end_url = '&from=fi_re_search&lowestPrice=null&isInter=true&favoriteKey=&showTotalPr=null'

def create_flights_query_url(self, from_city, from_date, to_city, to_date):

"""根据用户传参,返回组装好的机票请求用 String 格式的 url 数据

Args:

from_city: 出发城市

from_date: 出发日期

to_city: 抵达城市

to_date: 抵达日期

Returns:

返回组装好的机票请求用 String 格式的 url 数据.

Raise:

None

"""

from_city_encoded = urllib.request.quote(from_city.encode('utf-8'))

from_date_encoded = urllib.request.quote(from_date)

to_city_encoded = urllib.request.quote(to_city.encode('utf-8'))

to_date_encoded = urllib.request.quote(to_date)

url = QunaerSpider.__query_flights_base_url

# 初始化参数对象

parameter_dict = {}

parameter_dict['from'] = 'qunarindex'

parameter_dict['fromCity'] = from_city_encoded

parameter_dict['fromDate'] = from_date_encoded

parameter_dict['isInter'] = 'true'

parameter_dict['prePay'] = 'true'

parameter_dict['locale'] = 'zh'

parameter_dict['mergeFlag'] = '0'

parameter_dict['nextNDays'] = '0'

parameter_dict['op'] = '1'

parameter_dict['reset'] = 'true'

parameter_dict['searchLangs'] = 'zh'

parameter_dict['searchType'] = 'RoundTripFlight'

parameter_dict['toCity'] = to_city_encoded

parameter_dict['toDate'] = to_date_encoded

parameter_dict['version'] = 'thunder'

parameter_dict['http://www.travelco.com/searchArrivalAirport'] = to_city_encoded

parameter_dict['http://www.travelco.com/searchDepartureAirport'] = from_city_encoded

parameter_dict['http://www.travelco.com/searchDepartureTime'] = from_date_encoded

parameter_dict['http://www.travelco.com/searchReturnTime'] = to_date_encoded

# f+时间戳

parameter_dict['xd'] = 'f1469358871776'

parameter_dict['www'] = 'true'

parameter_dict['wyf'] = '0P8HfQ5%2F%2FYA%2FWldSERAyfudSERU0dUd0ERPj%3D%3D%3D%3D%7C1441321882698'

parameter_dict['departureCity'] = from_city_encoded

parameter_dict['arrivalCity'] = to_city_encoded

parameter_dict['departureDate'] = from_date_encoded

parameter_dict['returnDate'] = to_date_encoded

# token.加不加暂时看不出来什么影响

parameter_dict['_token'] = '6455'

# 拼装 query_rul

for k, v in parameter_dict.items():

url = url + '&' + k + '=' + v

print('请求字符串为\n%s' % url)

return url

def create_referer_url(self, from_city, from_date, to_city, to_date):

from_city_encoded = urllib.request.quote(from_city.encode('utf-8'))

from_date_encoded = urllib.request.quote(from_date)

to_city_encoded = urllib.request.quote(to_city.encode('utf-8'))

to_date_encoded = urllib.request.quote(to_date)

url = QunaerSpider.__referer_base_url

# 初始化参数对象

parameter_dict = {}

parameter_dict['from'] = 'qunarindex'

parameter_dict['fromCity'] = from_city_encoded

parameter_dict['fromDate'] = from_date_encoded

parameter_dict['toCity'] = to_city_encoded

parameter_dict['toDate'] = to_date_encoded

# TODO 暂时写死

parameter_dict['fromCode'] = 'CTU'

parameter_dict['toCode'] = 'TYO'

# 拼装 query_rul

for k, v in parameter_dict.items():

url = url + '&' + k + '=' + v

url += QunaerSpider.__referer_end_url

print('Referer 为\n%s' % url)

return url

def query_flights(self, url, referer_url):

"""根据用户传参,返回组装好的机票请求用 String 格式的 url 数据

Args:

url: 机票接口

Returns:

封装好的机票数据

Raise:

None

"""

req = request.Request(url)

req.add_header('Host', 'flight.qunar.com')

req.add_header('Accept', '*/*')

req.add_header('User-Agent', QunaerSpider.__user_agent)

req.add_header('Connection', 'keep-alive')

req.add_header('Accept-Encoding', 'gzip, deflate, sdch')

req.add_header('Content-Type', 'application/json')

req.add_header('Accept-Language', 'zh-CN,zh;q=0.8')

req.add_header('Referer', referer_url)

with request.urlopen(req) as f:

# 读取数据

data = f.read()

print(f.status, f.reason)

print('Data:', data.decode('utf-8'))

qunaerSpider = QunaerSpider()

referer_url = qunaerSpider.create_referer_url('成都', '2016-08-20', '东京', '2016-09-11')

url = qunaerSpider.create_flights_query_url('成都', '2016-08-20', '东京', '2016-09-11')

qunaerSpider.query_flights(url, referer_url)

去哪儿网遇到的问题

爬虫返回的信息为

200 OK

Data: {isLimit:true}

使用同样的 url ,通过浏览器却能正常访问。想知道原因以及修正办法。

携程网遇到的问题

携程网的爬虫代码还没开始写。不过大概分析了下,携程网是 post 请求。

并且每次请求时会验证“ SearchKey ”与“ TransNo ”。关于这两个参数,有有经验的同学知道是在哪里,通过什么方式获取到的吗?附上携程的请求参数列表。

{

"FlightWay": "D",

"SegmentList": [{

"DCityCode": "CTU",

"ACityCode": "TYO",

"DCity": "Chengdu|成都(CTU)|28|CTU|480",

"ACity": "Tokyo|东京(TYO)|228|TYO|540",

"DepartDate": "2016-8-1"

}, {

"DCityCode": "TYO",

"ACityCode": "CTU",

"DCity": "Tokyo|东京(TYO)|228|TYO|480",

"ACity": "Chengdu|成都(CTU)|28|CTU|540",

"DepartDate": "2016-9-10"

}],

"TransferCityID": 0,

"Quantity": 1,

// 每次请求发生变化,携程会验证此 key

"TransNo": "5516072421000033701",

"SearchRandomKey": "",

"IsAsync": 1,

"RecommendedFlightSwitch": 1,

// 每次请求发生变化。携程会验证此 key

"SearchKey": "BEBFB6F8C0C56B8561A9B435AE822DF4D499B75C2FFA74D481318741A7F9537EFB59C5327342DE0D1A11D1E626A03C6C843FE6E311D4819F",

"MultiPriceUnitSwitch": 1,

"TransferCitySwitch": false,

"EngineScoreABTest": "B",

"AdjacentDateKey": "",

"SearchStrategySwitch": 1,

"MaxSearchCount": 3,

"TicketRemarkSwitch": 1,

"RowNum": "1500",

"TicketRemarkChannels": ["GDS-WS", "ZY-WS"],

"AddSearchLogOneByOne": true,

"TFAirlineQTE": "AA",

"IsWifiPackage": 0

}

谢谢各位。

python 携程_请教两个关于使用 python 爬去哪儿,携程等机票网站的问题相关推荐

  1. python同名包_可以使用两个同名的Python包吗?

    我的初始测试(在Python2.6&3.1中)表明以下可能有效:import sys, re import foo as foo1 for k in sys.modules: if re.ma ...

  2. python keyerror解决_请教这里的大佬,关于 Python 爬虫的 keyerror 的问题

    想请教这里的大佬一个问题,在抓取图片的时候,想用 requests 库的 stream 参数显示一下下载进程,可是运行不久就会出现这种情况 说好像是没有 headers 里面没有 conent-len ...

  3. Python灰帽子_黑客与逆向工程师的Python编程之道

    收藏自用 链接:Python灰帽子_黑客与逆向工程师的Python编程之道

  4. python手机教程_一张图带你学会Python,学习Python的非常简单,附教程

    不过这张图是基于 Python 2 的(虽然影响也很小),所以我做了几个注释,也就是图上的几个数字,对内容做一点点补充说明: 关于编码,并不是一定要 UTF-8,而是要求"一致", ...

  5. python老师武_跟着廖雪峰老师学python (5)

    若想技术精进,当然得把基础知识打得牢牢的. 廖雪峰的官方网站  python3教程,该网站提供的教程浅显易懂,还附带了讲学视频,非常适合初学者正规入门. 以下是通过廖雪峰python官方网站学习的个人 ...

  6. python 面试问题_值得阅读的30个Python面试问题

    python 面试问题 Interview questions are quite tricky to predict. In most cases, even peoples with great ...

  7. go还是python 知乎_知乎用Go替代Python

    说不上哪个语言会比另一个语言更好.只能说某个语言在某个方面处理某些问题更具有优势吧. 大概每个开发人员应该都会认为自己使用的语言是世界最好的语言吧.这都相对来说的.对于每个人应该都是不同的. 众所周知 ...

  8. python实现表格_零基础小白怎么用Python做表格?

    用Python操作Excel在工作中还是挺常用的,因为毕竟不懂Excel是一个用户庞大的数据管理软件.本文用Python3!在给大家分享之前呢,小编推荐一下一个挺不错的交流宝地,里面都是一群热爱并在学 ...

  9. 怎么学python知乎_你们都是怎么学 Python 的?

    自学确实是比较难得,没有一个好的规划,好的学习路线图,你不会知道自己下一步该怎么办. 今天我就帮你来解决,分享2020年黑马程序员Python学习路线图,包含学习路线图,学习视频,学习工具,你都可以找 ...

最新文章

  1. 学会这门编程知识,可能决定你能进什么样的企业
  2. C++中的构造函数VS析构函数
  3. MapReduce基础开发之七Hive外部表分区
  4. Java设计模式透析之 —— 策略(Strategy)
  5. Linux下gcc编译生成动态链接库*.so文件并调用它
  6. 两数之和,两数相加(leetcode)
  7. html上传预览图片原理,关于html中图片上传预览的实现
  8. ios微信本地视频上传到服务器,ios本地视频wx.uploadFile上传
  9. 偷用计算机作文,偷玩电脑作文5篇
  10. Windows server 2008 R2 个人使用修改==转载+原创
  11. 利用Python实现Shp格式向GeoJSON的转换!
  12. 用spss进行数据的标准化处理_用spss怎样对数据进行标准化
  13. 如何理解 Python 之禅:Explicit is better than implicit?
  14. linux文件l是什么意思,linux 中 我看到lrwxrwxrwx 那个l是什么意思?
  15. 三菱iQ-R系列PLC控制系统项目全套资料 系统才用三菱iQ-R系列PLC,采用R04CPU
  16. LOTO 示波器 两种电流探头的对比实测
  17. composer安装fxp/composer-asset-plugin
  18. 分布式 - 谈谈你对分布式的理解,为什么引入分布式?
  19. 【++运算符重载】c++实现递增运算符重载
  20. Macbook Pro常用快捷键及问题汇总

热门文章

  1. 南昌大学计算机学硕和专硕,专硕和学硕哪个好?该怎么选?
  2. L1-049 天梯赛座位分配 (Python)
  3. 《按自己的意愿过一生》读书笔记
  4. iconv()和mb_conver_encoding()字符编码转换函数
  5. html:用script实现搜索框
  6. 最熟悉的陌生人| 长文理解基因本体论 (Gene Ontology, GO)
  7. 遍历文件夹(含子文件夹)方法
  8. 微信小程序实现类似微信评论区回复组件(mpx)
  9. acdream 1201 SuSu's Power dp
  10. webscraper多页爬取_爬虫工具实战篇(Web Scraper)- 京东商品信息爬取(原创)