Fuwafuwa's memorandum

Fuwafuwa's memorandum

Data analysis, development, reading, daily feeling.
MENU

Python: webページ上のリンク先htmlをダウンロード

webページ上のリンク先htmlをダウンロードする。
クローリングの際の時間はどの程度が常識なのかいまいちわからなかったので
人間がやる時くらいの時間幅をもたせました。

from bs4 import BeautifulSoup
from urllib.request import *
from urllib.parse import * 
import os.path, time, re


def download_file(url,savepath):
    savepath = savepath
    try:
        print("download=",url)
        urlretrieve(url,savepath)
        time.sleep(10)
        print("ダウンロード成功")
        return savepath
    except:
        print("ダウンロード失敗",url)
        return None

base = "http://www.xxxxx.com/" ##リンク先は短縮されている場合もあるためbaseとなるhtmlを用意する

url = "xxxxx.webarchive"
res = urlopen(url)
soup = BeautifulSoup(res, "html.parser")

lists = soup.find_all("a")

for list in lists:
    href = list.attrs['href']
    text = list.string
    url = urljoin(base,href)
    download_file(url,savepath+text+'.html')
参考
Pythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみようPythonによるスクレイピング&機械学習 開発テクニック BeautifulSoup,scikit-learn,TensorFlowを使ってみよう
クジラ飛行机

ソシム 2016-12-06
売り上げランキング : 11855

Amazonで詳しく見る
by G-Tools

Python: webからダウンロードする

htmlでもpngでも可。

import urllib.request

url = "http://xxxxx.com"
savename = "web-page.html"

mem = urllib.request.urlopen(url).read()

with open(savename,mode="wb") as f:
    f.write(mem)
    print("saved")

Python: PyQt5 designerでGUIを作成

いつの間にかPyQtがすごくリッチになっていたのでメモです。
分析屋さんは分析ツールを作って人に共有する時に
すごく便利なのではないかなあと思います。

最新バージョンのPyQt5はネット上に
まとまった情報があまりないように見受けられたのでメモ。

Python: PyQtの開発環境を整備

Python: PyQtで電卓を作成する

下記では、Qt Designerを使って、上記の電卓を作成します。

Qt Designerの画面は下記のような感じ。 PyQt_designer.png
アプリ作成の統合開発環境を触っている人なら見たまんまで使えると思います。
ファイルからformを新規作成し、ウィジェットボックスからドラッグ&ドロップでウィジェットを配置してください。
プロパティエディタから調整できます。

今回は、inputLineに計算式を入力し
Caluculateボタンを押下するとoutputLineに計算結果が表示されるようにします。


ここではひとまず cal_ui.ui として保存します。
下記のuiファイルが作成されます。



 Form
 
  
   
    0
    0
    236
    113
   
  
  
   Form
  
  
   
    
     60
     10
     161
     21
    
   
  
  
   
    
     60
     40
     161
     31
    
   
   
    Caluculation
   
  
  
   
    
     10
     80
     91
     21
    
   
   
    output
   
  
  
   
    
     60
     80
     161
     21
    
   
  
  
   
    
     10
     10
     91
     21
    
   
   
    input
   
  
 
 
 


