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/
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
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? ** ~~
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.
Recommended Posts