Изо всех сил пытаться очистить ювелирные магазины Pandora? - PullRequest
0 голосов
/ 07 октября 2019

Я пытался собрать https://stores.pandora.net/en-au/ для всех мест в Австралии и их адресов, используя Parsehub, и он не дал результатов, как обычно.

Скриншот Parse Hub:

enter image description here

Как показано на рисунке, предварительный просмотр в реальном времени отлично показывает таблицу, но при запускеон выбрасывает только ненужные значения (например, 2 магазина в США)

Я попробовал использовать Beautiful soup, но классы выглядели сложнее, чем я предполагал. (Похоже, он находится в массиве Maplist, но я не уверен, как извлечь этот бит)

Любая помощь здесь будет принята с благодарностью! Спасибо:)

1 Ответ

0 голосов
/ 08 октября 2019

Этот сайт извлекает данные из этого API https://maps.pandora.net/api/getAsyncLocations со значением search в параметрах запроса. Результатом является объект JSON с полем maplist, которое содержит данные html (один div). Этот div включает несколько JSON-объектов, разделенных запятой:

curl 'https://maps.pandora.net/api/getAsyncLocations?level=domain&template=domain&search=Melbourne+Victoria%2C+Australie'

Таким образом, нам нужно переставить запятую JSON-объектов в массив для его анализа. В следующем примере для извлечения данных используются , (анализатор json), & (анализатор html):

search="Melbourne+Victoria+Australie"
curl -s -G 'https://maps.pandora.net/api/getAsyncLocations' \
    -d 'level=domain' \
    -d 'template=domain' \
    -d "search=$search" | \
    jq -r '.maplist' | \
    pup -p div text{} | \
    sed '$ s/.$//' | \
    sed -e "\$a]" | \
    sed '1s/^/[/' | \
    jq '.[] | { 
        location: .location_name, 
        address: .address_1, 
        complement: (.city + "," + .big_region + " " + .location_post_code) 
    }'

В с & :

import requests
from bs4 import BeautifulSoup
import json

search = "Melbourne+Victoria+Australie"

response = requests.get(
    'https://maps.pandora.net/api/getAsyncLocations',
    params = {
        'level':'domain',
        'template':'domain',
        'search': search
    }
)
soup = BeautifulSoup(response.json()['maplist'], 'html.parser')

formatted_json = "[{}]".format(soup.div.string[:-1])
data = json.loads(formatted_json)

print([
    (i['location_name'], i['address_1'], i['city'], i['big_region'], i['location_post_code']) 
    for i in data
])
...