Как я могу удалить информацию об этомсайт без селена? - PullRequest
1 голос
/ 23 октября 2019

URL веб-сайта: https://www.selfridges.com/GB/en/cat/giorgio-armani-lip-mastero-mattr-6-6ml_317-77011643-LB014200/

Я могу получить файл, содержащий информацию о ценах и информацию о запасах, через chrome -> F12 -> network -> XHR.

URL-адрес цены API: https://www.selfridges.com/api/cms/ecom/v1/GB/en/price/byId/317-77011643-LB014200

фондовый URL-адрес API: https://www.selfridges.com/api/cms/ecom/v1/GB/en/stock/byId/317-77011643-LB014200

И содержание ответа можно получить, непосредственно перейдя по ссылке API, например:

s= requests.session()
response = s.get(price_api_url, headers=headers)
print(response.text)

Однако для стандартного URL-адреса этот метод не будет работатьи будет возвращен код состояния 403 Forbidden.

Я пытался использовать файлы cookie, но результат тот же.

Тот же эффект, даже если доступ осуществляется через браузер Chrome.

Может быть полезная информация:

Я получаю исходный код, содержащий метод API, но не могу найти {variantValue} и {variantName}.

"@data_api":"
    {"apiKeyValue":"xjut2p34999bad9dx7y868ng",
     "apiKey":"Api-Key",
     "withCredentials":true,
     "priceApi":"/api/cms/ecom/v1/GB/en/price/byId/{partNumber}",
     "stockApi":"/api/cms/ecom/v1/GB/en/stock/byId/{partNumber}?option\u003d{variantName}\u0026optionValue\u003d{variantValue}",
     "cacheControl":"no-cache",
     "addToWishListApiUrl":"/api/cms/ecom/v1/GB/en/wishlist",
     "addToBagApiUrl":"/api/cms/ecom/v1/GB/en/cart"
}"

1 Ответ

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

В Chrome / Firefox вы должны проверить, что еще он отправляет - возможно, ему нужны специальные заголовки - например, специальный заголовок для запроса XHR ('X-Requested-With': 'XMLHttpRequest'). ИЛИ, может быть, вам придется на первую GET главную страницу, чтобы получить свежие куки.

Firefox имеет инструмент, подобный Chrome, и имеет "Copy reuqest as CURL command", и с помощью этой команды в консоли я могу получить данные о запасах.

curl 'https://www.selfridges.com/api/cms/ecom/v1/GB/en/stock/byId/317-77011643-LB014200' -H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Accept-Language: pl,en-US;q=0.7,en;q=0.3' --compressed -H 'Content-Type: application/json; charset=utf-8' -H 'Api-Key: xjut2p34999bad9dx7y868ng' -H 'cache-control: no-cache' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Referer: https://www.selfridges.com/GB/en/cat/giorgio-armani-lip-mastero-mattr-6-6ml_317-77011643-LB014200/' -H 'Cookie: AWSELB=85FF15BB10593ECE847219C9B214EEC5BBD393B7301D90E17B625C66620D7473C3FCE779E5EA1D351A2192C6C975C128815AC60F1118B8968E03001896493C045071A25E98; SF_COUNTRY_LANG=GB_en; COOKIE_NOTICE_SEEN=seen; utag_main=v_id:016df6fcb41700231568089828b001044006200900c48$_sn:1$_ss:0$_pn:2%3Bexp-session$_st:1571808694713$ses_id:1571806819351%3Bexp-session; utag_chan={"channel":"","channel_set":"","channel_converted":false,"awc":""}; Apache=10.77.3.197.1571806819436981; JSESSIONID=0000FBk5q2nb8WGtpDUjLBiNvha:17re3pp2r; WC_PERSISTENT=EBTewrGMk86bvcN%2fwqrCZtv%2bnXk%3d%0a%3b2019%2d10%2d23+05%3a00%3a22%2e442%5f1571806819438%2d1407831%5f10052%5f1480243004%2c%2d1%2cGBP%5f10052; WC_SESSION_ESTABLISHED=true; WC_ACTIVEPOINTER=%2d1%2c10052; WC_AUTHENTICATION_1480243004=1480243004%2cQbYKoQJpwYcMM6iznWYL1ludFS8%3d; WC_USERACTIVITY_1480243004=1480243004%2c10052%2cnull%2cnull%2cnull%2cnull%2cnull%2cnull%2cnull%2cnull%2cpfXMuSmw4%2b86xW7eYpU03lFrlirAydf27cytgnreiETU0zdlaTYkdIvAFHFrHmqcOVjtNhcyBowU%0ah%2bD2jUFBMXetfiZdIXQuaegcWHNNUqlIHSvMQrpghGvwCVdLsi%2bVK5UuT9NrO2L6RLVuf2ROuIXl%0avrgeD6slXh2C9RTk%2fKYkbRFJrqWGbiO5BZCmcHU14xftVA%3d%3d; cmTPSet=Y; CoreID6=87385145971315718068242&ci=90262645; 90262645_clogin=v=7&l=62021491571806824206&e=1571808675410; SIGNUP_POPUP_SEEN=seen' -H 'DNT: 1'

