Очистка веб-сайта с данными, скрытыми под «читать дальше» - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь почистить отзывы на TripAdvisor.com и хочу получить данные под кнопкой «Подробнее» на сайте. Есть ли в любом случае, чтобы очистить это без использования селена?

Пока это код, который я использовал

resp = requests.get('https://www.tripadvisor.com.ph/Hotel_Review-g8762949-d1085145-Reviews-El_Rio_y_Mar_Resort-San_Jose_Coron_Busuanga_Island_Palawan_Province_Mimaropa.html#REVIEWS') 
rsp_soup = BeautifulSoup(resp.text, 'html.parser')
rsp_soup.findAll(attrs={"class": "hotels-review-list-parts-ExpandableReview__reviewText--3oMkH"})

Но он не может очистить содержимое под «Читать дальше»

Ответы [ 2 ]

1 голос
/ 20 июня 2019

В общем, нет. Все зависит от того, что произойдет, когда вы нажмете «Подробнее», то есть где фактические данные равны .

Обычно есть две возможности (не взаимоисключающие):

  • данные лежат на той же странице, скрыты, и "читать дальше", например, метка для скрытого флажка, который, если он выбран, скрывает область «читать дальше» и отображает остальную часть текста. Таким образом, отображаемая страница становится меньше и удобнее для чтения, но все же она загружается в рамках одного вызова. В этом случае вам просто нужно найти подходящий селектор (например, #someotherselector+input[type=checkbox] ~ div.moreText или что-то в этом роде).
  • данных там нет , они будут загружены через AJAX через некоторое время, оставаясь скрытыми или только при нажатии на «читать дальше», которые затем будут отображаться. Это позволяет сохранить небольшую страницу, которая загружается быстро и в то же время содержит множество элементов, которые загружаются медленно, загружая их в фоновом режиме или по запросу. В этом случае вам необходимо проверить фактический вызов AJAX (обычно он несет идентификатор или значение данных, хранящееся в элементе «Load More ...»: <span class="loadMore" data-text-id="x19834">Read more...</span>) и выполнить тот же вызов с соответствующими заголовками:

    resp2 = reports.get ('https://www.tripadvisor.com.ph/whatever/api/is/used?id=' + element.attr (' data-text-id ')) *

Не зная, как извлекаются данные и где находятся соответствующие элементы (например, имя и содержание атрибута переноса идентификатора и т. Д.), Невозможно дать ответ, который будет работать каждый раз.

Возможно, вас заинтересует , правильно ли это сделать . Данные, которые вы копируете, защищены авторским правом, и TripAdvisor может изменить ситуацию настолько, что у вас возникнут проблемы с обслуживанием скребка.

0 голосов
/ 20 июня 2019

Обзоры частично отображаются в html, пока вы не нажмете на read more, который фактически не выполняет Ajax-вызов, а обновляет страницу из данных, содержащихся в window.__WEB_CONTEXT__. Вы можете получить доступ к этим данным, посмотрев на тег <script>, в котором они появляются:

<script>
     window.__WEB_CONTEXT__={pageManifest:{"assets":["/components/dist/@ta/platform.polyfill.084d8cdf5f.js","/components/dist/runtime.56c5df2842.js", ....  }
</script>

Как только вы получите его, вы и вы сможете извлечь и обработать данные в формате JSON. Вот полный код:

import json
from bs4 import BeautifulSoup
resp = requests.get('https://www.tripadvisor.com.ph/Hotel_Review-g8762949-d1085145-Reviews-El_Rio_y_Mar_Resort-San_Jose_Coron_Busuanga_Island_Palawan_Province_Mimaropa.html#REVIEWS') 

data = BeautifulSoup(resp.content).find('script', text = re.compile('window.__WEB_CONTEXT__')).text

#Some text processing to make the tag content a valid json
pageManifest = json.loads(data.replace('window.__WEB_CONTEXT__=','').replace('{pageManifest:', '{"pageManifest":')[:-1])


for x in pageManifest['pageManifest']['apolloCache']:
    try:
        reviews = x['result']['locations'][0]['reviewList']['reviews']       
    except:
        pass

print([x['text'] for x in reviews])

выход

['Do arrange for airport transfers! From the airport, you will be taking a van for around 20 minutes, then you\'ll be transferred to a banca/boat for a 25 minute ride to the resort. Upon arrival, you\'ll be greeted by a band that plays their "welcome, welcome" song and in our case, we were met by Maria (awesome gal!) who introduced the group to the resort facilities and checks you in at the bar.I booked a deluxe room, which is actually a duplex with 2 adjoining rooms, ideal
for families, which accommodates 4 to a room.Rooms are clean and bed is comfortable.Potable water is provided upon check in , but is chargeable thereafter.Don\ 't worry, ...FULL REVIEW...',
 "Stayed with my wife and 2 children, 10y and 13y. ...FULL REVIEW...",
 'Beginning at now been in Coron for a couple of   ...FULL REVIEW...',
 'This was the most beautiful and relaxing place   ...FULL REVIEW...',
 'We spent 2 nights at El rio. It was incredible,  ...FULL REVIEW... ']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...