[PYTHON] Raclage des nouvelles des incidents sur Livingoor

Je m'intéresse aux incidents qui se produisent dans le monde, j'ai donc décidé de gratter les nouvelles des incidents et accidents qui sont mises à jour quotidiennement sur Livedoor News. C'est un mémo pour moi du flux. [Livingoor NEWS Domestic Incidents / Accidents](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 /)

1. Sachez ce qu'est le grattage

Web scraping avec python ← Vérifiez les mouvements de base sur ce site pour le moment.

2. Essayez-le sur le site Liveoor NEWS

Le site ci-dessus expérimentait le taux de frappe des joueurs de baseball professionnels de Yahoo, donc quand j'ai essayé de le reproduire sur le site de LIVEDOOR NEWS, un problème est survenu. .. J'ai essayé d'accéder et d'obtenir des informations comme sur le site ci-dessus, mais l'accès n'est pas autorisé.

403 Forbidden
Forbidden
You don't have permission to access /Incidents / accidents domestiques/topics/keyword/31673/
on this server.

Lisez le site suivant et résolvez-le. [Python] 403 Forbidden: Que faire lorsque vous n'avez pas la permission d'accéder sur ce serveur Cela dépend du site, mais il semble que liveoor NEWS ne soit accessible que si l'agent utilisateur est décrit dans l'en-tête au moment de la demande. Fixé.

3. Je souhaite accéder au lien des actualités

Vous avez accédé avec succès au site liveoor NEWS et écrit les informations dans un fichier. Ensuite, je veux suivre le lien de la page de liste de nouvelles pour accéder à chaque page de nouvelles. Un bloc d'actualités sur la page de liste d'actualités est le suivant, et la valeur href de la balise a est un lien. Comment puis-je l'obtenir?

<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">Trois personnes arrêtées pour avoir volé des prestations de durabilité. Un total de 400 millions de yens a-t-il été reçu illégalement?</h3>
      <p class="articleListSummary">De plus, environ 400 freeters et étudiants sont soupçonnés d'être impliqués dans des demandes frauduleuses.</p>
      <time datetime="2020-08-26 16:57:08" class="articleListDate">16:57</time>
    </div>
  </a>
</li>

Consultez le site suivant pour résoudre le problème. [Python] Obtenez la valeur href avec Beautiful Soup

#Premier
link = soup.find('a')
#de
link.get('href')
#Obtenez le lien sur!

C'était étonnamment facile.

4. Achèvement

Voici le programme terminé. C'est un niveau qui peut être utilisé tel quel. Cependant, comme les pages de liste sont les 2ème et 3ème pages, je voudrais l'améliorer afin de pouvoir avoir les nouvelles des 2 derniers jours. En outre, cela prend quelques minutes pour récupérer tous les articles, il serait donc préférable que nous puissions l'améliorer afin qu'il puisse être récupéré plus tôt.

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:Fonction pour surmonter le site lié avant cet article

    f.close()

main()

Recommended Posts

Raclage des nouvelles des incidents sur Livingoor
Principes de base du grattage Python
Informations de raclage Web sur les programmes de rire et notification en ligne
Grattage du résultat de "Schedule-kun"
Implémentation de MathJax sur Sphinx
Manipulation de python sur mac