Используя https://curl.trillworks.com/ Я могу конвертировать CURL в Python requests, и он также может получить запас.

import requests

cookies = {
    'AWSELB': '85FF15BB10593ECE847219C9B214EEC5BBD393B7301D90E17B625C66620D7473C3FCE779E5EA1D351A2192C6C975C128815AC60F1118B8968E03001896493C045071A25E98',
    'SF_COUNTRY_LANG': 'GB_en',
    'COOKIE_NOTICE_SEEN': 'seen',
    'utag_main': 'v_id:016df6fcb41700231568089828b001044006200900c48$_sn:1$_ss:0$_pn:2%3Bexp-session$_st:1571808694713$ses_id:1571806819351%3Bexp-session',
    'utag_chan': '{"channel":"","channel_set":"","channel_converted":false,"awc":""}',
    'Apache': '10.77.3.197.1571806819436981',
    'JSESSIONID': '0000FBk5q2nb8WGtpDUjLBiNvha:17re3pp2r',
    'WC_PERSISTENT': 'EBTewrGMk86bvcN%2fwqrCZtv%2bnXk%3d%0a%3b2019%2d10%2d23+05%3a00%3a22%2e442%5f1571806819438%2d1407831%5f10052%5f1480243004%2c%2d1%2cGBP%5f10052',
    'WC_SESSION_ESTABLISHED': 'true',
    'WC_ACTIVEPOINTER': '%2d1%2c10052',
    'WC_AUTHENTICATION_1480243004': '1480243004%2cQbYKoQJpwYcMM6iznWYL1ludFS8%3d',
    'WC_USERACTIVITY_1480243004': '1480243004%2c10052%2cnull%2cnull%2cnull%2cnull%2cnull%2cnull%2cnull%2cnull%2cpfXMuSmw4%2b86xW7eYpU03lFrlirAydf27cytgnreiETU0zdlaTYkdIvAFHFrHmqcOVjtNhcyBowU%0ah%2bD2jUFBMXetfiZdIXQuaegcWHNNUqlIHSvMQrpghGvwCVdLsi%2bVK5UuT9NrO2L6RLVuf2ROuIXl%0avrgeD6slXh2C9RTk%2fKYkbRFJrqWGbiO5BZCmcHU14xftVA%3d%3d',
    'cmTPSet': 'Y',
    'CoreID6': '87385145971315718068242&ci=90262645',
    '90262645_clogin': 'v=7&l=62021491571806824206&e=1571808675410',
    'SIGNUP_POPUP_SEEN': 'seen',
}

headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0',
    'Accept': 'application/json, text/javascript, */*; q=0.01',
    'Accept-Language': 'pl,en-US;q=0.7,en;q=0.3',
    'Content-Type': 'application/json; charset=utf-8',
    'Api-Key': 'xjut2p34999bad9dx7y868ng',
    'cache-control': 'no-cache',
    'X-Requested-With': 'XMLHttpRequest',
    'Connection': 'keep-alive',
    'Referer': 'https://www.selfridges.com/GB/en/cat/giorgio-armani-lip-mastero-mattr-6-6ml_317-77011643-LB014200/',
    'DNT': '1',
}

response = requests.get('https://www.selfridges.com/api/cms/ecom/v1/GB/en/stock/byId/317-77011643-LB014200', headers=headers, cookies=cookies)
print(response.text)

Но я не знаю, как долго сервер будет уважать этот код и его куки. Это может потребоваться свежие куки, когда я запусту его позже.


РЕДАКТИРОВАТЬ: Через несколько часов тот же код все еще дает мне данные. Иногда я могу получить результат даже с

import requests

headers = { 'Api-Key': 'xjut2p34999bad9dx7y868ng' }

response = requests.get('https://www.selfridges.com/api/cms/ecom/v1/GB/en/stock/byId/317-77011643-LB014200', headers=headers)
print(response.text)

, но иногда он дает мне <h1>Developer Inactive</h1>, поэтому я уверен, что это не временная проблема на сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...