[Crawler aprendiendo cuatro] Caso de rastreador a gran escala de Python: rastreo de datos de productos de un sitio web de comercio electrónico (1)

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)

Inserte la descripción de la imagen aquí


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.

Inserte la descripción de la imagen aquí


(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.

Inserte la descripción de la imagen aquí


(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 .

Inserte la descripción de la imagen aquí

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í)

Inserte la descripción de la imagen 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

Inserte la descripción de la imagen aquí
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:

Inserte la descripción de la imagen aquí


Encuentra la lista de salida
Inserte la descripción de la imagen aquí


Obtenga el enlace a la lista de puntos de partida:

https://touch.dujia.qunar.com/depCities.qunar

Inserte la descripción de la imagen aquí


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:

Inserte la descripción de la imagen aquí


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:

Inserte la descripción de la imagen aquí


(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:

Inserte la descripción de la imagen aquí

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:

Inserte la descripción de la imagen aquí


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:

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_45260385/article/details/108928548
Recomendado
Clasificación