我们先看一下携程网的信息
从以上我们可以获取两个信息
1、我是从上海到成都的
2、7条航班信息
教你如何爬虫
我不教静态网页的爬虫,因为太简单了;我们直接上手携程网
我们到这个上述这个页面以后,我推荐用谷歌浏览器,方便;
1、谷歌浏览器
2、携程网显示机票信息页面
3、f12
4、然后我们刷新页面,network下就有很多的文件了
选择XHR,然后出现以下几条信息
点击其中一条,然后点击右侧的preview
我们可以看到里面有数据,不一定是第一条,我们查看里面的数据有没有我们要的信息
举个例子,其中的pageData,我们点击,然后发现previewer里面的数据很少,根本没有一条是我们需要的;所以肯定不是pageData这个文件
其实是第一条product
现在已经有眉目了,我们需要这个product文件的信息,点击Headers
从上面我们可以知道我们爬虫的地址是url = 'http://flights.ctrip.com/itinerary/api/12808/products'
这个请求是post请求;那么我们需要发送什么样的数据才会有这样的结果呢?
废话不多说,直接贴上代码
爬虫携程网
from prettytable import PrettyTable
import requests
import json
import pymysql
def xiecheng(dcity, acity, date):
date = date[0:4] + '-' + date[4:6] + '-' + date[6:8]
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0",
"Content-Type": "application/json", # 声明文本类型为 json 格式
"referer": r"https://flights.ctrip.com/itinerary/oneway/SHA-TAO?date=2020-04-11"
}
city = {'阿尔山': 'YIE', '阿克苏': 'AKU', '阿拉善右旗': 'RHT', '阿拉善左旗': 'AXF', '阿勒泰': 'AAT', '阿里': 'NGQ', '澳门': 'MFM',
'安庆': 'AQG', '安顺': 'AVA', '鞍山': 'AOG', '巴彦淖尔': 'RLK', '百色': 'AEB', '包头': 'BAV', '保山': 'BSD', '北海': 'BHY',
'北京': 'BJS', '白城': 'DBC', '白山': 'NBS', '毕节': 'BFJ', '博乐': 'BPL', '重庆': 'CKG', '昌都': 'BPX', '常德': 'CGD',
'常州': 'CZX', '朝阳': 'CHG', '成都': 'CTU', '池州': 'JUH', '赤峰': 'CIF', '揭阳': 'SWA', '长春': 'CGQ', '长沙': 'CSX',
'长治': 'CIH', '承德': 'CDE', '沧源': 'CWJ', '达县': 'DAX', '大理': 'DLU', '大连': 'DLC', '大庆': 'DQA', '大同': 'DAT',
'丹东': 'DDG', '稻城': 'DCY', '东营': 'DOY', '敦煌': 'DNH', '芒市': 'LUM', '额济纳旗': 'EJN', '鄂尔多斯': 'DSN', '恩施': 'ENH',
'二连浩特': 'ERL', '佛山': 'FUO', '福州': 'FOC', '抚远': 'FYJ', '阜阳': 'FUG', '赣州': 'KOW', '格尔木': 'GOQ', '固原': 'GYU',
'广元': 'GYS', '广州': 'CAN', '贵阳': 'KWE', '桂林': 'KWL', '哈尔滨': 'HRB', '哈密': 'HMI', '海口': 'HAK', '海拉尔': 'HLD',
'邯郸': 'HDG', '汉中': 'HZG', '杭州': 'HGH', '合肥': 'HFE', '和田': 'HTN', '黑河': 'HEK', '呼和浩特': 'HET', '淮安': 'HIA',
'怀化': 'HJJ', '黄山': 'TXN', '惠州': 'HUZ', '鸡西': 'JXA', '济南': 'TNA', '济宁': 'JNG', '加格达奇': 'JGD', '佳木斯': 'JMU',
'嘉峪关': 'JGN', '金昌': 'JIC', '金门': 'KNH', '锦州': 'JNZ', '嘉义': 'CYI', '西双版纳': 'JHG', '建三江': 'JSJ', '晋江': 'JJN',
'井冈山': 'JGS', '景德镇': 'JDZ', '九江': 'JIU', '九寨沟': 'JZH', '喀什': 'KHG', '凯里': 'KJH', '康定': 'KGT', '克拉玛依': 'KRY',
'库车': 'KCA', '库尔勒': 'KRL', '昆明': 'KMG', '拉萨': 'LXA', '兰州': 'LHW', '黎平': 'HZH', '丽江': 'LJG', '荔波': 'LLB',
'连云港': 'LYG', '六盘水': 'LPF', '临汾': 'LFQ', '林芝': 'LZY', '临沧': 'LNJ', '临沂': 'LYI', '柳州': 'LZH', '泸州': 'LZO',
'洛阳': 'LYA', '吕梁': 'LLV', '澜沧': 'JMJ', '龙岩': 'LCX', '满洲里': 'NZH', '梅州': 'MXZ', '绵阳': 'MIG', '漠河': 'OHE',
'牡丹江': 'MDG', '马祖': 'MFK', '南昌': 'KHN', '南充': 'NAO', '南京': 'NKG', '南宁': 'NNG', '南通': 'NTG', '南阳': 'NNY',
'宁波': 'NGB', '宁蒗': 'NLH', '攀枝花': 'PZI', '普洱': 'SYM', '齐齐哈尔': 'NDG', '黔江': 'JIQ', '且末': 'IQM', '秦皇岛': 'BPE',
'青岛': 'TAO', '庆阳': 'IQN', '衢州': 'JUZ', '日喀则': 'RKZ', '日照': 'RIZ', '三亚': 'SYX', '厦门': 'XMN', '上海': 'SHA',
'深圳': 'SZX', '神农架': 'HPG', '沈阳': 'SHE', '石家庄': 'SJW', '塔城': 'TCG', '台州': 'HYN', '太原': 'TYN', '扬州': 'YTY',
'唐山': 'TVS', '腾冲': 'TCZ', '天津': 'TSN', '天水': 'THQ', '通辽': 'TGO', '铜仁': 'TEN', '吐鲁番': 'TLQ', '万州': 'WXN',
'威海': 'WEH', '潍坊': 'WEF', '温州': 'WNZ', '文山': 'WNH', '乌海': 'WUA', '乌兰浩特': 'HLH', '乌鲁木齐': 'URC', '无锡': 'WUX',
'梧州': 'WUZ', '武汉': 'WUH', '武夷山': 'WUS', '西安': 'SIA', '西昌': 'XIC', '西宁': 'XNN', '锡林浩特': 'XIL',
'香格里拉(迪庆)': 'DIG',
'襄阳': 'XFN', '兴义': 'ACX', '徐州': 'XUZ', '香港': 'HKG', '烟台': 'YNT', '延安': 'ENY', '延吉': 'YNJ', '盐城': 'YNZ',
'伊春': 'LDS',
'伊宁': 'YIN', '宜宾': 'YBP', '宜昌': 'YIH', '宜春': 'YIC', '义乌': 'YIW', '银川': 'INC', '永州': 'LLF', '榆林': 'UYN',
'玉树': 'YUS',
'运城': 'YCU', '湛江': 'ZHA', '张家界': 'DYG', '张家口': 'ZQZ', '张掖': 'YZY', '昭通': 'ZAT', '郑州': 'CGO', '中卫': 'ZHY',
'舟山': 'HSN',
'珠海': 'ZUH', '遵义(茅台)': 'WMT', '遵义(新舟)': 'ZYI'}
url = 'http://flights.ctrip.com/itinerary/api/12808/products'
request_payload = {"flightWay": "Oneway",
"classType": "ALL",
"hasChild": 'false',
"hasBaby": 'false',
"searchIndex": 1,
"airportParams": [
{"dcity": city.get(dcity), "acity": city.get(acity), "dcityname": dcity, "acityname": acity,
"date": date}]}
# 这里传进去的参数必须为 json 格式
response = requests.post(url, data=json.dumps(request_payload), headers=headers).text
routeList = json.loads(response).get('data').get('routeList')
#循环这个数据集合
print(routeList)
for route in routeList:
if len(route.get('legs')) == 1:
info = {}
legs = route.get('legs')[0]
flight = legs.get('flight')
airlineName= flight.get('airlineName')# company
flightNumber= flight.get('flightNumber')# companyid
airportName=flight.get('departureAirportInfo').get('airportName')#portname
departureDate=flight.get('departureDate')#starttime
arrivalDate=flight.get('arrivalDate')#endtime
punctualityRate= flight.get('punctualityRate')#rate
#price
cabins = legs.get('cabins')[0].get('price')
price= cabins.get('price')
#存储到数据库中
print("路线:",airlineName,flightNumber,airportName,departureDate,arrivalDate,punctualityRate,price)
print(dcity, '------->', acity, date)
if __name__ == "__main__":
dcity ="上海"
acity ="青岛"
date ="20200411"
xiecheng(dcity, acity, date)
效果如下
一模一样;
现在我们将这些信息存储数据库里面
效果如下图所示
我用的是mysql数据库,如果是其他的,可以百度一下连接代码,基本上差不多
from prettytable import PrettyTable
import requests
import json
import pymysql
def create():
db = pymysql.connect("localhost", "root", "123456", "app") # 连接数据库
cursor = db.cursor()
cursor.execute("DROP TABLE IF EXISTS LINE")
sql = """CREATE TABLE LINE (
ID INT PRIMARY KEY AUTO_INCREMENT,
airlineName CHAR(255),
flightNumber CHAR(255),
airportName CHAR(255),
departureDate CHAR(255),
arrivalDate CHAR(255),
punctualityRate CHAR(255),
price CHAR(255))"""
cursor.execute(sql)
db.close()
def insert(value):
db = pymysql.connect("localhost", "root", "123456", "app")
cursor = db.cursor()
sql = "INSERT INTO LINE(airlineName,flightNumber,airportName,departureDate,arrivalDate,punctualityRate,price) VALUES (%s,%s,%s,%s,%s,%s,%s)"
try:
cursor.execute(sql, value)
db.commit()
print('插入数据成功')
except:
db.rollback()
print("插入数据失败")
db.close()
def xiecheng(dcity, acity, date):
date = date[0:4] + '-' + date[4:6] + '-' + date[6:8]
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0",
"Content-Type": "application/json", # 声明文本类型为 json 格式
"referer": r"https://flights.ctrip.com/itinerary/oneway/SHA-TAO?date=2020-04-11"
}
city = {'阿尔山': 'YIE', '阿克苏': 'AKU', '阿拉善右旗': 'RHT', '阿拉善左旗': 'AXF', '阿勒泰': 'AAT', '阿里': 'NGQ', '澳门': 'MFM',
'安庆': 'AQG', '安顺': 'AVA', '鞍山': 'AOG', '巴彦淖尔': 'RLK', '百色': 'AEB', '包头': 'BAV', '保山': 'BSD', '北海': 'BHY',
'北京': 'BJS', '白城': 'DBC', '白山': 'NBS', '毕节': 'BFJ', '博乐': 'BPL', '重庆': 'CKG', '昌都': 'BPX', '常德': 'CGD',
'常州': 'CZX', '朝阳': 'CHG', '成都': 'CTU', '池州': 'JUH', '赤峰': 'CIF', '揭阳': 'SWA', '长春': 'CGQ', '长沙': 'CSX',
'长治': 'CIH', '承德': 'CDE', '沧源': 'CWJ', '达县': 'DAX', '大理': 'DLU', '大连': 'DLC', '大庆': 'DQA', '大同': 'DAT',
'丹东': 'DDG', '稻城': 'DCY', '东营': 'DOY', '敦煌': 'DNH', '芒市': 'LUM', '额济纳旗': 'EJN', '鄂尔多斯': 'DSN', '恩施': 'ENH',
'二连浩特': 'ERL', '佛山': 'FUO', '福州': 'FOC', '抚远': 'FYJ', '阜阳': 'FUG', '赣州': 'KOW', '格尔木': 'GOQ', '固原': 'GYU',
'广元': 'GYS', '广州': 'CAN', '贵阳': 'KWE', '桂林': 'KWL', '哈尔滨': 'HRB', '哈密': 'HMI', '海口': 'HAK', '海拉尔': 'HLD',
'邯郸': 'HDG', '汉中': 'HZG', '杭州': 'HGH', '合肥': 'HFE', '和田': 'HTN', '黑河': 'HEK', '呼和浩特': 'HET', '淮安': 'HIA',
'怀化': 'HJJ', '黄山': 'TXN', '惠州': 'HUZ', '鸡西': 'JXA', '济南': 'TNA', '济宁': 'JNG', '加格达奇': 'JGD', '佳木斯': 'JMU',
'嘉峪关': 'JGN', '金昌': 'JIC', '金门': 'KNH', '锦州': 'JNZ', '嘉义': 'CYI', '西双版纳': 'JHG', '建三江': 'JSJ', '晋江': 'JJN',
'井冈山': 'JGS', '景德镇': 'JDZ', '九江': 'JIU', '九寨沟': 'JZH', '喀什': 'KHG', '凯里': 'KJH', '康定': 'KGT', '克拉玛依': 'KRY',
'库车': 'KCA', '库尔勒': 'KRL', '昆明': 'KMG', '拉萨': 'LXA', '兰州': 'LHW', '黎平': 'HZH', '丽江': 'LJG', '荔波': 'LLB',
'连云港': 'LYG', '六盘水': 'LPF', '临汾': 'LFQ', '林芝': 'LZY', '临沧': 'LNJ', '临沂': 'LYI', '柳州': 'LZH', '泸州': 'LZO',
'洛阳': 'LYA', '吕梁': 'LLV', '澜沧': 'JMJ', '龙岩': 'LCX', '满洲里': 'NZH', '梅州': 'MXZ', '绵阳': 'MIG', '漠河': 'OHE',
'牡丹江': 'MDG', '马祖': 'MFK', '南昌': 'KHN', '南充': 'NAO', '南京': 'NKG', '南宁': 'NNG', '南通': 'NTG', '南阳': 'NNY',
'宁波': 'NGB', '宁蒗': 'NLH', '攀枝花': 'PZI', '普洱': 'SYM', '齐齐哈尔': 'NDG', '黔江': 'JIQ', '且末': 'IQM', '秦皇岛': 'BPE',
'青岛': 'TAO', '庆阳': 'IQN', '衢州': 'JUZ', '日喀则': 'RKZ', '日照': 'RIZ', '三亚': 'SYX', '厦门': 'XMN', '上海': 'SHA',
'深圳': 'SZX', '神农架': 'HPG', '沈阳': 'SHE', '石家庄': 'SJW', '塔城': 'TCG', '台州': 'HYN', '太原': 'TYN', '扬州': 'YTY',
'唐山': 'TVS', '腾冲': 'TCZ', '天津': 'TSN', '天水': 'THQ', '通辽': 'TGO', '铜仁': 'TEN', '吐鲁番': 'TLQ', '万州': 'WXN',
'威海': 'WEH', '潍坊': 'WEF', '温州': 'WNZ', '文山': 'WNH', '乌海': 'WUA', '乌兰浩特': 'HLH', '乌鲁木齐': 'URC', '无锡': 'WUX',
'梧州': 'WUZ', '武汉': 'WUH', '武夷山': 'WUS', '西安': 'SIA', '西昌': 'XIC', '西宁': 'XNN', '锡林浩特': 'XIL',
'香格里拉(迪庆)': 'DIG',
'襄阳': 'XFN', '兴义': 'ACX', '徐州': 'XUZ', '香港': 'HKG', '烟台': 'YNT', '延安': 'ENY', '延吉': 'YNJ', '盐城': 'YNZ',
'伊春': 'LDS',
'伊宁': 'YIN', '宜宾': 'YBP', '宜昌': 'YIH', '宜春': 'YIC', '义乌': 'YIW', '银川': 'INC', '永州': 'LLF', '榆林': 'UYN',
'玉树': 'YUS',
'运城': 'YCU', '湛江': 'ZHA', '张家界': 'DYG', '张家口': 'ZQZ', '张掖': 'YZY', '昭通': 'ZAT', '郑州': 'CGO', '中卫': 'ZHY',
'舟山': 'HSN',
'珠海': 'ZUH', '遵义(茅台)': 'WMT', '遵义(新舟)': 'ZYI'}
url = 'http://flights.ctrip.com/itinerary/api/12808/products'
request_payload = {"flightWay": "Oneway",
"classType": "ALL",
"hasChild": 'false',
"hasBaby": 'false',
"searchIndex": 1,
"airportParams": [
{"dcity": city.get(dcity), "acity": city.get(acity), "dcityname": dcity, "acityname": acity,
"date": date}]}
# 这里传进去的参数必须为 json 格式
response = requests.post(url, data=json.dumps(request_payload), headers=headers).text
routeList = json.loads(response).get('data').get('routeList')
#循环这个数据集合
print(routeList)
for route in routeList:
if len(route.get('legs')) == 1:
info = {}
legs = route.get('legs')[0]
flight = legs.get('flight')
airlineName= flight.get('airlineName')# company
flightNumber= flight.get('flightNumber')# companyid
airportName=flight.get('departureAirportInfo').get('airportName')#portname
departureDate=flight.get('departureDate')#starttime
arrivalDate=flight.get('arrivalDate')#endtime
punctualityRate= flight.get('punctualityRate')#rate
#price
cabins = legs.get('cabins')[0].get('price')
price= cabins.get('price')
#存储到数据库中
value=[airlineName,flightNumber,airportName,departureDate,arrivalDate,punctualityRate,price]
insert(value)
print("路线:",airlineName,flightNumber,airportName,departureDate,arrivalDate,punctualityRate,price)
print(dcity, '------->', acity, date)
if __name__ == "__main__":
dcity ="上海"
acity ="青岛"
date ="20200411"
#创建数据库
create()
xiecheng(dcity, acity, date)