Использование scrapy для очистки агрегаторов пищевых продуктов, таких как grubhub, необходимо для некоторых целей науки о личных данных - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь найти способ найти данные с веб-сайта с помощью spla sh, но безрезультатно. Мне нужна ваша помощь, чтобы найти способ сделать это!

изменить:

ссылка: https://www.grubhub.com/search?location=10001 (ссылка отредактирована для краткости) и аналогично, это для разных штатов на основе почтового индекса и данных, которые мне нужны, это название ресторана и его меню и рейтинги для всех возможных или доступных данных.

1 Ответ

1 голос
/ 12 июля 2020

Я пытался перепроектировать их API, но вам, возможно, придется настроить его под свои нужды (и, возможно, оптимизировать под свои нужды):

Нам нужно будет получить authentication bearer, чтобы использовать их API. Чтобы получить токен, нам сначала понадобятся библиотеки client_id:

, которые я использую

import requests
from bs4 import BeautifulSoup
import re
import json

get client_id

session = requests.Session()

static = 'https://www.grubhub.com/eat/static-content-unauth?contentOnly=1'
soup = BeautifulSoup(session.get(static).text, 'html.parser')
client = re.findall("beta_[a-zA-Z0-9]+", soup.find('script', {'type': 'text/javascript'}).text)
# print(client)

получить носитель аутентификации

# define and add a proper header
headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',
        'authorization': 'Bearer',
        'content-type': 'application/json;charset=UTF-8'
          }
session.headers.update(headers)

# straight from networking tools. Device ID appears to accept any 10-digit value
data = '{"brand":"GRUBHUB","client_id":"' + client[0] + '","device_id":1234567890,"scope":"anonymous"}'
resp = session.post('https://api-gtm.grubhub.com/auth', data=data)

# refresh = json.loads(resp.text)['session_handle']['refresh_token']
access = json.loads(resp.text)['session_handle']['access_token']

# update header with new token
session.headers.update({'authorization': 'Bearer ' + access})

сделайте ваш запрос

Вот часть, которая отличается от вашего запроса: их API использует стороннюю службу для получения долготы и широты для почтового индекса (например, -73.99916077, 40.75368499) для вашего почтового индекса в Нью-Йорке). Может быть даже вариант изменить это: location=POINT(-73.99916077%2040.75368499) похоже, что он принимает и другие варианты.

grub = session.get('https://api-gtm.grubhub.com/restaurants/search/search_listing?orderMethod=delivery&locationMode=DELIVERY&facetSet=umamiV2&pageSize=20&hideHateos=true&searchMetrics=true&location=POINT(-73.99916077%2040.75368499)&facet=promos%3Atrue&facet=open_now%3Atrue&variationId=promosSponsoredRandom&sortSetId=umamiv3&countOmittingTimes=true')
...