Objetivo: obtener la lista completa de productos "viajes gratis"
Necesita utilizar enlaces y sitios web:
Sitio web de comercio electrónico:https://www.qunar.com/
Conversión de codificación en línea:https://tool.oschina.net/encode?type=4
El siguiente es el enlace que se obtiene al observar y analizar los datos (la primera parte):
Destino correspondiente al origen: https://touch.dujia.qunar.com/golfz/sight/arriveRecommenddep=%E5%8C%97%E4%BA%AC&exclude=&extensionImg=255,175
Enlace a la lista de puntos de partida:
https://touch.dujia.qunar.com/depCities.qunar
Productos desde el punto de partida hasta el destino:
https://touch.dujia.qunar.com/list?modules=list%2CbookingInfo%2CactivityDetail&dep=%E5%8C%97%E4%BA%AC&query=%E4%B8%89%E4%BA%9A%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%89%E4%BA%9A%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
Uno: observar las características de la página y analizar los datos
Accede en el navegador:https://www.qunar.com/
Presione F12 para ingresar al modo desarrollador
Luego presione ctrl + shift + m (o un círculo rojo en el diagrama de puntos)
Ahora ingresa al modo de terminal inalámbrico y los datos devueltos por el terminal inalámbrico están en formato JSON , que es más fácil de procesar.
(1) Después de hacer clic en " Viaje gratis ", y luego hacer clic en el cuadro de búsqueda , puede observar la estructura del árbol , como se muestra en la siguiente figura.
(2) Cambie a lapágina de encabezado , hay dos datos importantes (encerrados en un círculo en rojo)
Solicitar URL (enlace de solicitud) : acceda al servidor a través del enlace para obtener datos
Método de solicitud : determine el método de función y los parámetros de carga que se utilizarán. Los métodos de solicitud comunes incluyen los métodos GET y POST .
Entre ellos: El
método GET solo tiene la autoridad para consultar datos , y los datos se pueden devolver siempre que se acceda a la URL ;
El método POST requiere la verificación de la autorización y el contenido de la solicitud . El servidor pasa la autorización y devuelve los datos solicitados por el cliente a través del contenido de la solicitud . El método POST tiene la autoridad para consultar y modificar los datos .
Poder dibujar:
Solicitar URL (solicitar enlace) eliminar la siguiente devolución de llamada :https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep=%E5%8C%97%E4%BA%AC&exclude=&extensionImg=255,175
Método de solicitud : método GET
(3) No dude en hacer clic en una ciudad recomendada (se hace clic en Sanya aquí)
Observe la URL de solicitud , la cadena al principio de% en el enlace es una cadena compilada en chino. El servidor no puede reconocer los caracteres chinos, por lo que puede enviarse al servidor después de compilarse en una determinada codificación.
Transcodificación de línea abierta para decodificar
https://touch.dujia.qunar.com/list?modules=list%2CbookingInfo%2CactivityDetail&dep=%E5%8C%97%E4%BA%AC&query=%E4%B8%89%E4%BA%9A%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%89%E4%BA%9A%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
El enlace decodificado se puede encontrar comparándolo con la página de navegación.
dep = Beijing ( lugar de salida )
query = Sanya free travel ( destino )
originalquery = Sanya free travel ( destino )
(4) Si desea obtener todos los productos de "viajes gratis", primero debe obtener todos los puntos de partida, porque partiendo de diferentes ciudades, habrá diferentes productos.
Elija un lugar de salida:
Encuentra la lista de salida
Obtenga el enlace a la lista de puntos de partida:
https://touch.dujia.qunar.com/depCities.qunar
Dos: análisis del flujo de trabajo
(1) Obtenga la lista de puntos de partida
(2) Obtenga una lista de atracciones turísticas
(3) Obtenga una lista de productos clásicos
(4) Almacenar datos
Tres: construir un árbol de categorías
(1) Obtenga la lista de puntos de partida
Árbol:
import requests
url = 'https://touch.dujia.qunar.com/depCities.qunar' #出发点列表的链接
str = requests.get(url)
dep_dic = str.json()
for dep_item in dep_dic["data"]:
for dep in dep_dic["data"][dep_item]:
print(dep)
resultado de la operación:
(2) Obtenga una lista de atracciones turísticas
Obtenga el destino según el lugar de salida y continúe ingresando el código.
Árbol:
import requests
import time
url = 'https://touch.dujia.qunar.com/depCities.qunar' #出发点列表的链接
str = requests.get(url)
dep_dic = str.json()
for dep_item in dep_dic["data"]:
for dep in dep_dic["data"][dep_item]:
print(dep)
#新加入的代码
url = 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(dep)
time.sleep(1)
str = requests.get(url)
arrive_dic = str.json()
arrive_city = [] #存放当前出发点能到的所有目的地
for arr_item in arrive_dic["data"]:
for arr_item_1 in arr_item["subModules"]:
for query in arr_item_1["items"]:
if query["query"] not in arrive_city: #使得当前出发点对应的目的地不重复
arrive_city.append(query["query"])
print(arrive_city)
resultado de la operación:
Cuatro: obtenga la lista de productos
import requests
import time
import pymongo
client = pymongo.MongoClient('localhost',27017) #建立连接
book_qunar = client['qunar'] #建立名为“qunar” 的数据库
sheet_qunar = book_qunar['sheet_qunar'] #在数据库中创建新表 “sheet_qunar”
url = 'https://touch.dujia.qunar.com/depCities.qunar' #出发点列表的链接
str = requests.get(url)
dep_dic = str.json()
for dep_item in dep_dic["data"]:
for dep in dep_dic["data"][dep_item]:
print(dep)
url = 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(dep)
time.sleep(1)
str = requests.get(url)
arrive_dic = str.json()
arrive_city = [] #存放当前出发点能到的所有目的地
for arr_item in arrive_dic["data"]:
for arr_item_1 in arr_item["subModules"]:
for query in arr_item_1["items"]:
if query["query"] not in arrive_city: #使得当前出发点对应的目的地不重复
arrive_city.append(query["query"])
for item in arrive_city:
url = 'https://touch.dujia.qunar.com/' \
'list?modules=list%2CbookingInfo%2' \
'CactivityDetail&dep={}&query={}&' \
'dappDealTrace=true&mobFunction=%E' \
'6%89%A9%E5%B1%95%E8%87%AA%E7%94%B1' \
'%E8%A1%8C&cfrom=zyx&it=dujia_hy_dest' \
'ination&date=&needNoResult=true&origina' \
'lquery={}&width=480&height' \
'=320&quality=90&limit=0,' \
'20&includeAD=true&qsact=search&' \
'filterTagPlatform=mobile_touch'.format(dep,item,item)
time.sleep(1)
str = requests.get(url)
routeCount = int(str.json()["data"]["limit"]["routeCount"]) #取出产品数
for limit in range(0,routeCount,20): #获取产品信息
url = 'https://touch.dujia.qunar.com/' \
'list?modules=list%2CbookingInfo%2' \
'CactivityDetail&dep={}&query={}&' \
'dappDealTrace=true&mobFunction=%E' \
'6%89%A9%E5%B1%95%E8%87%AA%E7%94%B1' \
'%E8%A1%8C&cfrom=zyx&it=dujia_hy_dest' \
'ination&date=&needNoResult=true&origina' \
'lquery={}&width=480&height' \
'=320&quality=90&limit={},' \
'20&includeAD=true&qsact=search&' \
'filterTagPlatform=mobile_touch'.format(dep,item,item,limit)
time.sleep(1)
str = requests.get(url)
#产品的数据类型
result = {
'date': time.strftime('%Y-%m-%d',time.localtime(time.time())),
'dep': dep,
'arrive': item,
'limit': limit,
'result': str.json()
}
sheet_qunar.insert_one(result)
resultado de la operación: