爬虫能够帮我们收集到很多信息。
我想获取携程各个票的信息,虽然一个一个城市的输入也可以得到想要的信息,但是为了模块化的获取信息,我们应该对城市(city)信息建立一个字典,所以需要得到携程提供的城市名称缩写。

前提

编译IDA:pycharm 社区版
python版本:python3.7.4
用到的库:json(自带)、re(自带)、requests(导入)、pymysql(导入)

pip install requests
pip install pymysql

步骤

1、查看携程信息
发现这个不是放在 HTML 中,查看XHR,是 json 中,所以不是简单的获取界面,需要统一资源定位器(url)和请求头(headers)。
(1)提供的接口(api):https://flights.ctrip.com/itinerary/api/poi/get
(2)需要找到请求头 headers
(3)参数里面没有东西,说明不需要请求载荷(payload)

2、获取 json 信息
可以发现已经获取 json 信息,即所有的数据

import requests
import json# 固定提供的 api 接口url = "https://flights.ctrip.com/itinerary/api/poi/get"# 根据自己的请求头修改headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0","Referer": "https://flights.ctrip.com/itinerary","Content-Type": "application/json"}# get请求response = requests.get(url, headers=headers).textprint(response)


3、提炼信息
但是我们只要城市名称、城市缩写
所以我们要一层一层的剥离,然后取出我们想要的信息
我们想要的信息就在 data->ABCDEF(其中一个)->A(其中一个)->0(其中一个)中
应为字母他不是有规律的,所以需要分开写,我还是编写的一个模块统一处理
“ABCDEF”、 “GHIJ” 、“KLMN”、“PQRSTUVW”、 “XYZ”(少了一个O,而且有的里面没有信息,需要判断一下)

def getData(Data, letters):# 求长度,等下会用到的下标length = len(letters)# 得到各字母串的 json 信息letter = Data.get(letters)# 挨个字母城市信息for i in range(0, length):# 字母 I 中没有东西,所以需要判断一下去掉if letter.get(letters[i]) is not None:# 每个城市信息character = letter.get(letters[i])for info in character:# 取自己想要的信息CN = info.get('display')# 取 左移三位到结尾的信息(即城市缩写)cityData = info.get('data')# 取编号EN = cityData[-3:]num = re.findall(r"\d+", cityData)# 不换行输出 格式为:('阿勒泰': 'AAT' )# print("'"+CN+"'"+":"+" '"+EN+"'"+", ", end="")print(CN, EN, num[0])# print(num)# 增加至数据库# sql = "insert into city(CN, EN, num) values('%s','%s',%d)" % (CN, EN, int(num[0]))# mysql(sql)print("")

主函数中

 # get请求response = requests.get(url, headers=headers).text# 以下都是 json 请求# print(response)data = json.loads(response).get('data')# print(data)getData(data, "ABCDEF")getData(data, "GHIJ")getData(data, "KLMN")# 少了一个字母OgetData(data, "PQRSTUVW")getData(data, "XYZ")


4、存入数据库
其实到这里就差不多结束了,不一定要存入数据库,最后还是决定写一写吧。
也很简单,就是数据库操作,只要会数据库应该没问题
封装数据库函数,在获取信息处把信息存入数据库(即getData中)

import pymysqldef mysql(sql):# IP, 端口, 用户名,密码,一个数据库db = pymysql.connect(host="localhost",port=3308,user="root",password="123456",database="携程")cur = db.cursor()try:# 执行sql语句cur.execute(sql)db.commit()except Exception as e:raise efinally:db.close()

添加语句

 # 增加至数据库sql = "insert into city(CN, EN, num) values('%s','%s',%d)" % (CN, EN, int(num[0]))mysql(sql)

整体代码

