J'ai essayé webScraping avec python.

en premier

J'aime perl en tant que langage léger, mais d'une manière ou d'une autre, je me suis récemment intéressé à python, alors Pour le moment, j'ai essayé de gratter le titre et le texte dans l'ordre de la liste de Yahoo! News. http://news.yahoo.co.jp/list/

environnement

Python 2.7.11 lxml requests selenium phantomjs * El Capitan ne peut pas être entré à partir de la bière. Référence: http://qiita.com/labeneko/items/e3b790e06778900f5719

npm install phantom phantomjs -g

Mettre en œuvre immédiatement

Zudong

#coding: UTF-8
import json
import lxml.html
import requests
from datetime import datetime
from selenium import webdriver
from time import sleep

#--------------------------------------------------
# WebSpider
class WebSpider:
    def __init__(self, rootUrl):
        self._webDriver = webdriver.PhantomJS()
        self._pageSourceMap = {}
        self._expireTime = (60 * 60) * 1
        self._rootUrl = rootUrl
    
    def __del__(self):
        del self._webDriver
        self._pageSourceMap.clear()
    
    def eachContents(self, url, selector, proc):
        for content in self.getContents(url, selector):
            proc(content)
    
    def getContents(self, url, selector):
        self._releaseCaches()
        if self._hasCachedPage(url) and self._rootUrl != url:
            print "> [!] use cached source: " + url
            return self._pageSourceMap[url][1].cssselect(selector)
        sleep(1)
        self._webDriver.get(url)
        pageSource = lxml.html.fromstring(self._webDriver.page_source)
        self._pageSourceMap[url] = (self._getCurrentUnixTime(), pageSource)
        print "> [i] cached page source: " + url
        return self._pageSourceMap[url][1].cssselect(selector)
    
    def _hasCachedPage(self, url):
        return self._pageSourceMap.has_key(url)
    
    def _releaseCaches(self):
        for key, value in self._pageSourceMap.items():
            isExpire = (self._getCurrentUnixTime() - value[0]) >= long(self._expireTime)
            if isExpire:
                print "> [!!!] pop cached source: " + key
                self._pageSourceMap.pop(key, None)

    def _getCurrentUnixTime(self):
        return long(datetime.now().strftime("%s"))

#--------------------------------------------------
# create instance
rootUrl = "http://news.yahoo.co.jp/list/"
webSpider = WebSpider(rootUrl)

#--------------------------------------------------
# eachProcs
def pickUpContents(content):
    webSpider.eachContents(content.attrib["href"], "#link", summaryContents)

def summaryContents(content):
    webSpider.eachContents(content.attrib["href"], "#ym_newsarticle > div.hd > h1", titleContents)
    webSpider.eachContents(content.attrib["href"], "#ym_newsarticle > div.articleMain > div.paragraph > p", mainTextContents)

def titleContents(content):
    print content.text.encode("utf_8")

def mainTextContents(content):
    print lxml.html.tostring(content, encoding="utf-8", method="text")

#--------------------------------------------------
# run
webSpider.eachContents(rootUrl, "#main > div.mainBox > div.backnumber > div.listArea > ul > li > a", pickUpContents)

del webSpider

[i] cached page source: http://news.yahoo.co.jp/pickup/6215860 [!] use cached source: http://headlines.yahoo.co.jp/hl?a=20160927-00000132-spnannex-base Le remplaçant Otani frappe également la deuxième base ... Ham Seibu perd zéro et attend le résultat de Soft B [!] use cached source: http://headlines.yahoo.co.jp/hl?a=20160927-00000132-spnannex-base

◇ Pa League Nippon Ham 0-3 Seibu (27 septembre 2016 Seibu Prince)

