Запросы Python с кодом состояния 406 и сообщением об ошибке «Запрос не разрешен»

#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 и получил нормальный ответ.