2015-08-01 2 views
0

Этот код пытается скрестить листинг Amazon, чтобы проверить его доступность через первого поставщика Amazon.Программа Python соскабливает текст, несмотря на то, что веб-страница не меняется

from lxml import html 
from time import sleep 
import requests 
import time 

Amazonurl = raw_input("Item URL: ") 

page = requests.get(Amazonurl) 
tree = html.fromstring(page.text) 

Stock = tree.xpath('//*[@id="merchant-info"]/text()') 
IfInstock = ''.join(Stock) 


if 'Ships from and sold by Amazon.com.' in IfInstock: 
    print 'Instock' 
    print time.strftime("%a, %d %b %Y %H:%M:%S") 

else: 
    print 'Not in Stock' 
    print time.strftime("%a, %d %b %Y %H:%M:%S") 

Как ни странно, когда я подключить, скажем, http://www.amazon.com/New-Nintendo-3DS-XL-Black/dp/B00S1LRX3W/ref=sr_1_1?ie=UTF8&qid=1438413018&sr=8-1&keywords=new+3ds, который не вышел на складе в течение последних нескольких дней, иногда код возвращает «Instock», в то время как другие времена, он вернется «Не акции". Я нашел, что это потому, что код так часто скребет

[] 

в то время как другие времена, он скребет следующее, как это должно быть.

['\n \n \n\n \n  \n  \n \n \n \n \n \n \n \n \n \n \n \n \n \n  Ships from and sold by Amazon.com.\n \n \n  \n  \n  \n  \n  \n  \n  Gift-wrap available.\n  \n\n'] 

Веб-страница, похоже, не меняется. Кто-нибудь знает, почему мой результат часто меняется, и, возможно, объяснение того, как я могу исправить эту проблему? Заранее спасибо.

+1

Просто убедитесь, что люди здесь могут помочь вам больше всего, я собираюсь посоветовать вам, пожалуйста, поделиться кодом, который может быть выполнен. Это делается для того, чтобы мы могли реплицировать вашу проблему. В этом случае отступ на вашем скрипте неверен. – gglasses

+0

@gglasses Удалено «while True:», которое должно исправить проблему с отступом. –

+0

И как часто вы обходите этот товар? – gglasses

ответ

1

Amazon отказывается обслуживать вас на этой странице.

Я просто добавил строку кода в свой скрипт, чтобы увидеть, что такое status_code ответа, когда вы получите результат odd.

from lxml import html 
from time import sleep 
import requests 
import time 

Amazonurl = "http://rads.stackoverflow.com/amzn/click/B00S1LRX3W" 
intent = 0 
while True: 
    page = requests.get(Amazonurl) 
    tree = html.fromstring(page.text) 

    print(page.status_code) 

    Stock = tree.xpath('//*[@id="merchant-info"]/text()') 
    IfInstock = ''.join(Stock) 

    if 'Ships from and sold by Amazon.com.' in IfInstock: 
     print('Instock') 
     print(time.strftime("%a, %d %b %Y %H:%M:%S")) 

    else: 
     print('Not in Stock') 
     print(time.strftime("%a, %d %b %Y %H:%M:%S")) 

    time.sleep(15) 

    if intent>15: 
     break 
    intent += 1 

Я побежал этот сценарий с временным интервалом 15 секунд так же, как вы сказали, что вы сделали. Вот результат:

200 
Instock 
Sat, 01 Aug 2015 19:51:27 
200 
Instock 
Sat, 01 Aug 2015 19:51:43 
503 
Not in Stock 
Sat, 01 Aug 2015 19:51:59 
200 
Instock 
Sat, 01 Aug 2015 19:52:15 
200 
Instock 
Sat, 01 Aug 2015 19:52:32 
200 
Instock 
Sat, 01 Aug 2015 19:52:48 
200 
Instock 
Sat, 01 Aug 2015 19:53:05 
200 
Instock 
Sat, 01 Aug 2015 19:53:22 
200 
Instock 
Sat, 01 Aug 2015 19:53:38 
200 
Instock 
Sat, 01 Aug 2015 19:53:55 
200 
Instock 
Sat, 01 Aug 2015 19:54:12 
200 
Instock 
Sat, 01 Aug 2015 19:54:29 
200 
Instock 
Sat, 01 Aug 2015 19:54:45 
200 
Instock 
Sat, 01 Aug 2015 19:55:02 
200 
Instock 
Sat, 01 Aug 2015 19:55:18 
200 
Instock 
Sat, 01 Aug 2015 19:55:35 
200 
Instock 
Sat, 01 Aug 2015 19:55:52 

Вы можете видеть, что, когда исход odd или «нет на складе» status_code является 503. Определение этого согласно http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html является следующее:

10.5.4 503 Service Unavailable В настоящее время сервер не может обработать запрос из-за временной перегрузки или обслуживания сервера. Импликация равна , что это временное условие, которое будет смягчено после некоторой задержки . Если известно, длина задержки МОЖЕТ быть указана в заголовке «Повторить-После» . Если ретрансляция не указана, клиент ДОЛЖЕН обрабатывать ответ, как это было бы для ответа 500.

Note: The existence of the 503 status code does not imply that a 
    server must use it when becoming overloaded. Some servers may wish 
    to simply refuse the connection. 

Это, как говорится, Amazon не служит вам эту страницу, так как вы делаете несколько запрос в течение короткого времени. Это «короткое» время на самом деле не является требованием для Amazon, и именно поэтому вы получаете большую часть времени 200 status_code.

Я надеюсь, что ответ на ваш вопрос. Теперь, если вы действительно хотите отказаться от таких сайтов, как Amazon, я бы рекомендовал вам использовать Scrapy, который довольно прост в использовании и прост в настройке. Вы можете уйти с сайтов, таких как Amazon, используя случайный user-agent. Но, конечно, это просто дополнение к вашему первоначальному вопросу.

Смежные вопросы