[PYTHON] Kratzen von Nachrichten über Vorfälle auf der Wohnfläche

Ich interessiere mich für die Vorfälle auf der Welt, deshalb habe ich beschlossen, die Nachrichten über Vorfälle und Unfälle zu streichen, die täglich in den Livedoor News aktualisiert werden. Es ist ein Memo für mich über den Fluss. [livingoor NEWS Inländische Vorfälle / Unfälle](https://news.livedoor.com/%E5%9B%BD%E5%86%85%E3%81%AE%E4%BA%8B%E4%BB%B6 % E3% 83% BB% E4% BA% 8B% E6% 95% 85 / Themen / Schlüsselwort / 31673 /)

1. Wissen, was Schaben ist

Web Scraping mit Python ← Überprüfen Sie vorerst die Grundbewegungen auf dieser Seite.

2. Probieren Sie es auf der Livedoor NEWS-Website aus

Die obige Seite experimentierte mit der Schlagrate von Yahoo für professionelle Baseballspieler. Als ich versuchte, sie auf der NEWS-Seite von Livedoor zu reproduzieren, trat ein Problem auf. .. Ich habe versucht, wie auf der obigen Website darauf zuzugreifen und Informationen abzurufen, aber der Zugriff ist nicht gestattet.

403 Forbidden
Forbidden
You don't have permission to access /Inländische Vorfälle / Unfälle/topics/keyword/31673/
on this server.

Lesen Sie die folgende Seite und lösen Sie sie. [Python] 403 Verboten: Was tun, wenn Sie auf diesem Server keine Zugriffsberechtigung haben? Obwohl dies von der Site abhängt, scheint es, dass auf Livesoor NEWS nur zugegriffen werden kann, wenn der Benutzeragent zum Zeitpunkt der Anforderung im Header beschrieben ist. Fest.

3. Ich möchte zum News-Link springen

Sie haben erfolgreich auf die Livedoor NEWS-Site zugegriffen und die Informationen in eine Datei geschrieben. Das nächste, was ich tun möchte, ist dem Link von der Newslistenseite zu folgen, um zu jeder Newspage zu springen. Ein Nachrichtenblock auf der Seite mit der Nachrichtenliste lautet wie folgt, und der href-Wert des Tags a ist ein Link. Wie kann ich das bekommen?

<li class="hasImg">
  <a href="https://news.livedoor.com/topics/detail/18794424/">
    <p class="articleListImg"><img src="https://sl.news.livedoor.com/a8affe16ad083d6f44918377f5748e09849ffbc0/small_light(p=S80)/https://image.news.livedoor.com/newsimage/stf/3/f/3f701_1675_218e1f3c1a51c13c80249b4bd8af0afe-m.jpg " onMouseDown="return false;" onSelectStart="return false;" oncontextmenu="return false;" galleryimg="no"></p>
    <div class="articleListBody">
      <h3 class="articleListTtl">Drei Personen wegen des Verdachts des Diebstahls von Nachhaltigkeitsleistungen verhaftet. Werden insgesamt 400 Millionen Yen illegal erhalten?</h3>
      <p class="articleListSummary">Darüber hinaus stehen rund 400 Freeter und Studenten im Verdacht, an betrügerischen Anträgen beteiligt zu sein.</p>
      <time datetime="2020-08-26 16:57:08" class="articleListDate">16:57</time>
    </div>
  </a>
</li>

Informationen zur Lösung des Problems finden Sie auf der folgenden Website. [Python] Erhalten Sie einen href-Wert mit Beautiful Soup

#Zuerst
link = soup.find('a')
#von
link.get('href')
#Holen Sie sich den Link bei!

Es war überraschend einfach.

4. Fertigstellung

Das Folgende ist das abgeschlossene Programm. Es ist eine Ebene, die so verwendet werden kann, wie sie ist. Da es sich bei den Listenseiten jedoch um die 2. und 3. Seite handelt, möchte ich sie verbessern, damit ich die Nachrichten der letzten 2 Tage erhalten kann. Außerdem dauert es einige Minuten, um alle Artikel abzurufen. Es wäre also besser, wenn wir sie verbessern könnten, damit sie früher abgerufen werden können.

import requests
import time
from bs4 import BeautifulSoup

def Get_soup( url ):
    headers = {
        "User-Agent" : "Mozilla/... Chrome/... Safari/..."
    }

    response = requests.get(url , headers = headers)

    response.encoding = response.apparent_encoding

    return BeautifulSoup(response.text, "html.parser")

def Get_article( url , f ):
    soup = Get_soup( url )

    title = soup.find( 'h1' , class_ = "articleTtl" )

    f.write( title.text )

    body = soup.find( 'div' , class_ = "articleBody" )
    
    f.write( body.text )

    f.write('@@@@@\n')

    time.sleep(1)


def go_through( url , f  ):
    soup = Get_soup( url )

    footer = soup.find( 'div' , class_ = "articleFooter" )
    
    link = footer.find('a')

    url_ = link.get('href')

    Get_article(url_ , f )


def main():
    url = "https://news.livedoor.com/%E5%9B%BD%E5%86%85%E3%81%AE%E4%BA%8B%E4%BB%B6%E3%83%BB%E4%BA%8B%E6%95%85/topics/keyword/31673/"

    soup = Get_soup( url )

    topic_date_ = soup.find( 'h2' , class_ = "keywordDate" )
    topic_date_ = topic_date_.text
    title = 'CaseNews_' +  topic_date_ + '.txt'
    f = open( title , 'w' )

    articles_ = soup.find( 'ul' , class_ = "articleList" )

    articles = articles_.find_all( 'li' )

    art_len = len(articles)
    dl_count = 1
    for art_i in articles:
        link_i_ = art_i.find('a')
        url_i_ = link_i_.get('href')
        go_through(url_i_ , f )

        print( dl_count , end = '/' )
        print( art_len , end = ' ' )
        print('downloaded.' , end = '\n' )
        dl_count += 1
        # go_through:Funktion zum Überwinden der verlinkten Site vor diesem Artikel

    f.close()

main()

Recommended Posts

Kratzen von Nachrichten über Vorfälle auf der Wohnfläche
Grundlagen der Python-Scraping-Grundlagen
Web-Scraping-Informationen zu Lachprogrammen und Benachrichtigungen über LINE
Scraping das Ergebnis von "Schedule-Kun"
Implementierung von MathJax auf Sphinx
Umgang mit Python auf Mac