使用 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')
我正在尝试找出一种使用 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')