去哪儿之自由行数据爬取
皮猪 59 2

文章目录

  • 前言
  • 一、首先分析网页
  • 二、编写代码
  • 总结

前言

本次呢我们获取去哪儿网站的自由行数据 在这里插入图片描述

通过对比电脑端和手机端,因为手机端返回的JSON格式数据更方便处理,所以决定采集手机端数据。

一、首先分析网页

首先点击出发地,一个个地点击刷新出来的数据,我们发现出发地的数据在depCities.qunar这个包里。

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

点击Headers,发现请求方式是GET,GET与POST请求最大的区别就是GET只需要请求url就可以获得数据,而POST还需要权限验证。将这个网址先保存下来,我们接着分析目的地界面。

在这里插入图片描述

包含目的地数据的包为arriveRe开头的包,注意获取数据时需要将最后一个callback参数删去。不删去的话返回的数据不是JSON格式。 然后我们点击一个列表中的城市,观察后可以发现数据在XHR中。

在这里插入图片描述

切换到Headers界面后,观察Request URL和请求类型。在这里插入图片描述 URL为https://touch.dujia.qunar.com/list?modules=list%2CbookingInfo%2CactivityDetail&dep=%E6%BE%B3%E9%97%A8&query=%E4%B8%BD%E6%B1%9F%E8%87%AA%E7%94%B1%E8%A1%8C&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=%E4%B8%BD%E6%B1%9F%E8%87%AA%E7%94%B1%E8%A1%8C&width=480&height=320&quality=90&limit=0,20&includeAD=true&qsact=search&filterTagPlatform=mobile_touch,请求方式为GET。这个地址中%开头的字符串是中文编译成的字符串,因为服务器不能识别中文字符,必须先用其他编码方式将其编译才能提交到服务器。我们通过[站长工具](http://tool.chinaz.com/tools/urlencode.aspx)还原编码。结果为

在这里插入图片描述

发现使用的是UTF-8编码,其中dep参数为出发地,queryoriginalquery表示目的地,修改这俩个参数就可以控制遍历整个平台的自由行产品。 到此我们网页已经分析完毕。

二、编写代码

首先创建一个test.py文件。

1.连接数据库

我本次使用的mongodb数据库进行存储数据。

#coding:utf-8
import requests
import urllib.request
import pymongo
import time

client = pymongo.MongoClient('localhost',27017)
book_qunar = client['qunar']
sheet_qunar_zyx = book_qunar['qunar_zyx']

2.获取自由行数据

用出发地和目的地俩个参数通过get_list()函数获取自由行数据,并存入数据库。

def get_list(dep,item):
    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={}&width=480&height=320&quality=90&limit=0,20&includeAD=true&qsact=search&filterTagPlatform=mobile_touch'.format(
        urllib.request.quote(dep),
        urllib.request.quote(item), urllib.request.quote(item))
    strhtml = get_json(url)
    routeCount = int(strhtml['data']['limit']['routeCount'])
    for limit in range(0, routeCount, 20):
        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={}&width=480&height=320&quality=90&limit={},20&includeAD=true&qsact=search&filterTagPlatform=mobile_touch'.format(
            urllib.request.quote(dep),
            urllib.request.quote(item), urllib.request.quote(item), limit)
        strhtml = get_json(url)
        result = {
            'date':time.strftime('%Y-$m-%d', time.localtime(time.time())),
            'dep':dep,
            'arrive':item,
            'limit':limit,
            'result':strhtml
        }
        sheet_qunar_zyx.insert_one(result)

get_json()为请求函数。

def get_json(url):
    strhtml = requests.get(url)
    time.sleep(1)
    return strhtml.json()

3.主函数

通过请求url获取数据并解析出出发地和目的地,传入get_list()函数。

if __name__ == "__main__":
    url = 'https://touch.dujia.qunar.com/depCities.qunar'
    dep_dict = get_json(url)
    for dep_item in dep_dict['data']:
        for dep in dep_dict['data'][dep_item]:
            a = []
            url = 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(urllib.request.quote(dep))
            arrive_dict = get_json(url)
            for arr_item in arrive_dict['data']:
                for arr_item_l in arr_item['subModules']:
                    for query in arr_item_l['items']:
                        if query['query'] not in a:
                            a.append(query['query'])
            for item in a:
                get_list(dep, item)

4.监控数据库

在同一目录下创建test2.py文件。通过以下代码可以监控数据库的存储情况。

from test import sheet_qunar_zyx
import time

while True:
    print(sheet_qunar_zyx.find().count())
    time.sleep(10)

总结

以上就是今天要讲的内容,本文仅仅简单介绍了如何分析一个网页,以及简单的使用mongodb数据库。但尽管如此,我们获取到的数据量非常可观,这就是爬虫的魅力!

预览图
评论区

索引目录