[Crawler learning four] Caso do rastreador em grande escala do Python: rastreamento de dados de produto de um site de comércio eletrônico (1)

Objetivo: obter toda a lista de produtos de "viagens grátis"


Necessidade de usar links e sites:

Site de comércio eletrônico:https://www.qunar.com/

Conversão de codificação online:https://tool.oschina.net/encode?type=4

A seguir está o link obtido pela observação e análise dos dados (a primeira parte):

Destino correspondente à origem: https://touch.dujia.qunar.com/golfz/sight/arriveRecommenddep=%E5%8C%97%E4%BA%AC&exclude=&extensionImg=255,175

Link para a lista de pontos de partida:
https://touch.dujia.qunar.com/depCities.qunar

Produtos do ponto de partida ao 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

Um: observe as características da página e analise os dados

Acesso no navegador:https://www.qunar.com/

Pressione F12 para entrar no modo de desenvolvedor

Em seguida, pressione ctrl + shift + m (ou círculo vermelho no diagrama de pontos)

Insira a descrição da imagem aqui


Agora ele entra no modo de terminal sem fio e os dados retornados pelo terminal sem fio estão no formato JSON , que é mais fácil de processar.

Insira a descrição da imagem aqui


(1) Após clicar em " Viagem Grátis ", e em seguida clicar na caixa de pesquisa , é possível observar a estrutura em árvore , conforme mostrado na figura abaixo

Insira a descrição da imagem aqui


(2) Mudar para apáginado cabeçalho , existem duas informações importantes (circuladas em vermelho)

Request URL (request link) : acesse o servidor pelo link para obter os dados

Método de solicitação : determine o método de função e os parâmetros de upload a serem usados. Os métodos de solicitação comuns incluem os métodos GET e POST .

Entre eles: O
método GET tem autoridade apenas para consultar dados , e os dados podem ser retornados desde que a URL seja acessada ;

O método POST requer verificação de autorização e conteúdo da solicitação . O servidor passa a autorização e retorna os dados solicitados pelo cliente por meio do conteúdo da solicitação . O método POST tem autoridade para consultar e modificar os dados .

Insira a descrição da imagem aqui

Pode desenhar:

Solicitar URL (solicitar link) excluir o seguinte retorno de chamada :https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep=%E5%8C%97%E4%BA%AC&exclude=&extensionImg=255,175

Método de solicitação : método GET


(3) Sinta-se à vontade para clicar em uma cidade recomendada (Sanya pode clicar aqui)

Insira a descrição da imagem aqui
Observe a URL de solicitação , a string no início de% no link é uma string compilada em chinês. O servidor não pode reconhecer caracteres chineses, portanto, ela pode ser enviada ao servidor após ser compilada em uma determinada codificação.

Transcodificação de linha aberta 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

Insira a descrição da imagem aqui
O link decodificado pode ser encontrado comparando com a página de navegação

dep = Pequim ( local de partida )

consulta = viagem grátis Sanya ( destino )

originalquery = viagem grátis Sanya ( destino )


(4) Se você deseja obter todos os produtos de "viagens grátis", deve primeiro obter todos os pontos de partida, porque partindo de cidades diferentes, haverá produtos diferentes.

Escolha um local de partida:

Insira a descrição da imagem aqui


Encontre a lista de partida
Insira a descrição da imagem aqui


Obtenha o link para a lista de pontos de partida:

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

Insira a descrição da imagem aqui


Dois: análise do fluxo de trabalho

(1) Obtenha a lista de pontos de partida

(2) Obtenha uma lista de atrações turísticas

(3) Obtenha uma lista de produtos clássicos

(4) Armazenar dados


Três: construir uma árvore de categorias

(1) Obtenha a lista de pontos de partida

Árvore:

Insira a descrição da imagem aqui


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 da operação:

Insira a descrição da imagem aqui


(2) Obtenha uma lista de atrações turísticas

Obtenha o destino com base no local de partida e continue a inserir o código.

Árvore:

Insira a descrição da imagem aqui

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 da operação:

Insira a descrição da imagem aqui


Quatro: Obtenha a lista de produtos

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 da operação:

Insira a descrição da imagem aqui

Acho que você gosta

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