import requests
import json
import pymysql
import redef mysql(sql):# IP, 端口, 用户名,密码,一个数据库db = pymysql.connect(host="localhost",port=3308,user="root",password="123456",database="携程")cur = db.cursor()try:# 执行sql语句cur.execute(sql)db.commit()except Exception as e:raise efinally:db.close()def getData(Data, letters):# 求长度,等下会用到的下标length = len(letters)# 得到各字母串的 json 信息letter = Data.get(letters)# 挨个字母城市信息for i in range(0, length):# 字母 I 中没有东西,所以需要判断一下去掉if letter.get(letters[i]) is not None:# 每个城市信息character = letter.get(letters[i])for info in character:# 取自己想要的信息CN = info.get('display')cityData = info.get('data')# 取左移三位到结尾的信息(即城市缩写)EN = cityData[-3:]# 取编号num = re.findall(r"\d+", cityData)# 不换行输出 格式为:('阿勒泰': 'AAT' )print("'"+CN+"'"+":"+" '"+EN+"'"+", ", end="")# print(CN, EN, num[0])# 增加至数据库# sql = "insert into city(CN, EN, num) values('%s','%s',%d)" % (CN, EN, int(num[0]))# mysql(sql)print("")if __name__ == "__main__":# 固定提供的 api 接口url = "https://flights.ctrip.com/itinerary/api/poi/get"# 根据自己的请求头修改headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0","Referer": "https://flights.ctrip.com","Content-Type": "application/json"}# get请求response = requests.get(url, headers=headers).text# 以下都是 json 请求# print(response)data = json.loads(response).get('data')# print(data)getData(data, "ABCDEF")getData(data, "GHIJ")getData(data, "KLMN")# 少了一个字母OgetData(data, "PQRSTUVW")getData(data, "XYZ")

总结

1、主要是找到接口、找到请求头、判断请求载荷
2、对信息一层层的剥离、获取
3、其中有一点错误,就是荆门因为名字中有数字,导致他的num编号正则表达式提取为1,需要手动修改下为1121

为什么格式是这样的,当然是当字典用啊,直接复制就行了

