logo资料库

数据清理与可视化实战之“ 去哪网 ”自由行产品爬取.pdf

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
数据清理与可视化实战之“ 去哪网去哪网 ”自由行产品爬取 数据清理与可视化实战之 自由行产品爬取 利用等差数列原理打印菱形 利用等差数列原理打印菱形 为实现其功能需要五个库的引用 from time import * import urllib from requests import get # 利用正则表达式提取地点 from re import * from pymongo import MongoClient # 利用pymongo库与本地数据库建立联系 2.若数据库中该文件存在则建立联系,若无则创建 # python不能读取自定义函数中的对象,故以下内容不能在函数或子程序中 client = MongoClient('localhost', 27017) #与数据库建立连接 tour = client.tour tourdata = tour.tourdata 为实现对程序运行时的监控,该代码必须写在主程序中。 出发地点的获取 def dep(): # 出发地获取,形成一个生成器需要遍历读取 url = 'https://touch.dujia.qunar.com/depCities.qunar' strhtml = get(url) dep_dict = strhtml.json() for dep_item in dep_dict['data']: sleep(0.5) for dep in dep_dict['data'][dep_item]: # dep 为开始地点 yield dep 通过基于urllib3的requests库中get函数模仿浏览器发出请求获得回应,网站会通过访问频率,来判断是否人为访问,故需要设立延时功能。 通过python的内置yield函数形成生成器。 目的地的获取 def arrive(): #返回目的地列表 a = [] for place in dep(): url = 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(urllib.request.quote(place)) # 每一个出发地都对应一个目的地列表 sleep(0.5) strhtml = get(url) arrive_dict = strhtml.json() arrive_dict = str(arrive_dict) pattern = compile('\'query\': \'(.*?)\',') list = findall(pattern, arrive_dict) a.extend(list) return list(set(a)) #利用列表向集合的转化去重 # 每个出发地对应目的的列表之间会用重叠 利用正则表达式对网页返回内容进行目的地地点的提取 目的地产品的获取 def result(dep, arrive): url = 'https://touch.dujia.qunar.com/list?modules=list%2CbookingInfo%2CactivityDetail&dep={0}&query= {1}&dappDealTrace=true&mobFunction=%E6%89%A9%E5%B1%95%E8%87%AA%E7%94%B1%E8%A1%8C&cfrom=zyx&it=pop_arrive_0&date=&needNoResult=true&originalquery= {1}&quality=90&limit=0,20&includeAD=true&qsact=search'.format(urllib.request.quote(f'{dep}'), urllib.request.quote(f'{arrive}')) # 出发地和目的地的输入 sleep(0.5) strhtml = get(url) try: routeCount = int(strhtml.json()['data']['limit']['routeCount']) except :# Exception为基类错误 return # 有的出发地对应的目的地无产品容错处理 for limit in range(0, routeCount, 20): url = 'https://touch.dujia.qunar.com/list?modules=list%2CbookingInfo%2CactivityDetail&dep={0}&query= {1}&dappDealTrace=true&mobFunction=%E6%89%A9%E5%B1%95%E8%87%AA%E7%94%B1%E8%A1%8C&cfrom=zyx&it=pop_arrive_0&date=&needNoResult=true&originalquery= {1}&quality=90&limit={2},20&includeAD=true&qsact=search'.format(urllib.request.quote(f'{dep}'), urllib.request.quote(f'{arrive}'), limit) strhtml = get(url).json() for i in range(0, 20): content = { 'title': strhtml['data']['list']['results'][i]['title'], 'date': strftime('%Y-%m-%d', localtime(time())), 'dep': dep, 'arrive': arrive, 'limit': limit, 'result': strhtml['data']['list']['results'][i] } print(strhtml['data']['list']['results'][i]['title']) tourdata.insert_one(content) 参数为出发地和目的地的函数,通过参数的传入来获取产品信息 主函数,通过两次列表循环传入参数
if __name__ == '__main__': for arrive in arrive(): for dep in dep(): result(dep, arrive) 作者:小海同学.
分享到:
收藏