刮取特定网站的所有评论

时间:2016-08-02 16:37:31

标签: python beautifulsoup

我想从特定文章的所有页面中删除所有评论。例如,本文:Link

我认为这些评论都是用javascript编写的,有谁可以帮我弄清楚如何抓取所有评论?

这是我使用的代码

def getSpiegelComments(url):
    try:
        html = urlopen(url)
    except HTTPError as e:
        print(e)
        return None
    try:
        bsObj = BeautifulSoup(html, 'html.parser')
        comments = bsObj.findAll("div", {"class": "article-comment"})
    except AttributeError as e:
        return None
    for comment in comments:
        yield comment

url = 'http://www.spiegel.de/politik/ausland/syrien-die-islamisten-sind-aleppos-letzte-hoffnung-a-1105806.html'
comments = getSpiegelComments(url)

if comments == None:
    print("Comments could not be found on " + url)
else:
    for comment in comments:
        print(comment)

我需要所有页面的所有评论(目前为124条)。不仅是第一页的5条评论。

2 个答案:

答案 0 :(得分:3)

js-article-post-full-text 的div下的每个 div.article-comment-title 之后,所有文本都可用:

import requests

soup = BeautifulSoup(requests.get("http://www.spiegel.de/politik/ausland/syrien-die-islamisten-sind-aleppos-letzte-hoffnung-a-1105806.html").content)

for comm in soup.select("div.article-comment-title"):
    print(comm.a.text)
    print(comm.find_next("div","js-article-post-full-text").text)

要获得全部120+,您可以使用传递偏移号码的网址http://www.spiegel.de/fragments/community/spon-495132-{}.html开始:

import re

def yield_comments(soup):
    for comm in soup.select("div.article-comment-title"):
        yield comm.a.text.strip(),comm.find_next("div", "js-article-post-full-text").text.strip()


next_url = "http://www.spiegel.de/fragments/community/spon-495132-{}.html"
url = "http://www.spiegel.de/politik/ausland/syrien-die-islamisten-sind-aleppos-letzte-hoffnung-a-1105806.html"


with requests.Session() as s:
    soup = BeautifulSoup(s.get(url).content)
    # get total comments
    tot = re.search("\d+",soup.select_one("#js-article-comments-box-pager").find_previous_sibling("span").text)
    tot = int(tot.group())
    # get comments from first page
    for title, com in yield_comments(soup):
        print(title, com)
    # start at the 6th comment until the end
    for page in range(6, tot, 5):
        soup = BeautifulSoup(s.get(next_url.format(page)).content)
        for title, com in yield_comments(soup):
            print(title, com)

这将给你一路评论124:

