Amazon заблокировал Python 3 соскобов с помощью bs4, запросов - PullRequest
0 голосов
/ 12 марта 2020

Этот код отлично работает несколько дней go, когда я его запускаю:

from bs4 import BeautifulSoup
import datetime
import requests

def getWeekMostRead(date):
    nonfiction_page = requests.get("https://www.amazon.com/charts/"+date.isoformat()+"/mostread/nonfiction")
    content = "amazon"+date.isoformat()+"_nonfiction.html"
    with open(content, "w", encoding="utf-8") as nf_file:
        print(nonfiction_page.content, file=nf_file)

    mostRead_nonfiction = BeautifulSoup(nonfiction_page.content, features="html.parser")

    nonfiction = mostRead_nonfiction.find_all("div", class_="kc-horizontal-rank-card")

    mostread = []
    for books in nonfiction:
        if books.find(class_="kc-rank-card-publisher") is None:
            mostread.append((
                books.find(class_="kc-rank-card-title").string.strip(),
                books.find(class_="kc-rank-card-author").string.strip(),
                "",
                books.find(class_="numeric-star-data").small.string.strip()
            ))
        else:
            mostread.append((
                books.find(class_="kc-rank-card-title").string.strip(),
                books.find(class_="kc-rank-card-author").string.strip(),
                books.find(class_="kc-rank-card-publisher").string.strip(),
                books.find(class_="numeric-star-data").small.string.strip()
            ))
    return mostread

mostread = []
date = datetime.date(2020,1,1)
while date >= datetime.date(2015,1,1):
    print("Scraped data from "+date.isoformat())
    mostread.extend(getWeekMostRead(date))
    date -= datetime.timedelta(7)
print("Currently saving scraped data to AmazonCharts.csv")
with open("AmazonCharts.csv", "w") as csv:
    counter = 0
    print("ID,Title,Author,Publisher,Rating", file=csv)
    for book in mostread:
        counter += 1
        print('AmazonCharts'+str(counter)+',"'+book[0]+'","'+book[1]+'","'+book[2]+'","'+book[3]+'"', file=csv)
    csv.close()

По какой-то причине сегодня я попытался запустить его снова, и я получил его в возвращенном HTML file:

To discuss automated access to Amazon data please contact api-services-support@amazon.com.\r\n\r\nFor information about migrating to our APIs refer to our Marketplace APIs at https://developer.amazonservices.com/ref=rm_5_sv, or our Product Advertising API at https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html/ref=rm_5_ac for advertising use cases.

Я понимаю, что Amazon - это тяжелые антискриптовые данные (или, по крайней мере, я прочитал это из некоторых ответов и тем). Я пытался использовать заголовки и задержки в коде, но это не работает. Был бы другой способ попробовать это? Или, если я должен ждать, как долго я должен ждать?

Ответы [ 2 ]

4 голосов
/ 12 марта 2020

Как вы заметили, Amazon очень противоскребает. Существует целая индустрия, построенная на извлечении данных из Amazon, и у Amazon есть собственный доступ к API для продажи, поэтому в их интересах запретить людям свободно получать данные со своих страниц.

Основываясь на вашем коде, я подозреваю, что вы сделали слишком много запросов слишком быстро и были заблокированы IP. При очистке сайтов, как правило, лучше выполнять ответственно, не слишком быстро, чередуя пользовательские агенты и чередуя IP-адреса с помощью прокси-службы.

Чтобы показаться менее программным c, вы также можете попробовать рандомизировать время запроса, чтобы казаться более человечным.

Несмотря на все это, вы все равно, скорее всего, столкнетесь с проблемами. Амазонка - это не просто сайт, чтобы надежно его почистить.

0 голосов
/ 12 марта 2020

Через некоторое время я придумал решение. Это довольно просто - на Amazon не было "2020-01-01", вместо этого я исправил "2020-01-05".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...