この記事の続き。
単純に画像ファイルを表示するだけでは、変化が無く面白くないので、BeautifulSoupを使ってWebの画像とデータを表示するものを作成してみました。
Web scrapingは、個人利用か検索用に使用するに留めるべき、マナーがありますのでご利用は計画的に。
今回作成したコードは、Raspberryで個人的に閲覧できるようにしたものです。
ご指摘などございましたらコメント下さい。
#!/usr/bin/python
# coding: UTF-8
import pygame
import urllib2
from time import sleep
from bs4 import BeautifulSoup
from PIL import Image
import cStringIO
def getZaifxChart():
# urlからhtmlを読み込み、BeautifulSoupで処理する。
url = "http://zai.diamond.jp/fx?time=1d#charttop"
html = urllib2.urlopen(url).read()
soup = BeautifulSoup(html,"html.parser")
tagDiv = soup.find_all("div",class_="world-chart-main2 clearfix")
listTitle = []
listNumber = []
listUrl = []
listKey = []
# タイトル、URLを抽出する。
for items in tagDiv:
for item in items.find_all("div",class_="money-title2 clearfix"):
for itemTitle in item.find_all("span",class_="chart-title"): # title
listTitle.append(itemTitle.get_text().encode('utf_8'))
for itemNumber in item.find_all("span",class_="chart-number"): # Number
listNumber.append(itemNumber.get_text().split(" ")[0].encode('utf_8'))
for item in items.find_all("img",class_="refresh-element"): # url,key
listUrl.append(item["src"])
listKey.append(item["alt"])
# PIL で画像を処理する(拡大)。
listChartUrl = []
for i in range(0,len(listTitle)):
# タイトル、価格、アドレス、キー
listChartUrl.append([listTitle[i],listNumber[i],listUrl[i],listKey[i]])
return listChartUrl
def main():
#初期設定
dSize = (720,480)
colorBG = (0,0,0)
colorFont = (255,255,255)
# pygame初期設定
pygame.init()
lcd = pygame.display.set_mode(dSize)
lcd.fill(colorBG)
txtfont = pygame.font.Font("font/tihayagothic.ttf",40)
# チャートを表示する
listChartUrl = getZaifxChart() # チャートのURLを取得
for rows in listChartUrl:
# urlから画像を読み込みPILでオープンする
imageFile = cStringIO.StringIO(urllib2.urlopen(rows[2]).read())
img = Image.open(imageFile).convert("RGB")
x,y = img.size # サイズを取得する
imgRe= img.resize((int(x*3.5),int(y*3.5)))
# 画像データをpygameフォーマットに変換
imggm = pygame.image.fromstring(imgRe.tobytes(),imgRe.size,imgRe.mode).convert()
# テキストを書き出す
fonttext = txtfont.render(rows[0].decode('utf-8')+" "+rows[1].decode('utf-8'),False,colorFont,colorBG)
# 画面に画像を描画する
lcd.fill(colorBG)
lcd.blit(imggm,(70,10))
lcd.blit(fonttext,(75,425))
pygame.display.update()
sleep(2)
main()