Parce que Nippon Ham, dont le chiffre magique pour gagner est "1", a perdu contre Seibu 0-3. (Omis ...) [i] cached page source: http://news.yahoo.co.jp/pickup/6215858 [i] cached page source: http://headlines.yahoo.co.jp/hl?a=20160927-00000361-oric-ent Le gazon naturel de Koshien est endommagé lors du concert de Mizuki Nana. [!] use cached source: http://headlines.yahoo.co.jp/hl?a=20160927-00000361-oric-ent

L'artiste voix-comédienne Nana Mizuki a mis à jour son site officiel le 27. Concernant le cas où il a été signalé que le gazon naturel du stade a été endommagé après le concert de Mizuki qui s'est tenu au stade Hyogo Hanshin Koshien le 22 (Omis ...) ...

c'est complet. ~~ ** C'est difficile de voir le code python, n'est-ce pas? ** ~~

Commentaire de Zackli

Article de référence: http://qiita.com/beatinaniwa/items/72b777e23ef2390e13f8 C'est simple à faire, spécifiez l'URL cible et le sélecteur CSS dans ** webSpider.eachContents **, Placez les données résultantes dans ** eachContents ** et imbriquez ...

Le titre et le corps du dernier (deux liens de la page de liste de Yahoo! News) sont acquis et affichés. Je le dirais moi-même, mais je pense que c'était extrêmement plus facile à lire dans la déclaration ** for. ** **

Comme je l'ai remarqué plus tard, la spécification du sélecteur implémentée dans ** summaryContents ** n'est pas suffisante. Étant donné que les données de certains modèles ne peuvent pas être acquises (systèmes avec des vidéos intégrées, etc.), Pour obtenir toutes les données, vous devez préparer des modèles de sélecteurs.

J'ai également ajouté du cache et expire en vain, mais ce code à lui seul n'a pas beaucoup de sens. J'essaie de l'étendre davantage, de stocker des données dans mongoDB et de jouer avec MeCab et wordVec2.

fin.

Impressions

8.gif

Recommended Posts

J'ai essayé webScraping avec python.
J'ai essayé de gratter avec Python
J'ai essayé de gratter avec du python
J'ai essayé fp-growth avec python
Web scraping avec python + JupyterLab
J'ai essayé gRPC avec Python
Web scraping débutant avec python
J'ai essayé le web scraping en utilisant python et sélénium
Grattage avec Python
Grattage avec Python
J'ai essayé de gratter
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
Grattage WEB avec Python (pour mémo personnel)
Premiers pas avec Python Web Scraping Practice
J'ai essayé le rendu non réaliste avec Python + opencv
[Note personnelle] Scraping de pages Web en python3
Site de courses de chevaux Web scraping avec Python
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
Premiers pas avec Python Web Scraping Practice
J'ai essayé de gratter la météo Yahoo (édition Python)
Pratiquer le web scraping avec Python et Selenium
Scraping Web facile avec Python et Ruby
[Pour les débutants] Essayez le web scraping avec Python
# J'ai essayé quelque chose comme Vlookup avec Python # 2
Grattage en Python (préparation)
Essayez de gratter avec Python.
Grattage avec Python + PhantomJS
J'ai essayé Python> autopep8
Grattage avec du sélénium [Python]
Scraping avec Python + PyQuery
J'ai essayé Python> décorateur
Scraping RSS avec Python
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé Web Scraping pour analyser les paroles.
J'ai essayé des centaines de millions de SQLite avec python
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé L-Chika avec Razpai 4 (édition Python)
J'ai essayé la différenciation jacobienne et partielle avec python
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé d'utiliser mecab avec python2.7, ruby2.3, php7
J'ai essayé la synthèse de fonctions et le curry avec python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de "binariser" l'image avec Python + OpenCV
J'ai essayé d'exécuter faiss avec python, Go, Rust
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé d'exécuter Deep Floor Plan avec Python 3.6.10.
J'ai essayé d'envoyer un email avec SendGrid + Python
Web scraping avec Python (prévisions météo)
Web scraping avec Python (cours de l'action)
Grattage au sélénium en Python
Grattage avec Selenium + Python Partie 1