.......................................
(u'117. Horst John', u'Zitat von Horst JohnAl-Sham, Al-Nusra usw. sind Nachfolger der Al qaida. Diese als Befreier zu sehen ist der blanke Hohn. Schauen sie nur die youtube Videos diese langb\xe4rtigen gekauften Terrorbande sich an. Waffendepots in Krankenh\xe4user und Schulen, Bombenattacken auf Fl\xfcchtlingscamps sind das Werk dieser Terroristen.\r\n\r\nWer sieht die denn hier oder auf SPON als Befreier? das steht ja nur, das das die letzte Hoffnung ist. Und so wird es sich wahrscheinlich auch f\xfcr die dort hungernden Menschen anf\xfchlen.')
(u'118. Verantwortung', u"Die viel naheliegendere Frage ist, warum ein Umsturzversuch, egal aus welcher Motivation heraus, der hunderttausende Tote gefordert, Millionen Menschen vertrieben und ein ganzes Land in eine Tr\xfcmmerlandschaft verwandelt hat, nicht l\xe4ngst vor Jahren abgebrochen wurde. \r\nDie Antwort ist bekannt und hat mit einer weiteren Frage zu tun:\r\n\r\nWieso fand sich die Bundesrepublik in einer Gemeinschaft der 'Freunde Syriens' mit Saudi-Arabien, Katar und der T\xfcrkei wieder, die nun beim besten Willen mit Demokratie in Syrien nichts zu tun hatten, die aber sp\xe4testens seit anfang 2012 flei\xdfig Waffen nach Syrien pumpten?\r\nhttp://www.nytimes.com/interactive/2013/03/25/world/middleeast/an-arms-pipeline-to-the-syrian-rebels.html?ref=middleeast&_r=0")
(u'119. @ Piece', u'Zitat von Pieceich war bisher nicht als Kommentator bei SPON registriert, aber der hier publizierte Artikel ist derart nah an der Grenze zur islamistischen Propaganda, dass ich mich einer scharfen Protestnote nicht erwehren kann:\r\nWie um alles in der Welt ist es m\xf6glich radikalste Islamisten als "letzte Hoffnung f\xfcr Aleppo" derart offen zu glorifizieren? \r\n\r\nUnter gr\xf6\xdftem Wohlwollen verbleiben als Motivation f\xfcr diese Zeilen zwei M\xf6glichkeiten:\r\n\r\n1.Dem Autor dieses Artikels ist nicht bekannt welche Konsequenzen ein Sieg dieser "Freiheitsk\xe4mpfer" f\xfcr die Zivilbev\xf6lkerung nach sich z\xf6ge. \r\n\r\n2. Die Konsequenzen sind bekannt, werden jedoch als weniger schwerwiegend erachtet.\r\n\r\nBeides disqualifiziert den Autor im SPON zu publizieren.\r\n\r\n\r\nWas die wahren Motive der Dschihadisten (Stichwort: menschliche Schutzschilde usw.) anbetrifft, ganz zu schweigen.\r\n\r\nEs gibt noch eine Dritte M\xf6glichkeit: Sie haben den Autor nicht verstanden. Er hat sich keineswegs mit den Terroristen gemein gemacht, sondern lediglich versucht, die Gef\xfchlslage der dort eingeschlossenen Menschen nachzuvollziehen. Aber da m\xfcsste man dann nat\xfcrlich mal genauer lesen und auch noch mitdenken.')
(u'120. Die letzte Hofnung', u'Islamisten die letzte, im wahrsten Sinne des Wortes,\r\nHoffnung. Sind nicht die Islamisten und andere Rebellen der Grund daf\xfcr, dass die Bev\xf6lkerung so tief in der ...\r\nsitzt. Von wem wird dieser Schreiber eigentlich gesponsert.')
(u'121. @jethan', u'Zitat von jethaneigentlich islamische Terroristen, sind der Grund und der Ausl\xf6ser dieser Katastrophe.\r\nSie jetzt als Retter zu pr\xe4sentieren ist blanker Hohn gegen\xfcber der betroffenen Bev\xf6lkerung.\r\nDie h\xe4tte l\xe4ngst durch die Korridore die Stadt verlassen k\xf6nnen, w\xe4re sie nicht von den Terroristen, ja genau, denselben die sich jetzt als Retter feiern lassen, daran gehindert worden.\r\n\r\nDer Ausl\xf6ser ist Assat selbst: Er hat friedliche Demonstrationen mit Panzern niederwalzen lassen. DAS war der Beginn. Weitere Proteste der Bev\xf6lkerung gegen dieses Vorgehen folgte auf dem Fu\xdfe. Daraufhin lie\xdf Assat massiv seine Armee gegen die Demonstranten einsetzen.\r\n\r\nDas schaukelte sich dann soweit hoch, das teils ein machtvakuum entstand. Erst jetzt traten fanatische Islamisten auf den Plan.\r\n\r\nSie ignorieren die ganze Vorgeschichte.')
(u'122.', u'Zitat von jowittIch weis nicht, was Sie haben. In dem Artikel steht nichts davon, das die angreifenden Islamisten "gut" seien. Im gegenteil: Dort wird beschrieben, das sie einen "Gottesstaat" nach der Scharia wollen.\r\n\r\nNehmen Sie eigentlich alles so w\xf6rtlich? Dank zahlreicher Stilmittel l\xe4sst sich ein Text nicht nur interessant gestalten, manche lassen sich auch hervorragend dazu verwenden einen unterbewussten Eindruck beim Leser haften zu lassen. Propaganda egal welcher politischen Seite funktioniert auch oft auf die gleiche Art.\r\n\r\nDie "Rebellen" (stimme f\xfcr Unwort des Jahres in dieser Verwendung) l\xe4sst der Autor im Artikel an vielen Stellen tats\xe4chlich so dastehen als w\xfcrden diese nur den Zivilisten helfen wollen. Das wird so explizit nicht klar genannt, erschlie\xdft sich jedoch aus Wortwahl, Inhalt und Zusammenhang. W\xfcrde man in der Presse das offen so schreiben, w\xfcrde man hinterher definitiv darauf festgenagelt werden. Suchen Sie den Link des Mitkommentators zur ZON Meldung raus, nachdem die Rebellen die Zivilisten nicht aus der Stadt lassen. Dann vergleichen Sie den Inhalt dieses Artikels mit den vorliegenden Fakten, gerne auch auf den BBC News Seiten, die in dem Fall auch wesentlich objektiver sind. Das macht es u. U. leichter nachzuvollziehen, was der Vorposter gemeint hat.\r\n\r\nDie Rebellen, komischerweise tats\xe4chlich nicht Terroristen genannt obwohl die Definition passt, werden von Anfang an auf SPON und einigen anderen Nachrichtenseiten sehr besch\xf6nigend in den Artikeln abgebildet, \xe4hnlich der neuen Kiewer Regierung oder in weiten Teilen auch Erdogan. Da muss man noch nicht einmal auf RT oder \xe4hnliche Seiten, um das als Bl\xf6dsinn auszufiltern, da reichen ganz normale, objektive Nachrichten ohne Meinungsbildung alla BILD.')
(u'123. Guter Bericht', u'Danke f\xfcr diesen Bericht zur Lage in Syrien. \r\n\r\nUnd auch etwas zum Nachdenken: Wenn wir (die freien Demokratien) nicht helfen, aber radikale Islamisten, wird da nicht die H\xe4lfte Bev\xf6lkerung Syriens - immerhin mehr als 10 Millionen Menschen - den Islamisten geradezu in die Arme getrieben? Unterlassene Hilfeleistung wird bestraft. aj')
(u'124. Unterst\xfctzung von Extremisten', u'Zitat von jowittIch weis nicht, was Sie haben. In dem Artikel steht nichts davon, das die angreifenden Islamisten "gut" seien. Im gegenteil: Dort wird beschrieben, das sie einen "Gottesstaat" nach der Scharia wollen.\r\n\r\nWas steht in der \xdcberschrift?\r\n"Belagerte Stadt in Syrien: Die Islamisten sind Aleppos letzte Hoffnung"\r\nund weiter geht\'s:\r\n"W\xe4hrend die USA und Europa zusehen, wie Hunderttausende Menschen in Aleppo ausgehungert werden, kommen Islamisten den Eingeschlossenen zur Hilfe. Angef\xfchrt werden sie von einer Terrormiliz."\r\n\r\nWie w\xfcrden Sie denn diese SPON Einf\xfchrung interpretieren?\r\nEs steht doch w\xf6rtlich da - eine Terrormiliz kommt den Eingeschlossenen zu Hilfe und ist Hoffnung, sogar letzte Hoffnung.\r\n\'Hilfe\' assoziiere ich immer noch mit \'etwas Gutes leisten\'.\r\nEs steht im Text dann auch an keiner Stelle, da\xdf diese Hilfe vom Autor irgendwie ablehnt wird. \r\nWie auch an keiner Stelle belegt ist, da\xdf die Bev\xf6lkerung diese Hilfe \xfcberhaupt haben will, das aber nur nebenbei.\r\n\r\nEntweder der SPON Autor hat sich hier semantisch vertan, oder er hat sich als Unterst\xfctzer von Extremisten geouted.')

