由于这里的目标是获取整个自由行的产品列表,因此还需要获取出发站点的列表,从不同的城市出发,会有不用的产品。

返回自由行的首页,单击搜索框左侧的出发站点,如下图:

切换到Headers界面:

可以看到此时目标的URL是:https://touch.dujia.qunar.com/depCities.qunar

开始分析该网站的爬虫工作流程分析步骤:

1 获取出发地站点列表

2 获取旅游景点列表

3 获取景点产品列表

4 存储数据

#首先获取出发站点,代码如下:

importrequests

url= 'https://touch.dujia.qunar.com/depCities.qunar'strhtml=requests.get(url)

dep_dict=strhtml.json()for dep_item in dep_dict['data']:for dep in dep_dict['data'][dep_item]:print(dep)

。。。。。。。。。

在获取数据的时候需要将最后一个callback参数删掉。因此目标URL如下:

https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep=%E6%B7%B1%E5%9C%B3&exclude=&extensionImg=255,175

#然后根据出发地站点获取目的地,代码如下:

importtimeimporturllibimportrequests

url= 'https://touch.dujia.qunar.com/depCities.qunar'strhtml=requests.get(url)

dep_dict=strhtml.json()for dep_item in dep_dict['data']:for dep in dep_dict['data'][dep_item]:print(dep)

url= 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(urllib.request.quote(dep))

time.sleep(3)

strhtml=requests.get(url)

arrive_dict=strhtml.json()for arr_item in arrive_dict['data']:for arr_item_1 in arr_item['subModules']:for query in arr_item_1['items']:print(query['query'])

.................

到达的 目的地有很多,上面这段代码也要运行很长时间,运行截图也是一部分的,篇幅有限还有很多地点没有展示,但很容易看到许多的目的地是重复的,

原因也很简单一个目的地多数都是对应这多个出发点的,按出发点分别来找目的地的话最后打印寻找到的目的地肯定有许多也就是重复的了,所以接下来

就是要对目的地进行去重,代码修改后,如下:

#然后根据出发地站点获取目的地,代码如下:

importtimeimporturllibimportrequests

url= 'https://touch.dujia.qunar.com/depCities.qunar'strhtml=requests.get(url)

dep_dict=strhtml.json()for dep_item in dep_dict['data']:for dep in dep_dict['data'][dep_item]:#这里声明一个列表a用来保存当前这个出发点对应的所有目的地

a =[]print(dep)

url= 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(urllib.request.quote(dep))

time.sleep(3)

strhtml=requests.get(url)

arrive_dict=strhtml.json()for arr_item in arrive_dict['data']:for arr_item_1 in arr_item['subModules']:for query in arr_item_1['items']:#如果当前这个目的地不在a中的话,那就添加进去,否则不添加,这样就可以达到目的地去重的目的了

if(query['query'] not ina):

a.append(query['query'])#打印当前出发点所有对应的不重复的目的地点

print(a)

这样每个出发点对应的目的点打印出来也好看清晰了许多。

完成了出发点和目的地的构建之后,接下来就要获取产品列表了。代码如下:

#获取产品列表

importtimeimporturllibimportpymongoimportrequests#使用MongoDB创建数据库、表

client = pymongo.MongoClient('localhost',27017)

book_qunar= client['qunar']

sheet_qunar_zyx= book_qunar['qunar_zyx']#获取产品

url = 'https://touch.dujia.qunar.com/depCities.qunar'strhtml=requests.get(url)

dep_dict=strhtml.json()for dep_item in dep_dict['data']:for dep in dep_dict['data'][dep_item]:#这里声明一个列表a用来保存当前这个出发点对应的所有目的地

a =[]

url= 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(urllib.request.quote(dep))

time.sleep(3)

strhtml=requests.get(url)

arrive_dict=strhtml.json()for arr_item in arrive_dict['data']:for arr_item_1 in arr_item['subModules']:for query in arr_item_1['items']:#如果当前这个目的地不在a中的话,那就添加进去,否则不添加,这样就可以达到目的地去重的目的了

if(query['query'] not ina):

a.append(query['query'])#逐个地取出当前出发点对应的目的地item

for item ina:

url= 'https://touch.dujia.qunar.com/list?modules=list%2CbookingInfo%2CactivityDetail&dep={}&query={}&dappDealTrace=true&mobFunction=%E6%89%A9%E5%B1%95%E8%87%AA%E7%94%B1%E8%A1%8C&cfrom=zyx&it=dujia_hy_destination&date=&needNoResult=true&originalquery={}&limit=0,24&includeAD=true&qsact=search'.format(urllib.request.quote(dep),urllib.request.quote(item),urllib.request.quote(item))

time.sleep(3)

strhtml=requests.get(url)#获取当前目的地的产品数量

routeCount = int(strhtml.json()['data']['limit']['routeCount'])for limit in range(0,routeCount,24):

url= 'https://touch.dujia.qunar.com/list?modules=list%2CbookingInfo%2CactivityDetail&dep={}&query={}&dappDealTrace=true&mobFunction=%E6%89%A9%E5%B1%95%E8%87%AA%E7%94%B1%E8%A1%8C&cfrom=zyx&it=dujia_hy_destination&date=&needNoResult=true&originalquery={}&limit={},24&includeAD=true&qsact=search'.format(urllib.request.quote(dep),urllib.request.quote(item),urllib.request.quote(item),limit)

time.sleep(3)

