#python #web-scraping #beautifulsoup
Вопрос:
Я пытаюсь собрать обзоры с веб-сайта, чтобы быть точным, я пытаюсь получить тексты внутри span, но я не получаю никаких результатов. Я новичок в Python и scraping, поэтому я не знаю точно, что я делаю.
Код:
from bs4 import BeautifulSoup
import requests
url = "https://forum.bouyguestelecom.fr"
req = requests.get(url).text
soup = BeautifulSoup(req, 'html.parser')
activites = soup.find_all('div', class_="RF_CONTENT")
for activite in activites:
NickName = activite.find("span", class_="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME_NICKNAME").text
Name = activite.find("span", class_="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME_ACH_NAME").text
print(NickName)
print(Name)
Вот HTML, из которого я пытаюсь получить данные:
<div class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME">
<div class="RF_CONTENT">
<p><a href="https://forum.bouyguestelecom.fr/questions/2814793-trouve-inadmissibile-ligne-active-partir-20-novembre-realiser-commande-3-11" target="_blank">
<span class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME_NICKNAME">Celia q.</span>
<span class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME_ACTION"> a posé une question: Je trouve inadmissibile que ma ligne ne soit active qu'a partir du 20 novembre en ayant réaliser la commande le 3/11 ?</span><span class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME_DATETIME">Il y a 2 minute(s)</span></a>
</p>
<div class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_SCORE">20 <span class="RF_TEXT_INDICE"> pts</span></div></div>
</div></li><li class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM">
<div class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_PERFORMER">
<img src="https://api.rocketfid.com/media/default/rainbow/user/" alt="">
</div>
Вы можете увидеть это сами здесь. Мой код не возвращает результатов.
Комментарии:
1. Я взглянул на веб-сайт и код. Похоже, что либо указанный вами URL-адрес неверен, либо тот
popup
, который отображается при вводе, маскирует нужный вам html.2. Кроме того, источник информации неясен. Можете ли вы предоставить изображение того, какие обзоры вы хотите извлечь?
3. Да, конечно, я предоставлю фотографию в сообщении
4. Это динамическое отображение означает, что загрузка занимает некоторое время, поэтому вы не можете извлекать из
bs4
него только статические данные, поэтому вы должны использоватьselenium
для этого5. спасибо вам, мауч, за этот совет, как я уже сказал, я новичок в этом, поэтому я начну искать решение selenuim
Ответ №1:
Вы можете проанализировать эти данные, сделав прямой запрос к API / серверу веб-сайта, не используя selenium
для такой задачи.
Код и пример в онлайн-среде разработки:
Как насчет user-agent
того, если no user-agent
передается в запрос headers
при использовании requests
библиотеки, по умолчанию используются python-запросы, поэтому веб-сайты могут понять, что это бот / скрипт, и заблокировать запрос. Проверьте, что у вас user-agent
.
В этом случае это будет работать без user-agent
, но в большинстве случаев это необходимо для «реального» посещения пользователя, но опять же, user-agent
в некоторых случаях только добавления будет недостаточно, если это так, необходимо добавить дополнительные заголовки запросов.
import requests, json
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
"content-type": "application/json",
"x-instance": "rainbow" # only this matter, otherwise it will blow up with 501 error
}
response = requests.get("https://api.rocketfid.com/activity/cache/all/0/5/", headers=headers).text
# print data to see the actual JSON string
# and grab additional data you want the same way as shown below
# simpy add additional variable and access it by KEY
data = json.loads(response)
for result in data:
nick_name = result["performer"]["nickname"].title()
# if data in achievement is empty -> then its located in the action key
# using try/except is a one way of handling it
try:
name = result["achievement"]["name"]
except:
name = result["action"]["name"]
try:
score = result["achievement"]["score"]
except:
score = result["action"]["score"]
# additional data here..
print(f"{nick_name}n{name}n{score}n")
# output
'''
Adrien S.
En savoir plus
10
Adrien S.
a posé une question: Remboursement clé 4g ?
20
Marie-Claude P.
Première fois
20
Marie-Claude P.
a répondu à la question: Comment supprimer l’autre numéro de contact dans mes préférences de contact ?
10
Marie-Claude P.
a fait la première réponse à une question
20
'''