Ich habe versucht, WebScraping mit Python.

zunaechst

Ich mag Perl als leichte Sprache, aber irgendwie habe ich mich in letzter Zeit für Python interessiert, also Vorerst habe ich versucht, Titel und Text in der Reihenfolge von der Liste der Yahoo! -Nachrichten zu entfernen. http://news.yahoo.co.jp/list/

Umgebung

Python 2.7.11 lxml requests selenium phantomjs * El Capitan kann nicht vom Gebräu eingegeben werden. Referenz: http://qiita.com/labeneko/items/e3b790e06778900f5719

npm install phantom phantomjs -g

Sofort umsetzen

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 Der eingewechselte Otani trifft auch die zweite Base ... Ham Seibu verliert Null und wartet auf das Ergebnis von Soft B. [!] use cached source: http://headlines.yahoo.co.jp/hl?a=20160927-00000132-spnannex-base

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

Weil Nippon Ham, dessen magische Gewinnzahl "1" ist, gegen Seibu mit 0: 3 verloren hat. (Weggelassen ...) [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 Koshiens Naturrasen wird beim Mizuki Nana-Konzert beschädigt. [!] use cached source: http://headlines.yahoo.co.jp/hl?a=20160927-00000361-oric-ent

Die Synchronsprecherin Nana Mizuki hat am 27. ihre offizielle Website aktualisiert. In Bezug auf den Fall, in dem teilweise berichtet wurde, dass der natürliche Rasen des Stadions nach Mizukis Konzert im Hyogo Hanshin Koshien Stadium am 22. beschädigt wurde. (Weggelassen ...) ...

Es ist vollständig. ~~ ** Der Python-Code ist schwer zu sehen, nicht wahr? ** ~~

Zackli Kommentar

Referenzartikel: http://qiita.com/beatinaniwa/items/72b777e23ef2390e13f8 Es ist einfach, die Ziel-URL und den CSS-Selektor in ** webSpider.eachContents ** anzugeben. Fügen Sie die resultierenden Daten in ** eachContents ** ein und verschachteln Sie ...

Der Titel und der Text des letzten (zwei Links von der Listenseite von Yahoo! News) werden erfasst und angezeigt. Ich würde es selbst sagen, aber ich denke, es war überwältigend einfacher, die ** for-Erklärung zu lesen. ** ** **

Wie ich später bemerkte, reicht die in ** summaryContents ** implementierte Selektorspezifikation nicht aus. Da Daten einiger Muster nicht erfasst werden können (Systeme mit eingebetteten Videos usw.), Um alle Daten zu erhalten, müssen Sie einige Selektormuster vorbereiten.

Ich habe auch Cache hinzugefügt und vergeblich abgelaufen, aber dieser Code allein macht nicht viel Sinn. Ich versuche es weiter auszubauen, Daten in mongoDB zu speichern und mit MeCab und wordVec2 zu spielen.

Ende.

Impressionen

8.gif

Recommended Posts

Ich habe versucht, WebScraping mit Python.
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, mit Python zu kratzen
Ich habe fp-Wachstum mit Python versucht
Web Scraping mit Python + JupyterLab
Ich habe gRPC mit Python ausprobiert
Web Scraping Anfänger mit Python
Ich habe versucht, Web-Scraping mit Python und Selen
Scraping mit Python
Scraping mit Python
Ich habe versucht zu kratzen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
WEB-Scraping mit Python (für persönliche Notizen)
Erste Schritte mit Python Web Scraping Practice
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
[Persönlicher Hinweis] Scraping von Webseiten in Python3
Pferderennseite Web Scraping mit Python
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Erste Schritte mit Python Web Scraping Practice
Ich habe versucht, Yahoo Wetter zu kratzen (Python Edition)
Üben des Web-Scrapings mit Python und Selen
Einfaches Web-Scraping mit Python und Ruby
[Für Anfänger] Versuchen Sie Web Scraping mit Python
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Scraping in Python (Vorbereitung)
Versuchen Sie es mit Python.
Scraping mit Python + PhantomJS
Ich habe Python> autopep8 ausprobiert
Schaben mit Selen [Python]
Scraping mit Python + PyQuery
Ich habe Python> Decorator ausprobiert
Scraping von RSS mit Python
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe Web Scraping versucht, um die Texte zu analysieren.
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Ich habe Jacobian und teilweise Differenzierung mit Python versucht
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, Mecab mit Python2.7, Ruby2.3, PHP7 zu verwenden
Ich habe Funktionssynthese und Curry mit Python versucht
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, mit Python Faiss zu laufen, Go, Rust
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, Deep Floor Plan mit Python 3.6.10 auszuführen.
Ich habe versucht, eine E-Mail mit SendGrid + Python zu senden
Web Scraping mit Python (Wettervorhersage)
Web Scraping mit Python (Aktienkurs)
Schaben mit Selen in Python
Schaben mit Selen + Python Teil 1