#python #python-requests #web-crawler #fetch
#python #python-запросы #веб-сканер #выборка
Вопрос:
При использовании метода POST для получения данных из tokopedia.com , Я получил ответ.json() как:
[{'errors': [{'message': 'Request not allowed', 'extensions': {}}]}]
Я попытался сохранить это, заменив «https» на «http», который работал в этом случае, и используя выборку JavaScript для выполнения тех же заданий. Оба не смогли решить эту проблему.
Это мои заголовки:
headers = {
'user-agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36",
'cookie': cookie,
'origin': 'https://www.tokopedia.com',
'content-type': 'application/json',
'accept': '*/*',
'accept-encoding': 'gzip, deflate, br',
'referer': 'https://www.tokopedia.com/p/dapur/aksesoris-dapur',
'content-length': '25794'
};
И это заголовки из DevTools Chrome:
:authority: gql.tokopedia.com
:method: POST
:path: /
:scheme: https
accept: */*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9
content-length: 3206
content-type: application/json
cookie: cookie
origin: https://www.tokopedia.com
referer: https://www.tokopedia.com/p/dapur/aksesoris-dapur
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-site
tkpd-userid: 0
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36
x-device: desktop-0.0
x-source: tokopedia-lite
x-tkpd-lite-service: zeus
И вот основная часть моего кода:
import requests
headers = headers
payload = [{'operationName': 'SearchProductQuery', 'variables': {'params': 'amp;ob=23amp;identifier=dapur_aksesoris-dapuramp;sc=3439amp;user_id=0amp;rows=60amp;start=1amp;source=directoryamp;device=desktopamp;page=1amp;related=trueamp;st=productamp;safe_search=false', 'adParams': 'amp;page=1amp;dep_id=3439amp;ob=23amp;ep=productamp;item=15amp;src=directoryamp;device=desktopamp;user_id=0amp;minimum_item=15amp;start=1amp;no_autofill_range=5-14'}, 'query': 'query SearchProductQuery($params: String, $adParams: String) {n CategoryProducts: searchProduct(params: $params) {n countn data: products {n idn urln imageUrl: image_urln imageUrlLarge: image_url_700n catId: category_idn gaKey: ga_keyn countReview: count_reviewn discountPercentage: discount_percentagen preorder: is_preordern namen pricen original_pricen ratingn wishlistn labels {n titlen colorn __typenamen }n badges {n imageUrl: image_urln shown __typenamen }n shop {n idn urln namen goldmerchant: is_power_badgen official: is_officialn reputationn clovern locationn __typenamen }n labelGroups: label_groups {n positionn titlen typen __typenamen }n __typenamen }n __typenamen }n displayAdsV3(displayParams: $adParams) {n data {n idn ad_ref_keyn redirectn sticker_idn sticker_imagen productWishListUrl: product_wishlist_urln clickTrackUrl: product_click_urln shop_click_urln product {n idn namen wishlistn image {n imageUrl: s_ecsn trackerImageUrl: s_urln __typenamen }n url: urin relative_urin price: price_formatn campaign {n original_pricen discountPercentage: discount_percentagen __typenamen }n wholeSalePrice: wholesale_price {n quantityMin: quantity_min_formatn quantityMax: quantity_max_formatn price: price_formatn __typenamen }n count_talk_formatn countReview: count_review_formatn category {n idn __typenamen }n preorder: product_preordern product_wholesalen free_returnn isNewProduct: product_new_labeln cashback: product_cashback_raten rating: product_ratingn top_labeln bottomLabel: bottom_labeln __typenamen }n shop {n image_product {n image_urln __typenamen }n idn namen domainn locationn cityn taglinen goldmerchant: gold_shopn gold_shop_badgen official: shop_is_officialn lucky_shopn urin owner_idn is_ownern badges {n titlen image_urln shown __typenamen }n __typenamen }n applinksn __typenamen }n template {n isAd: is_adn __typenamen }n __typenamen }n}n'}]
res = requests.post('https://gql.tokopedia.com/', headers=headers, data=payload)
Комментарии:
1. Длина содержимого, похоже, действительно отличается.
2. Кроме того, вместо параметра «data = полезная нагрузка» попробуйте «json = полезная нагрузка». Однако я не знаком с tokopedia или их API. И, как сказал @Crapy, длина содержимого выглядит странно. Может быть, убрать это.
3. Нет, это не работает. Я отправил запрос с помощью Chrome DevTools с исходного веб-сайта, и ответ был правильным.
4. Но проблема остается в том, как мне имитировать источник, как указано в заголовках запроса?
5. Метод Иисуса Михаэлы внезапно работает! Возможно, это было потому, что я перестал пользоваться Wi-Fi в моей школе, но дело в том, что это сработало!
Ответ №1:
Код состояния 406 неприемлемо означает, что сервер не может предоставить ответ с тем, что вы указали в заголовках проактивного согласования содержимого, и не желает обслуживать версию по умолчанию. Указанные заголовки включают
Accept
Accept-Charset
Accept-Encoding
Accept-Language
Если я не ошибаюсь, ваши заголовки, в отличие от DevTools Chrome, отсутствуют Accept-Language
.
Комментарии:
1. Нет, это не работает. Я отправил запрос с помощью Chrome DevTools с исходного веб-сайта, и ответ был правильным.
Ответ №2:
Это сработало с помощью комментария @Michaela. Я изменил параметр данных на json и получил нормальный ответ.