Поиск комментариев с новостного сайта с использованием Python. Проблема с скрытием комментариев в разделе "Показать еще" - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь очистить комментарии под новостными статьями, чтобы поиграть с созданием языковой модели из этих комментариев.

Я успешно очистил раздел комментариев, но у меня возникают проблемы, когда есть скрытые комментарии под кнопкой «показать больше комментариев». Здесь - это справочный сайт, он находится на исландском языке c и есть два типа дополнительных кнопок.

Во-первых, кнопка, которая загружает еще X комментариев, на исландском c : Hlaða X ummæli að auki .

Во-вторых, кнопка, которая загружает еще X комментариев к данной цепочке комментариев, на исландском языке c: Sýna 10 svör að auki í þessum þræði .

Вот мой код atm. Любые советы по этому поводу приветствуются!

import requests
from jsonfinder import jsonfinder
import json
import lxml.html
import re
from bs4 import BeautifulSoup

url = 'https://www.visir.is/g/20201996612d?fbclid=IwAR2wg5dBj0ZyjmQbJBDwyOx1PNS1spS2bYAXEQmomcOa93Hsfe_8SE_Hrxo'

pattern = re.compile("ReactRenderer")

FB_COMMENT_PLUGIN_URL = "https://www.facebook.com/plugins/feedback.php"

r = requests.get(url)
root = lxml.html.fromstring(r.text)

# pick up the api_key:
api_key = root.xpath('/html/head/meta[@property="fb:app_id"][1]/@content')[0]
og_url = root.xpath('/html/head/meta[@property="og:url"][1]/@content')[0]
print("Api-key:", api_key)
print("Og-url:", og_url)
print()
payload = {"api_key": api_key, "href": og_url}

r = requests.get(FB_COMMENT_PLUGIN_URL, params=payload)
print(r.url)
print()
for _start, _end, obj in jsonfinder(r.text):
    if obj is None:
        continue
    else:
        if "require" in obj:
            for x in obj["require"]:
                matched = pattern.search(str(x))
                if matched:
                    comments_json = x[3][0]['props']['comments']['idMap']


resutls = {'url': url, 'title': '', 'comments':{}}

keys_for_title:list = ['id', 'name', 'uri', 'type']
keys_for_comments:list = ['id', 'authorID', 'body', 'ranges', 'timestamp', 'targetID', 'ogURL', 'likeCount', 'hasLiked', 'canLike', 'canEdit', 'hidden', 'highlightedWords', 'reportURI', 'spamCount', 'canEmbed', 'type']

increment=1
for key, value in comments_json.items():
    
    #We try match a pattern of keys to a given pattern to find each section
    if all(item in value.keys() for item in keys_for_title) and len(value.keys())==len(keys_for_title):
        resutls["title"] = value['name']
    
    
    if all(item in value.keys() for item in keys_for_comments) and len(value.keys())==len(keys_for_comments):
        comments:dict = {}
        comments['text'] = value['body']['text']
        comments['likes'] = value['likeCount']

        authorID = value['authorID']
        for k, v in comments_json.items():
            if v['id'] == authorID:
                comments['name'] = v['name']
               

        resutls['comments'][increment] = comments
        increment += 1

if comments_json:
    print(json.dumps(resutls, indent=4, ensure_ascii=False))

1 Ответ

0 голосов
/ 02 августа 2020

Проблема с вашим подходом заключается в том, что нет возможности выполнить на стороне клиента javascript, что обычно происходит, когда вы нажимаете кнопку «Показать больше ...» в обычном браузере. Чтобы обойти это, вам нужно добавить что-то, что может справиться с этим javascript. Один из распространенных способов добиться этого - использовать среду автоматизации браузера, такую ​​как Selenium, для загрузки страницы, а затем имитировать нажатие кнопки.

...