答案 1 :(得分:0)

你应该从this link而不是你提供的那个抓取,因为它是实际评论的来源,这样它就可以让你在你发布的隐藏你想要的评论的URL上转义javascript。

如果你从这个链接中删除,获取所有评论应该很简单,因为,方便地,这里的每个页面都有相同的“基础”URL(http://www.spiegel.de/forum/politik/belagerte-stadt-syrien-die-islamisten-sind-aleppos-letzte-hoffnung-thread-495132-),然后在页面上添加页码。以1.html2.html等结束。

这意味着在您的代码中,您需要遍历每个页面。这里有一些伪代码可以帮助您入门。

def comment_spider(max_pages): 
    page = 1 #start on page 1

    comments_list = []

    while page <= max_pages:

        url = 'http://www.spiegel.de/forum/politik/belagerte-stadt-syrien-die-islamisten-sind-aleppos-letzte-hoffnung-thread-495132-'+str(page)+'.html'

        req = requests.get(url)
        plain_text = req.text
        soup = BeautifulSoup(plain_text, "lxml")

        for items in soup.findAll('div', {'class': 'comment'}): #you need to get the actual information for this yourself
            comment = items.get_text()
            comments_list.append(comment)

        page += 1
    return comments_list

然后调用此函数,您将获得总页数。 E.g。

comment_spider(13)