Нужны ли ротационные прокси для парсинга веб-страниц Shopee с использованием их API? ⇐ Python
Нужны ли ротационные прокси для парсинга веб-страниц Shopee с использованием их API?
Контекст: я работаю над проектом очистки веб-страниц на Python, который включает в себя сбор данных из Shopee с использованием общедоступного API Shopee. Цель состоит в том, чтобы извлечь различную информацию о продуктах из нескольких магазинов Shopee. Однако я столкнулся с рядом проблем и проблем, с которыми мне нужна помощь.
Описание проблемы
Ограничение скорости: в настоящее время в коде отсутствует эффективное ограничение скорости. Мне нужна помощь во внедрении надлежащего механизма ограничения скорости, чтобы избежать блокировки API Shopee.
Управление прокси: хотя код перемещается по списку прокси, я не уверен, правильно ли он их обрабатывает. Мне нужны рекомендации по лучшим методам управления прокси-серверами в этом коде.
Обработка ошибок: я хочу улучшить обработку ошибок. В настоящее время код обрабатывает ProxyError и ConnectionError. Мне нужен совет по обработке дополнительных исключений, особенно тех, которые связаны с ответами Shopee API.
Масштабируемость. Поскольку я планирую расширять свои усилия по очистке данных, мне интересно понять соображения, связанные с поддержанием эффективности и надежности кода.
Проверка данных. После очистки мне необходимо убедиться в точности и полноте собранных данных. Мне нужны предложения по методам проверки и проверки данных.
Любые рекомендации, улучшения кода или советы, связанные с этими проблемами, будут высоко оценены. Спасибо! В моем коде ниже я реализовал ротацию прокси, используя метод itertools.cycle, чтобы избежать банов или ограничений IP при отправке запросов к API Shopee. Однако я столкнулся с трудностями при использовании этого подхода и не уверен, необходима ли ротация прокси для этой конкретной задачи очистки. Важно ли использовать чередующиеся прокси при извлечении данных из общедоступного API Shopee? Существуют ли какие-либо ограничения скорости или запреты на IP-адреса, которые требуют их использования? Если смена прокси-серверов не требуется, каковы рекомендуемые альтернативы для обеспечения надежного и эффективного парсинга без риска возникновения проблем, связанных с IP?
запросы на импорт импортировать CSV из цикла импорта itertools от времени импортировать сон из fake_useragent импортировать UserAgent из запросов.исключения импортируют ProxyError, ConnectionError CSV_FILE_NAME = 'product_data_v2.csv' CSV_HEADER = [ «Название», «Акции», «Название магазина», «Идентификатор магазина», «Идентификатор товара», «Продано в месяц», «Количество продаж», «Количество лайков», «Название варианта», «Вариации», «Текущая цена», «Минимальная цена», «Максимальная цена», «Гарантия самой низкой цены (T/F)», «Показать скидку», «Основная скидка», «Текущая скидка», «Рейтинг товара», «Рейтинг», «Проверено Shopee (T/F)», «Официальный Shopee (T/F)», «Приемлема рассрочка платежа CC (T/F)», «Нет возможности рассрочки платежа CC (T/F)», «Идентификатор пакетной сделки», «Можно использовать пакетную сделку (T/F)», «Можно использовать оптовую сделку (T/F)», «Предпочтительно плюс продавец (T/F)», «Местоположение магазина», «Рейтинг магазина», «Можно использовать наложенный платеж (T/F)», «Обслуживается ли покупатель (T/F)», «Количество проданных срочных распродаж», «Срочная распродажа», «Акция на рынке (T/F)» ] # Функция для чтения идентификаторов Shopee продавца из CSV-файла защита read_seller_shopee_id_from_csv(csv_file_name): продавец_shopee_ids = [] с open(csv_file_name, 'r') как csvfile: читатель = csv.reader(csvfile) для строки в ридере: продавец_shopee_ids.extend(строка) вернуть продавец_shopee_ids #пользовательский агент user_agent = ПользовательскийАгент() #Читаем идентификаторы продавца и покупателя из CSV-файла SELLER_SHOPEE_IDS = read_seller_shopee_id_from_csv('shop_id.csv') # Функция для чтения IP-адресов прокси из файла CSV защита read_proxies_from_csv(csv_file_name): proxy1_list = [] # Обновленное имя переменной с open(csv_file_name, 'r') как csvfile: читатель = csv.reader(csvfile) для строки в ридере: proxy1_list.append(row[0]) # Предполагается, что данные прокси находятся в первом столбце return proxy1_list # Обновленное имя переменной proxy_list = read_proxies_from_csv('workingproxiesv2.csv') proxy_pool = цикл (список_прокси) #Переменные ограничения скорости (отрегулируйте по мере необходимости) REQUESTS_PER_MINUTE = 60 TIME_BETWEEN_REQUESTS = 60 / REQUESTS_PER_MINUTE #Сон на 60 секунд между запросами защита make_api_request(seller_shopee_id, заголовки): прокси = следующий (прокси_пул) url = f'https://shopee.ph/api/v4/recommend/reco ... _shopee_id}' пытаться: ответ = запросы.get(url, headers=headers, proxies={"http": прокси, "https": прокси}) response.raise_for_status() # Вызывает исключение, если код состояния не 200 если ответ.код_статуса == 200: return response.json()['data']['sections'][0]['data']['item'] еще: print(f"Запрос продавца {seller_shopee_id} не удался. Код состояния: {response.status_code}") возвращаться [] кроме (ProxyError, ConnectionError) как e: print(f"Ошибка прокси-сервера или ошибка соединения для {прокси}: {str(e)}") возвращаться [] защита Extract_data (элемент): tier_variations = item.get('tier_variations') имя_вариации = tier_variations[0]['name'] если tier_variations иначе Нет variation_options = tier_variations[0]['options'] if tier_variations else None скидка = элемент['скидка'] if ('скидка' в элементе и элемент['скидка'] не имеет значения None) else 0 строка_данных = [ item.get('name'), item.get('stock'), item.get('shop_name'), item.get('shopid'), item.get('itemid'), item.get('продано'), item.get('историческое_продано'), item.get('liked_count'), имя_варианта, варианты_варианта, item.get('price') / 100000, если item.get('price') иначе Нет, item.get('price_min') / 100000, если item.get('price_min') иначе Нет, item.get('price_max') / 100000, если item.get('price_max') иначе Нет, item.get('has_lowest_price_guarantee'), item.get('show_discount'), item.get('raw_discount'), скидка, item.get('item_rating').get('rating_star'), item.get('item_rating').get('rating_count'), item.get('shopee_verified'), item.get('is_official_shop'), item.get('is_cc_installment_pay_eligible'), item.get('is_non_cc_installment_pay_eligible'), item.get('bundle_deal_id'), item.get('can_use_bundle_deal'), item.get('can_use_wholesale'), item.get('is_preferred_plus_seller'), item.get('shop_location'), item.get('shop_rating'), item.get('can_use_cod'), item.get('is_on_flash_sale'), item.get('is_service_by_shopee'), item.get('flash_sale_sold_count'), item.get('is_mart') ] вернуть строку_данных защита write_data_to_csv(данные, имя_файла_csv): с open(csv_file_name, mode='a', newline='',coding='utf-8') как csv_file: csv_writer = csv.writer(csv_file) csv_writer.writerow(CSV_HEADER) csv_writer.writerows (данные) защита основной(): # Записываем строку заголовка CSV вне цикла с open(CSV_FILE_NAME, mode='w', newline='',coding='utf-8') как csv_file: csv_writer = csv.writer(csv_file) csv_writer.writerow(CSV_HEADER) для продавца_shopee_id в SELLER_SHOPEE_IDS: заголовки = {'Агент пользователя': user_agent.random} данные = make_api_request (seller_shopee_id, заголовки) если данные: data_rows = [extract_data(элемент) для элемента в данных] write_data_to_csv(data_rows, CSV_FILE_NAME) print(f'{len(data)} элементы были записаны в {CSV_FILE_NAME}') # Реализация ограничения скорости спать(TIME_BETWEEN_REQUESTS) если __name__ == "__main__": основной() # Точка входа скрипта если __name__ == "__main__": основной()
Контекст: я работаю над проектом очистки веб-страниц на Python, который включает в себя сбор данных из Shopee с использованием общедоступного API Shopee. Цель состоит в том, чтобы извлечь различную информацию о продуктах из нескольких магазинов Shopee. Однако я столкнулся с рядом проблем и проблем, с которыми мне нужна помощь.
Описание проблемы
Ограничение скорости: в настоящее время в коде отсутствует эффективное ограничение скорости. Мне нужна помощь во внедрении надлежащего механизма ограничения скорости, чтобы избежать блокировки API Shopee.
Управление прокси: хотя код перемещается по списку прокси, я не уверен, правильно ли он их обрабатывает. Мне нужны рекомендации по лучшим методам управления прокси-серверами в этом коде.
Обработка ошибок: я хочу улучшить обработку ошибок. В настоящее время код обрабатывает ProxyError и ConnectionError. Мне нужен совет по обработке дополнительных исключений, особенно тех, которые связаны с ответами Shopee API.
Масштабируемость. Поскольку я планирую расширять свои усилия по очистке данных, мне интересно понять соображения, связанные с поддержанием эффективности и надежности кода.
Проверка данных. После очистки мне необходимо убедиться в точности и полноте собранных данных. Мне нужны предложения по методам проверки и проверки данных.
Любые рекомендации, улучшения кода или советы, связанные с этими проблемами, будут высоко оценены. Спасибо! В моем коде ниже я реализовал ротацию прокси, используя метод itertools.cycle, чтобы избежать банов или ограничений IP при отправке запросов к API Shopee. Однако я столкнулся с трудностями при использовании этого подхода и не уверен, необходима ли ротация прокси для этой конкретной задачи очистки. Важно ли использовать чередующиеся прокси при извлечении данных из общедоступного API Shopee? Существуют ли какие-либо ограничения скорости или запреты на IP-адреса, которые требуют их использования? Если смена прокси-серверов не требуется, каковы рекомендуемые альтернативы для обеспечения надежного и эффективного парсинга без риска возникновения проблем, связанных с IP?
запросы на импорт импортировать CSV из цикла импорта itertools от времени импортировать сон из fake_useragent импортировать UserAgent из запросов.исключения импортируют ProxyError, ConnectionError CSV_FILE_NAME = 'product_data_v2.csv' CSV_HEADER = [ «Название», «Акции», «Название магазина», «Идентификатор магазина», «Идентификатор товара», «Продано в месяц», «Количество продаж», «Количество лайков», «Название варианта», «Вариации», «Текущая цена», «Минимальная цена», «Максимальная цена», «Гарантия самой низкой цены (T/F)», «Показать скидку», «Основная скидка», «Текущая скидка», «Рейтинг товара», «Рейтинг», «Проверено Shopee (T/F)», «Официальный Shopee (T/F)», «Приемлема рассрочка платежа CC (T/F)», «Нет возможности рассрочки платежа CC (T/F)», «Идентификатор пакетной сделки», «Можно использовать пакетную сделку (T/F)», «Можно использовать оптовую сделку (T/F)», «Предпочтительно плюс продавец (T/F)», «Местоположение магазина», «Рейтинг магазина», «Можно использовать наложенный платеж (T/F)», «Обслуживается ли покупатель (T/F)», «Количество проданных срочных распродаж», «Срочная распродажа», «Акция на рынке (T/F)» ] # Функция для чтения идентификаторов Shopee продавца из CSV-файла защита read_seller_shopee_id_from_csv(csv_file_name): продавец_shopee_ids = [] с open(csv_file_name, 'r') как csvfile: читатель = csv.reader(csvfile) для строки в ридере: продавец_shopee_ids.extend(строка) вернуть продавец_shopee_ids #пользовательский агент user_agent = ПользовательскийАгент() #Читаем идентификаторы продавца и покупателя из CSV-файла SELLER_SHOPEE_IDS = read_seller_shopee_id_from_csv('shop_id.csv') # Функция для чтения IP-адресов прокси из файла CSV защита read_proxies_from_csv(csv_file_name): proxy1_list = [] # Обновленное имя переменной с open(csv_file_name, 'r') как csvfile: читатель = csv.reader(csvfile) для строки в ридере: proxy1_list.append(row[0]) # Предполагается, что данные прокси находятся в первом столбце return proxy1_list # Обновленное имя переменной proxy_list = read_proxies_from_csv('workingproxiesv2.csv') proxy_pool = цикл (список_прокси) #Переменные ограничения скорости (отрегулируйте по мере необходимости) REQUESTS_PER_MINUTE = 60 TIME_BETWEEN_REQUESTS = 60 / REQUESTS_PER_MINUTE #Сон на 60 секунд между запросами защита make_api_request(seller_shopee_id, заголовки): прокси = следующий (прокси_пул) url = f'https://shopee.ph/api/v4/recommend/reco ... _shopee_id}' пытаться: ответ = запросы.get(url, headers=headers, proxies={"http": прокси, "https": прокси}) response.raise_for_status() # Вызывает исключение, если код состояния не 200 если ответ.код_статуса == 200: return response.json()['data']['sections'][0]['data']['item'] еще: print(f"Запрос продавца {seller_shopee_id} не удался. Код состояния: {response.status_code}") возвращаться [] кроме (ProxyError, ConnectionError) как e: print(f"Ошибка прокси-сервера или ошибка соединения для {прокси}: {str(e)}") возвращаться [] защита Extract_data (элемент): tier_variations = item.get('tier_variations') имя_вариации = tier_variations[0]['name'] если tier_variations иначе Нет variation_options = tier_variations[0]['options'] if tier_variations else None скидка = элемент['скидка'] if ('скидка' в элементе и элемент['скидка'] не имеет значения None) else 0 строка_данных = [ item.get('name'), item.get('stock'), item.get('shop_name'), item.get('shopid'), item.get('itemid'), item.get('продано'), item.get('историческое_продано'), item.get('liked_count'), имя_варианта, варианты_варианта, item.get('price') / 100000, если item.get('price') иначе Нет, item.get('price_min') / 100000, если item.get('price_min') иначе Нет, item.get('price_max') / 100000, если item.get('price_max') иначе Нет, item.get('has_lowest_price_guarantee'), item.get('show_discount'), item.get('raw_discount'), скидка, item.get('item_rating').get('rating_star'), item.get('item_rating').get('rating_count'), item.get('shopee_verified'), item.get('is_official_shop'), item.get('is_cc_installment_pay_eligible'), item.get('is_non_cc_installment_pay_eligible'), item.get('bundle_deal_id'), item.get('can_use_bundle_deal'), item.get('can_use_wholesale'), item.get('is_preferred_plus_seller'), item.get('shop_location'), item.get('shop_rating'), item.get('can_use_cod'), item.get('is_on_flash_sale'), item.get('is_service_by_shopee'), item.get('flash_sale_sold_count'), item.get('is_mart') ] вернуть строку_данных защита write_data_to_csv(данные, имя_файла_csv): с open(csv_file_name, mode='a', newline='',coding='utf-8') как csv_file: csv_writer = csv.writer(csv_file) csv_writer.writerow(CSV_HEADER) csv_writer.writerows (данные) защита основной(): # Записываем строку заголовка CSV вне цикла с open(CSV_FILE_NAME, mode='w', newline='',coding='utf-8') как csv_file: csv_writer = csv.writer(csv_file) csv_writer.writerow(CSV_HEADER) для продавца_shopee_id в SELLER_SHOPEE_IDS: заголовки = {'Агент пользователя': user_agent.random} данные = make_api_request (seller_shopee_id, заголовки) если данные: data_rows = [extract_data(элемент) для элемента в данных] write_data_to_csv(data_rows, CSV_FILE_NAME) print(f'{len(data)} элементы были записаны в {CSV_FILE_NAME}') # Реализация ограничения скорости спать(TIME_BETWEEN_REQUESTS) если __name__ == "__main__": основной() # Точка входа скрипта если __name__ == "__main__": основной()
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Проблема с поиском элемента для парсинга веб-страниц с помощью Selenium.
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-