strhtml=requests.get(url)#用一个字典保存当前这个产品的信息

result ={'date':time.strftime('%Y-%m-%d',time.localtime(time.time())),'dep':dep,'arrive':item,'limit':limit,'result':strhtml.json()

}#向数据库中插入这条产品信息记录

sheet_qunar_zyx.insert_one(result)print('成功!')

爬取的数据量是非常大的 代码需要运行非常长的时间,运行代码打开pycharm就可以观察到保存的数据了(前提是pycharm已经安装好了mongo的插件了以及本地安装配置好mongodb了)

python电商爬虫源码_吴裕雄--天生自然PYTHON爬虫:爬取某一大型电商网站的商品数据...相关推荐

  1. mysql 查询 系统字段 自然日_吴裕雄--天生自然python数据清洗与数据可视化:MYSQL、MongoDB数据库连接与查询、爬取天猫连衣裙数据保存到MongoDB...

    本博文使用的数据库是MySQL和MongoDB数据库.安装MySQL可以参照我的这篇博文:https://www.cnblogs.com/tszr/p/12112777.html 其中操作Mysql使 ...

  2. python预测疾病_吴裕雄--天生自然python机器学习:使用Logistic回归从疝气病症预测病马的死亡率...

    ,除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有 30%的值是缺失的.下面将首先介绍如何处理数据集中的数据缺失问题,然 后 再 利 用 Logistic回 归 和随机梯度上升算法来预测 ...

  3. java用爬虫爬一个页面_使用Java写一个简单爬虫爬取单页面

    使用Java爬虫爬取人民日报公众号页面图片 使用Java框架Jsoup和HttpClient实现,先看代码 爬取目标页面 1.使用Maven构建一个普通Java工程 加入依赖: org.jsoup j ...

  4. python量化选股策略 源码_【一点资讯】Python实现行业轮动量化选股【附完整源码】...

    1.背景 大量研究表明,A股行业有明显的轮动现象,并且与A股相反,行业指数通常呈现动量特征,即前期涨幅高的行业,会延续上涨的趋势,比前期涨幅低的行业有明显超额收益. 此外,也有大量研究表明,A股市场存 ...

  5. 吴裕雄--天生自然 物理学习与探索笔记:电功、电路以及欧姆定律

    转载于:https://www.cnblogs.com/tszr/p/11201865.html

  6. 吴裕雄--天生自然 PYTHON3开发学习:输入和输出

    str = input("请输入:"); print ("你输入的内容是: ", str) # 打开一个文件 f = open("/tmp/foo.t ...

  7. 吴裕雄--天生自然 PYTHON3开发学习:字符串

    var1 = 'Hello World!' var2 = "Runoob" #!/usr/bin/python3 var1 = 'Hello World!' var2 = &quo ...

  8. 吴裕雄--天生自然 诗经:长恨歌

    长恨歌[作者]白居易 [朝代]唐汉皇重色思倾国,御宇多年求不得.杨家有女初长成,养在深闺人未识.天生丽质难自弃,一朝选在君王侧.回眸一笑百媚生,六宫粉黛无颜色.春寒赐浴华清池,温泉水滑洗凝脂.侍儿扶起 ...

  9. 吴裕雄--天生自然 Tensorflow卷积神经网络:花朵图片识别

    import os import numpy as np import matplotlib.pyplot as plt from PIL import Image, ImageChops from ...

最新文章

  1. 在 Linux 下确认 NTP 是否同步的方法
  2. 博客统计:腾讯分析这些数据哪儿来的?
  3. 从SAP社区上的一篇博客开始,聊聊SAP产品命名背后的那份情怀
  4. Java面试之Java基础知识第一季
  5. cr2032和br2032区别_钮扣电池CR2016和CR2032有什么区别?
  6. 数据库持久化ORM框架Hibernate、JPA、Mybatis、JOOQ和JDBC Template的比较
  7. Web漏洞扫描工具:AWVS下载
  8. Unity3D灯光与渲染学习之(二):全局、烘焙以及混合光照
  9. MDM页面UI升级介绍
  10. 2. Ruby下载安装
  11. SQL Server上月同期 日期的计算
  12. 计算机科学导论任务书,计算机科学导论论文提纲格式范文 计算机科学导论论文提纲如何写...
  13. html制作古诗网页早发白帝城,《早发白帝城》古诗词
  14. PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space翻译
  15. Python学习之---杨辉三角的五种解法
  16. 东方计算机学校老师,衡水东方计算机中等专业学校举行校园开放日活动
  17. 技术人“结构化思维”训练的一点想法和实践
  18. HCIE 面试资料-STP/RSTP/MSTP
  19. Adobe 系列软件中英文版本的切换
  20. 配置免密登录报错:ssh: Could not resolve hostname note1: Name or service not known

热门文章

  1. Fiddler二次开发 C#
  2. C#的TreeView标记
  3. UIScrollView的delegate方法妙用之让UICollectionView滑动到某个你想要的位置
  4. Poj 3246 Balanced Lineup(线段树基础)
  5. Windows 7可以体验IE10了
  6. 引:善用backtrace解决大问题
  7. 计算机组成原理实验箱使能开关,计算机组成原理微程序计数器实验报告
  8. ios图片放大之后如何不模糊_图片怎样放大后不模糊 图片放大不失真的方法步骤...
  9. vue中怎么点击修改文字_Vue.js点击切换按钮改变内容
  10. angular 绑定自定义属性_Angular2实现自定义双向绑定属性