Очистка страниц ajax с использованием python, но после нескольких запросов он возвращает поддельные значения

#html #ajax #web-scraping #python-requests

Вопрос:

Я пытаюсь очистить информацию о товарах магазина с помощью python.

Взять https://shopee.com.my/All in one pc Intel core I3/I5/I7 Dual-core 8G RAM 128 gb SSD With optical drive CD 23.8 Inch computer Office Desktop All-in-one desktop Support WiFi-i.206039726.5859069631 в качестве примера.

Поскольку он использует ajax, я пытаюсь извлечь информацию об элементе из: https://shopee.com.my/api/v2/item/get?itemid=5859069631amp;shopid=206039726

После нескольких запросов я обнаружил, что json, на который он ответил, оказался поддельными значениями (например, его фактический рейтинг составляет 4,78, но он возвращает 0,24).

Я попытался решить эту проблему, изменив заголовки и ip/прокси, но все еще не работает.

Есть ли какой-либо другой способ, который потенциально может решить эту проблему?

 
def get_info(url,itemurl):
    
    
    requests.adapters.DEFAULT_RETRIES = 5 
    s = requests.session()
    s.keep_alive = False

    try:
        
        fake_ua=UserAgent()
        headers = {'User-Agent':fake_ua.random, 

                   'Accept': '*/*',
                    'Accept-Language': 'en-US,en;q=0.5',
                    'X-Shopee-Language': 'en',
                    'X-Requested-With': 'XMLHttpRequest',
                    'X-API-SOURCE': 'pc',
                    'If-None-Match-': '55b03-2ff39563c299cbdc937f8ab86ef322ab',
                    'DNT': '1',
                    'Referer': referer,
                    'TE': 'Trailers'}
        ip = get_daili()
        proxies = {"proxies":{"https":ip}}

        
        response = requests.get(url, headers = headers, proxies = proxies, verify=False)
        #response = requests.request("GET", url, headers=headers, data=payload)
        if response.status_code == 200:
            shop_info = response.json()
    except requests.ConnectionError as e:
        print(f' {url} error', e.args)    

    shop_name = shop_info['data']['name']    
    followers = shop_info['data']['follower_count']   
    ratinggood = shop_info['data']['rating_good'] 
    ratingbad = shop_info['data']['rating_bad'] 
    ratingnormal = shop_info['data']['rating_normal'] 



    try:
        fake_ua=UserAgent() 
        headers = {'User-Agent':fake_ua.random, 

                   'Accept': '*/*',
                    'Accept-Language': 'en-US,en;q=0.5',
                    'X-Shopee-Language': 'en',
                    'X-Requested-With': 'XMLHttpRequest',
                    'X-API-SOURCE': 'pc',
                    'If-None-Match-': '55b03-2ff39563c299cbdc937f8ab86ef322ab',
                    'DNT': '1',
                    'Referer': referer,
                    'TE': 'Trailers'} 
        ip = get_daili()
        proxies = {"proxies":{"https":ip}}
        response = requests.get(itemurl, headers = headers, proxies = proxies, verify=False)
        #response = requests.request("GET", itemurl, headers=headers, data=payload)
        if response.status_code == 200:
            item_info = response.json()
    except requests.ConnectionError as e:
        print(f' {url} error', e.args)    

    #print(json.dumps(item_info, indent=4))


    print(itemurl)
 

Ответ №1:

Я думаю, что это алгоритм для защиты их службы API, чтобы люди не могли злоупотреблять своим сервером.

Возможно, вы можете попробовать использовать python selenium и Selenium Wire для сбора данных.