#python #python-3.x #web-scraping #beautifulsoup
#python #python-3.x #очистка веб-страниц #beautifulsoup
Вопрос:
Я хочу очистить все комментарии на французском языке на этом веб-сайте для всех страниц (807): https://fr.trustpilot.com/review/www.gammvert.fr
Всего 16 121 комментарий (на французском языке).
Вот мой сценарий :
import requests
from requests import get
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
root_url = 'https://fr.trustpilot.com/review/www.gammvert.fr'
urls = [ '{root}?page={i}'.format(root=root_url, i=i) for i in range(1,808) ]
comms = []
notes = []
for url in urls:
results = requests.get(url)
soup = BeautifulSoup(results.text, "html.parser")
commentary = soup.find_all('section', class_='review__content')
for container in commentary:
try:
comm = container.find('p', class_ = 'review-content__text').text.strip()
except:
comm = container.find('a', class_ = 'link link--large link--dark').text.strip()
comms.append(comm)
note = container.find('div', class_ = 'star-rating star-rating--medium').find('img')['alt']
notes.append(note)
data = pd.DataFrame({
'comms' : comms,
'notes' : notes
})
data['comms'] = data['comms'].str.replace('n', '')
#print(data.head())
data.to_csv('file.csv', sep=';', index=False)
Но, к сожалению, этот скрипт дал мне только 7261 комментарий, как вы могли видеть здесь: вывод
И я не понимаю, почему я не смог получить все комментарии? Скрипт не выдает мне никаких ошибок, поэтому я немного потерялся.
Есть идеи?
Спасибо.
Ответ №1:
Вероятно, веб-сайт «ограничивает скорость», поэтому после более чем 100 звонков с одного и того же IP-адреса они начинают блокировать вас и не отправляют обратно никаких данных. Ваша программа этого не замечает, потому что
for container in commentary:
# all the rest
ничего не делает, поскольку commentary
на данный момент = []
. Вы можете проверить это, напечатав len(commentary)
Вы можете проверить на веб-сайте, каков предел скорости, и добавить time.sleep()
соответствующий параметр в свой цикл. Кроме того, вы можете проверить, что results == '<Response [200]>'
в противном случае используется time.sleep(several minutes)
для задержки следующего вызова запроса.
Комментарии:
1. Спасибо за ваш ответ, я попробую его 🙂
2. Я помещаю time.sleep() следующим образом: для URL-адреса в urls: results = requests.get(url) time.sleep(50) soup = BeautifulSoup(results.text, «html.parser») Скрипт запущен прямо сейчас, как бы вы поместили его в свой код? Поскольку я не думаю, что это оптимальный способ, он очень длинный.
3. А также как я проверяю ограничение скорости wbesite?
4. Вы можете проверить developers.trustpilot.com что касается ограничения скорости, однако, похоже, они этого не заявляют. Вы можете попробовать
time.sleep(1)
или даже уменьшить значение, потому что 50 слишком экстремально. Наконец, вы также можете рассмотреть возможность использования их общедоступного API. В общем, я бы настоятельно рекомендовал использовать API вместо самостоятельной очистки данных, если опция API доступна.5. Все расскажите мне об этих API, но я действительно не понимаю, как это сделать и где? Не могли бы вы объяснить, если у вас есть время, плз? 🙂