city = {'阿勒泰': 'AAT', '阿克苏': 'AKU', '鞍山': 'AOG', '安庆': 'AQG', '安顺': 'AVA', '阿拉善左旗': 'AXF', '澳门': 'MFM', '阿里': 'NGQ','阿拉善右旗': 'RHT', '阿尔山': 'YIE', '巴中': 'BZX', '百色': 'AEB', '包头': 'BAV', '毕节': 'BFJ', '北海': 'BHY', '北京': 'BJS','北京(南苑机场)': 'NAY', '北京(首都国际机场)': 'PEK', '博乐': 'BPL', '保山': 'BSD', '白城': 'DBC', '布尔津': 'KJI', '白山': 'NBS','巴彦淖尔': 'RLK', '昌都': 'BPX', '承德': 'CDE', '常德': 'CGD', '长春': 'CGQ', '朝阳': 'CHG', '赤峰': 'CIF', '长治': 'CIH','重庆': 'CKG', '长沙': 'CSX', '成都': 'CTU', '沧源': 'CWJ', '常州': 'CZX', '池州': 'JUH', '潮州': 'SWA', '潮汕': 'SWA','大同': 'DAT', '达县': 'DAX', '达州': 'DAX', '稻城': 'DCY', '丹东': 'DDG', '迪庆': 'DIG', '大连': 'DLC', '大理': 'DLU','敦煌': 'DNH', '东营': 'DOY', '大庆': 'DQA', '德令哈': 'HXD', '德宏': 'LUM', '鄂尔多斯': 'DSN', '额济纳旗': 'EJN', '恩施': 'ENH','二连浩特': 'ERL', '福州': 'FOC', '阜阳': 'FUG', '抚远': 'FYJ', '富蕴': 'FYN','广州': 'CAN', '果洛': 'GMQ', '格尔木': 'GOQ', '广元': 'GYS', '固原': 'GYU', '高雄': 'KHH', '赣州': 'KOW', '贵阳': 'KWE','桂林': 'KWL', '红原': 'AHJ', '海口': 'HAK', '河池': 'HCJ', '邯郸': 'HDG', '黑河': 'HEK', '呼和浩特': 'HET', '合肥': 'HFE','杭州': 'HGH', '淮安': 'HIA', '怀化': 'HJJ', '海拉尔': 'HLD', '哈密': 'HMI', '衡阳': 'HNY', '哈尔滨': 'HRB', '和田': 'HTN','花土沟': 'HTT', '花莲': 'HUN', '霍林郭勒': 'HUO', '惠阳': 'HUZ', '惠州': 'HUZ', '汉中': 'HZG', '黄山': 'TXN', '呼伦贝尔': 'XRQ','嘉义': 'CYI', '景德镇': 'JDZ', '加格达奇': 'JGD', '嘉峪关': 'JGN', '井冈山': 'JGS', '景洪': 'JHG', '金昌': 'JIC', '九江': 'JIU','晋江': 'JJN', '荆门': 'JM1', '佳木斯': 'JMU', '济宁': 'JNG', '锦州': 'JNZ', '建三江': 'JSJ', '鸡西': 'JXA', '九寨沟': 'JZH','金门': 'KNH', '揭阳': 'SWA', '济南': 'TNA','库车': 'KCA', '康定': 'KGT', '喀什': 'KHG', '凯里': 'KJH', '昆明': 'KMG', '库尔勒': 'KRL', '克拉玛依': 'KRY', '黎平': 'HZH','澜沧': 'JMJ', '连城': 'LCX', '龙岩': 'LCX', '临汾': 'LFQ', '兰州': 'LHW', '丽江': 'LJG', '荔波': 'LLB', '吕梁': 'LLV','临沧': 'LNJ', '陇南': 'LNL', '六盘水': 'LPF', '拉萨': 'LXA', '洛阳': 'LYA', '连云港': 'LYG', '临沂': 'LYI', '柳州': 'LZH','泸州': 'LZO', '林芝': 'LZY', '芒市': 'LUM', '牡丹江': 'MDG', '马祖': 'MFK', '绵阳': 'MIG', '梅县': 'MXZ', '梅州': 'MXZ','马公': 'MZG', '满洲里': 'NZH', '漠河': 'OHE', '南昌': 'KHN', '南竿': 'LZN', '南充': 'NAO', '宁波': 'NGB', '南京': 'NKG','宁蒗': 'NLH', '南宁': 'NNG', '南阳': 'NNY', '南通': 'NTG','澎湖列岛': 'MZG', '攀枝花': 'PZI', '普洱': 'SYM', '琼海': 'BAR', '秦皇岛': 'BPE', '祁连': 'HBQ', '且末': 'IQM', '庆阳': 'IQN','黔江': 'JIQ', '泉州': 'JJN', '衢州': 'JUZ', '齐齐哈尔': 'NDG', '青岛': 'TAO', '日照': 'RIZ', '日喀则': 'RKZ', '若羌': 'RQA','神农架': 'HPG', '石狮': 'JJN', '莎车': 'QSZ', '上海': 'SHA', '上海(浦东国际机场)': 'PVG', '上海(虹桥国际机场)': 'SHA', '沈阳': 'SHE','石河子': 'SHF', '石家庄': 'SJW', '上饶': 'SQD', '三明': 'SQJ', '汕头': 'SWA', '三亚': 'SYX', '深圳': 'SZX', '十堰': 'WDS','邵阳': 'WGN', '松原': 'YSQ', '台州': 'HYN', '台中': 'RMQ', '塔城': 'TCG', '腾冲': 'TCZ', '铜仁': 'TEN', '通辽': 'TGO','天水': 'THQ', '吐鲁番': 'TLQ', '通化': 'TNH', '台南': 'TNN', '台北': 'TPE', '天津': 'TSN', '台东': 'TTT', '唐山': 'TVS','太原': 'TYN', '泰州': 'YTY', '五大连池': 'DTU', '乌兰浩特': 'HLH', '乌兰察布': 'UCB', '乌鲁木齐': 'URC', '潍坊': 'WEF', '威海': 'WEH','文山': 'WNH', '温州': 'WNZ', '乌海': 'WUA', '武汉': 'WUH', '武夷山': 'WUS', '无锡': 'WUX', '梧州': 'WUZ', '万州': 'WXN','乌拉特中旗': 'WZQ','兴义': 'ACX', '香格里拉': 'DIG', '夏河': 'GXH', '香港': 'HKG', '西双版纳': 'JHG', '新源': 'NLT', '西安': 'SIA', '咸阳': 'SIA','忻州': 'WUT', '信阳': 'XAI', '襄阳': 'XFN', '西昌': 'XIC', '锡林浩特': 'XIL', '厦门': 'XMN', '西宁': 'XNN', '徐州': 'XUZ','延安': 'ENY', '银川': 'INC', '伊春': 'LDS', '永州': 'LLF', '榆林': 'UYN', '宜宾': 'YBP', '运城': 'YCU', '宜春': 'YIC','宜昌': 'YIH', '伊犁': 'YIN', '伊宁': 'YIN', '义乌': 'YIW', '营口': 'YKH', '延吉': 'YNJ', '烟台': 'YNT', '盐城': 'YNZ','扬州': 'YTY', '玉树': 'YUS', '岳阳': 'YYA', '郑州': 'CGO', '张家界': 'DYG', '芷江': 'HJJ', '舟山': 'HSN', '扎兰屯': 'NZL','张掖': 'YZY', '昭通': 'ZAT', '湛江': 'ZHA', '中卫': 'ZHY', '张家口': 'ZQZ', '珠海': 'ZUH', '遵义': 'ZYI',
}

