Нестабильные результаты при очистке Amazon

#python #web-scraping #python-requests

#python #веб-очистка #python-запросы

Вопрос:

Я новичок в области очистки веб-страниц. Итак, надеюсь, этот вопрос ясен.

Я нашел в Интернете руководство по очистке данных Amazon на основе заданного ASIN (уникального номера Amazon). Смотрите : https://www.scrapehero.com/tutorial-how-to-scrape-amazon-product-details-using-python /

При запуске этого кода (я немного скорректировал код) Я столкнулся с проблемой, из-за которой каждый раз получал разные результаты (даже при запуске через 5 секунд). В моем примере один раз заголовки найдены, но через 5 секунд результат равен НУЛЮ.

Я думаю, причина в том, что я искал XPATH через Google Chrome, и в начале кода есть

 headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36'}
  

Мой вопрос: как я могу очистить содержимое стабильным способом? (например: получение реальных результатов страниц с использованием ASIN-номеров)

Ниже приведен код для воспроизведения. Вы можете запустить скрипт через командную строку:

 python script_name.py 
  

Большое спасибо за вашу помощь!

Скрипт:

 from lxml import html  
import csv,os,json
import requests

#from exceptions import ValueError
from time import sleep

def AmzonParser(url):
    headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36'}
    page = requests.get(url,headers=headers)
    while True:
        sleep(5)
        try:
            doc = html.fromstring(page.content)

            # Title 
            XPATH_NAME = '//*[@id="productTitle"]/text()'
            XPATH_NAME1 = doc.xpath(XPATH_NAME)
            TITLE =           ' '.join(''.join(XPATH_NAME1).split()) if XPATH_NAME1 else None

            #XPATH_SALE_PRICE = '//span[contains(@id,"ourprice") or contains(@id,"saleprice")]/text()'
            #XPATH_ORIGINAL_PRICE = '//td[contains(text(),"List Price") or contains(text(),"M.R.P") or contains(text(),"Price")]/following-sibling::td/text()'
            #XPATH_CATEGORY = '//a[@class="a-link-normal a-color-tertiary"]//text()'
            #XPATH_AVAILABILITY = '//div[@id="availability"]//text()'

            #RAW_NAME = doc.xpath(XPATH_NAME)
            #RAW_SALE_PRICE = doc.xpath(XPATH_SALE_PRICE)
            #RAW_CATEGORY = doc.xpath(XPATH_CATEGORY)
            #RAW_ORIGINAL_PRICE = doc.xpath(XPATH_ORIGINAL_PRICE)
            #RAw_AVAILABILITY = doc.xpath(XPATH_AVAILABILITY)

            #NAME =           ' '.join(''.join(RAW_NAME).split()) if RAW_NAME else None
            #SALE_PRICE =     ' '.join(''.join(RAW_SALE_PRICE).split()).strip() if RAW_SALE_PRICE else None
            #CATEGORY =       ' > '.join([i.strip() for i in RAW_CATEGORY]) if RAW_CATEGORY else None
            #ORIGINAL_PRICE = ''.join(RAW_ORIGINAL_PRICE).strip() if RAW_ORIGINAL_PRICE else None
            #AVAILABILITY =   ''.join(RAw_AVAILABILITY).strip() if RAw_AVAILABILITY else None

            #if not ORIGINAL_PRICE:
            #    ORIGINAL_PRICE = SALE_PRICE

            if page.status_code!=200:
                raise ValueError('captha')
            data = {
                    'TITLE':TITLE
                    #'SALE_PRICE':SALE_PRICE,
                    #'CATEGORY':CATEGORY,
                    #'ORIGINAL_PRICE':ORIGINAL_PRICE,
                    #'AVAILABILITY':AVAILABILITY,
                    #'URL':url,
                    }

            return data
        except Exception as e:
            print(e)

def ReadAsin():
    # AsinList = csv.DictReader(open(os.path.join(os.path.dirname(__file__),"Asinfeed.csv")))
    AsinList = [
            'B00AEINQ9K',
            'B00JWP8F3I']
    extracted_data = []
    for i in AsinList:
        url = "http://www.amazon.com/dp/" i
        print ("Processing: " url)
        extracted_data.append(AmzonParser(url))
        sleep(5)
    f=open('data_scraped_data.json','w')
    json.dump(extracted_data,f,indent=4)

if __name__ == "__main__":
    ReadAsin()
  

Комментарии:

1. Попробуйте распечатать page.content , и вы заметите, что Amazon обнаруживает, что выполняется обход, показывает страницу, предлагающую использование их официального API, который ofc больше не является страницей со списком.

2. Спасибо @ godof23, но когда я пытаюсь распечатать страницу.content, я получаю «должно быть str, а не ответ». Знаете ли вы, как я могу избежать детализации amazon, и, возможно, лучше: как я могу очистить содержимое с помощью ASIN? Большое спасибо!

3. Почему вам нужен веб-сайт, а не данные? То, что предлагает Amazon (используйте их API, чтобы напрямую получить то, что вы хотите), кажется хорошей идеей? Что именно вы ищете? Цена? Описание элемента? Что касается вашего вопроса относительно «должно быть str, а не Response»: попробуйте page.content.text

4. Вы можете найти документацию о том, как использовать Amazon API для получения информации о продукте здесь: docs.aws.amazon.com/AWSECommerceService/latest/DG /…

5. Спасибо @Gasp0de. Действительно, мне нужны данные с веб-сайта. На самом деле, нужна вся информация на странице продукта (заголовок, О продукте, Цена, Цена со скидкой, наличие на складе, от производителя, #Вопросы, # ответы, сведения о продукте, рейтинг, # продавцы, ASIN, рейтинг продаж). Думал, что эта информация была доступна только при очистке веб-сайта