文章目录
- 前言
- 一、首先分析网页
- 二、编写代码
- 总结
前言
本次呢我们获取去哪儿网站的自由行数据
通过对比电脑端和手机端,因为手机端返回的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。这个地址中%开头的字符串是中文编译成的字符串,因为服务器不能识别中文字符,必须先用其他编码方式将其编译才能提交到服务器。我们通过站长工具还原编码。结果为
发现使用的是UTF-8编码,其中dep参数为出发地,query和originalquery表示目的地,修改这俩个参数就可以控制遍历整个平台的自由行产品。
到此我们网页已经分析完毕。
二、编写代码
首先创建一个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数据库。但尽管如此,我们获取到的数据量非常可观,这就是爬虫的魅力!