python爬虫——获取携程城市缩写(存入数据库)相关推荐

  1. python爬虫获取携程旅游景点评分和评论

    写在前面:酒店和旅游景点方式不同,不能用我的写法,如果获取酒店数据请参考:https://blog.csdn.net/qq_34774456/article/details/89885296 旅游景点 ...

  2. python爬虫爬取大学排名并存入数据库进行数据可视化

    这是本人的期末大作业,题目要求如下: 对中国大学专业排名网站中2021年,计算机科学与技术专业,进行数据爬取和数据可视化. URL地址:https://www.shanghairanking.cn/r ...

  3. python爬虫获取双色球历史中奖纪录写入数据库

    from datetime import datetime import pymysql import requests import time import re import urllib.req ...

  4. Python爬虫获取简书的用户、文章、评论、图片等数据,并存入数据库

    Python爬虫获取简书的用户.文章.评论.图片等数据,并存入数据库 爬虫定义:网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维 ...

  5. python爬取携程机票并发送过滤后的机票信息到指定邮箱

    0x0 前言 在疫情发生之前,在知乎上刷到一个回答,说是用服务器实现一个自动爬取机票并将过滤后的机票信息发送到自己的邮箱中,感觉十分有趣.由于疫情原因无法返校,加上家和学校相隔接近3000公里,再加上 ...

  6. 编写python爬虫 获取中华英才网全网工资数据

    做数据分析 数据挖掘,第一步是获取数据,在这里,我们要分析现今全国各地各个职业的工资情况. 我们选择较为权威的'中华英才网',编写python爬虫获取该网站上的各个招聘信息说给出的工资,再取其行业工资 ...

  7. python爬取携程景区用户评论

    python爬取携程景区用户评论(爬虫时遇到翻页但url不变问题时的解决办法) python爬取携程景区用户评论 Ajax页面加载的页面和普通页面的不同 解决办法 效果 python爬取携程景区用户评 ...

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

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

  9. Python爬取携程机票代码实例

    Python爬取携程机票代码实例 现在携程的页面是通过接口传递数据的,不能直接使用xpath进行解析,需要模拟调用接口的步骤 dcity是指出发地的城市编码 acity是指目的地的城市编码 其他参数是 ...

最新文章

  1. 如何使用jQuery创建“请稍候,正在加载...”动画?
  2. Spring入门(三)之IoC
  3. 将PDF和Gutenberg文档格式转换为文本:生产中的自然语言处理
  4. matplotlib柱状图上方显示数据_使用 matplotlib 的两种姿势
  5. Js获取file上传控件的文件路径总结
  6. android电视开发远程开关机,一种电视电脑一体机及其实现远程开关机控制的方法...
  7. 【JanusGraph入门】(第一天,下载项目)
  8. Mac的Adobe Creative Cloud无法连接至服务器解决方法
  9. 這是一位女生寫的 - 男生如何追求女生
  10. php 微信 图片 文字 朋友圈,朋友圈实现图片+文字转发功能(必看篇)
  11. Exception evaluating SpringEL expression: ***错误的一个解决办法
  12. c语言结构体简单试题,C语言6结构体练习题6
  13. 虚拟盒子下装linux系统,eUnoBox(虚拟盒子) v3.14免费版
  14. 基于ssm框架的农产品扶农商农平台的设计与实现
  15. 【降维打击】希尔伯特曲线
  16. gallary滑动切换图片
  17. C语言 文件的打开方式
  18. Mentor Expedition如何极坐标旋转添加器件?
  19. SpringBoot+Vue实现前后端分离的在线考试报名系统
  20. 数据库作业:SQL练习4 - SELECT(连接查询、嵌套查询)

热门文章

  1. 尝试:百炫录音盒软件开源
  2. Simulink示波器显示一列多行(大于4)波形
  3. 学着做的第一个小游戏 flappyBrid 飞翔的小鸟 有图片资源
  4. crc32 mysql_mysql使用crc32字段建索引提高查询效率
  5. KC认证加急费用周期
  6. 钉钉运用php技术流程图,钉钉操作流程图
  7. 在线问卷调查平台的创业体会
  8. GIS地理信息系统及海洋应用(赵玉新,李刚)
  9. 最好的多目标跟踪(MOT)入门介绍!
  10. UNIX高级环境编程—第八章进程控制