Нестабильные результаты при очистке Amazon - PullRequest
0 голосов
/ 28 марта 2019

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

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

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

Я думаю, что причина в том, что я искал 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()
...