使用 scrapy 来抓取像 grubhub 这样的食物聚合器需要它用于一些个人数据科学目的

Using scrapy to scrape food aggregators like grubhub need it for some personal data science purpose

我正在尝试找出一种使用 splash 从网站中查找数据的方法,但没有结果,我需要你的帮助来找出实现该方法的方法!

编辑:

link:https://www.grubhub.com/search?location=10001(为简洁起见编辑了link) 同样,对于基于邮政编码和数据的不同状态,我需要的是餐厅的名称及其菜单以及所有可能或可用数据的评级。

我试图对他们的 API 进行逆向工程,但您可能需要根据您的需要对其进行调整(并可能根据您的需要对其进行优化):

我们必须获得 authentication bearer 才能使用他们的 API。要获得令牌,我们首先需要 client_id:

我正在使用的库

import requests
from bs4 import BeautifulSoup
import re
import json

得到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')