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