数据清理与可视化实战之“ 去哪网去哪网 ”自由行产品爬取
数据清理与可视化实战之
自由行产品爬取
利用等差数列原理打印菱形
利用等差数列原理打印菱形
为实现其功能需要五个库的引用
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)
作者:小海同学.