このuiをpyファイルにコンバートします。
コマンドプロンプトで下記を入力してください。
ここではpyファイルをcal_ui.pyとします。
pyuic5 -x cal_ui.ui -o cal_ui.py
上記を実行しますと、cal_ui.pyファイルが作成されます。
ここでの中身は下記のような感じです。
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(236, 113)
        self.inputLine = QtWidgets.QLineEdit(Form)
        self.inputLine.setGeometry(QtCore.QRect(60, 10, 161, 21))
        self.inputLine.setObjectName("inputLine")
        self.calcButton = QtWidgets.QPushButton(Form)
        self.calcButton.setGeometry(QtCore.QRect(60, 40, 161, 31))
        self.calcButton.setObjectName("calcButton")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(10, 80, 91, 21))
        self.label_2.setObjectName("label_2")
        self.outputLine = QtWidgets.QLineEdit(Form)
        self.outputLine.setGeometry(QtCore.QRect(60, 80, 161, 21))
        self.outputLine.setObjectName("outputLine")
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(10, 10, 91, 21))
        self.label_3.setObjectName("label_3")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.calcButton.setText(_translate("Form", "Caluculation"))
        self.label_2.setText(_translate("Form", "output"))
        self.label_3.setText(_translate("Form", "input"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())
実行してみますと、アプリが起動しますが
まだイベントなどを設定していないので、動かないと思います。

最低限の動きをするように下記のコメント部分を書き加えます。
※該当箇所に「## ここ」と記載しました。
from PyQt5 import QtCore, QtGui, QtWidgets

def cal(n): ## ここ
    try:       
        result = eval(n)
    except:
        result = "計算式を入力してください"
    return result

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(236, 113)
        self.inputLine = QtWidgets.QLineEdit(Form)
        self.inputLine.setGeometry(QtCore.QRect(60, 10, 161, 21))
        self.inputLine.setObjectName("inputLine")
        self.calcButton = QtWidgets.QPushButton(Form)
        self.calcButton.setGeometry(QtCore.QRect(60, 40, 161, 31))
        self.calcButton.setObjectName("calcButton")
        self.calcButton.clicked.connect(self.calc) ##ここ
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(10, 80, 91, 21))
        self.label_2.setObjectName("label_2")
        self.outputLine = QtWidgets.QLineEdit(Form)
        self.outputLine.setGeometry(QtCore.QRect(60, 80, 161, 21))
        self.outputLine.setObjectName("outputLine")
        self.outputLine.setReadOnly(True) ##ここ
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(10, 10, 91, 21))
        self.label_3.setObjectName("label_3")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def calc(self): ## ここ
        r = cal(self.inputLine.text())
        self.outputLine.setText(str(r))   
            
    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.calcButton.setText(_translate("Form", "Caluculation"))
        self.label_2.setText(_translate("Form", "output"))
        self.label_3.setText(_translate("Form", "input"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())
アプリを起動すると、今度は期待通りの動きをするようになったと思います。 Cal.png
本当は、uiファイルとイベントをコントロールするファイルは分けて書けるとよいですね。
ひとまず今日はこれで。

Python: PyQtで電卓を作成する

下記のようなツールを作成しました。
PyQt_Cal.png
inputに計算式を入力し
Caluculationボタンを押下するとoutputに計算結果が反映されます。

from PyQt5.QtWidgets import (QApplication, QWidget,
                             QGridLayout, QVBoxLayout, QHBoxLayout,
                             QLabel, QLineEdit, QPushButton)

def cal(n):
    try:       
        result = eval(n)
    except:
        result = "計算式を入力してください"
    return result

class MainWindow(QWidget):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        
        self.inputLine = QLineEdit()
        self.outputLine = QLineEdit()
        self.outputLine.setReadOnly(True)    
        
        self.calcButton = QPushButton("Caluculation")
        self.calcButton.clicked.connect(self.calc)

        lineLayout = QGridLayout()
        lineLayout.addWidget(QLabel("input"), 0, 0)
        lineLayout.addWidget(self.inputLine, 0, 1)
        lineLayout.addWidget(QLabel("output"), 2, 0)
        lineLayout.addWidget(self.outputLine, 2, 1)

        buttonLayout = QVBoxLayout()
        buttonLayout.addWidget(self.calcButton)
        lineLayout.addWidget(self.calcButton, 1, 1)

        mainLayout = QHBoxLayout()
        mainLayout.addLayout(lineLayout)
        mainLayout.addLayout(buttonLayout)

        self.setLayout(mainLayout)
        self.setWindowTitle("Caluculation")
        
    def calc(self):
        r = cal(self.inputLine.text())
        self.outputLine.setText(str(r))        
        
if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    main_window = MainWindow()

    main_window.show()
    sys.exit(app.exec_())

Python: PyQtの開発環境を整備

pip install SIP
pip install PyQt5
PyQt Designer は Anaconda に予め梱包されています。
Anaconda Command Prompt で下記を実行。
cd Library/bin
designer

該当の記事は見つかりませんでした。