2019年12月30日月曜日

画面キャプチャー(ドキュメント用)

mkDoc.py

画面をキャプチャーします
キャプチャーされたファイルは、ソース(mkDoc.py)があるフォルダ
ファイル名は、月日_連番.pngです

1230_36.png

使い方
「取りたいウインドウをクリック」が表示されたらOKを押して、
ターゲットウインドウを表示させて、そのウインドウのどこかをクリックしてください。

画面キャプチャーは、シフト+ESCです
ポイント箇所は、シフト+Ctrlです、赤い円が表示されます

赤い円が表示されたら、入力領域がないところで、「i」を押します、
色がかわります。

「k」を押下で形が変わります。

円のサイズは、シフト+マウスのホィールで横方向変わります
縦方向は、ALT+マウスのホィールです。







mkDoc.pyのソース(コピーすれば、動作しますpython2.7)
kao.gifを用意してください(中身は、好きな画像を)

#!/usr/bin/env python
# -*- coding: utf-8 -*-



import tkinter
import pyautogui
import mouse
import keyboard

import threading 
import time,os
import datetime
import ctypes
from ctypes import sizeof
from ctypes.wintypes import RECT

import win32gui
from PIL import ImageGrab
from PIL import Image, ImageTk

TARGET_NAME = 'Python Debugger (NetPdb)'
TARGET_NAME = 'Yahoo! JAPAN'


def worker(title,close_until_seconds): 
    time.sleep(close_until_seconds) 
    wd=ctypes.windll.user32.FindWindowA(0,title) 
    ctypes.windll.user32.SendMessageA(wd,0x0010,0,0) 
    return 

def AutoCloseMessageBoxW(text, title, close_until_seconds): 
    t = threading.Thread(target=worker,args=(title,close_until_seconds)) 
    t.start() 
    ctypes.windll.user32.MessageBoxA(0, text, title, 0) 









handle = None
text = ''


root  = tkinter.Tk()
root.title("2")
root.geometry('300x600+10+10')

root2 = tkinter.Toplevel()
root2.wm_attributes("-topmost", True)
root2.configure(bg='white')
root2.wm_attributes("-transparentcolor", "white")
root2.overrideredirect(True) 

canvas0     =""
fileIMG123  =""


def callback():
    
    global canvas0, fileIMG123
    return True
    
    print("callbac kitayo")
    img = Image.open( '1215_100.png' )
    img2= ImageTk.PhotoImage(img)
    canvas0.itemconfig( fileIMG123, image=img2, anchor=tkinter.NW )

    return True


entry1 = tkinter.Entry(root, text="", validate="all", validatecommand=callback)
entry1.place(x=10,y=10,width=200)

text_widget = tkinter.Text(root)
text_widget.place(x=10,y=400)


def mouse_callback():
    global handle
    global text
    
    handle = win32gui.GetForegroundWindow()
    win32gui.SetForegroundWindow( handle )

    text = win32gui.GetWindowText(handle)
    titlebar = win32gui.GetWindowText( handle )
    #classname = win32gui.GetClassName( handle )



print('撮りたいウィンドウをクリック')
ctypes.windll.user32.MessageBoxA(0, '撮りたいウィンドウをクリック', "", 0) 
mouse.on_click(mouse_callback)



while not text:
    mouse.wait(button='left', target_types=('up',))
print('このウィンドウを撮る: ' + text)
print('違うなら再起動')
#AutoCloseMessageBoxW( '', 'このウィンドウを撮る\n\n' + text, 0 ) 


time.sleep(1)  # この隙に移したいウィンドウを最前面に持ってくる

#ウインドウの完全な情報を取ってくる、FindWindowで部分一致だったりした場合の補完用



win_x1,win_y1,win_x2,win_y2 = win32gui.GetWindowRect(handle)
###apw_x= win_x2 - win_x1
###apw_y= win_y2 - win_y1

rect = ( win_x1 +2, win_y1 -2, win_x2 +0, win_y2 +0 )
print rect
AutoCloseMessageBoxW( 'このウィンドウを撮る\r' + text, '', 1 ) 
text_widget.insert( 'end', u'This window is %s\n' %text )


lw =1000
lh =800

ctrlSW = 0
enX = 100
enY = 50

enShp = 0
sftSW = 0
altSW = 0

enColList   = ["red","yellow","blue" ]
enColIx     = 0
enCol       = enColList[ enColIx ]






"""
"""


canvas0 = tkinter.Canvas(root, width=300, height=200, bg="green")
canvas0.place(x=5, y=30)
sf=0.5
canvas0.scale("all", 0, 0, sf, sf)
#canvas0.scale("all",0,0,2,2)
canvas = tkinter.Canvas(root2, width=lw, height=lh, bg="white")
canvas.place(x=-2, y=-2)




def dspEn( col ="white" ):
#def dspEn( col ):

        if enShp == 0:
            canvas.create_oval(10, 10, enX, enY,        outline= col,    width="10")
        elif enShp == 1:
            canvas.create_rectangle(10, 10, enX, enY,   outline= col,    width="10")
        elif enShp == 2:
            canvas.create_line(10, 10, enX,             enY, fill= col,    width="10")

def clrEn():
    dspEn()


def getFileNo( kensaku ):

    path = "./"
    files = os.listdir(path)

    #kensaku = '1224_'
    kensaku += '_'
    newlist = ['0']

    for l in files:
        if kensaku in l:
            newlist.append(l.replace( kensaku,"").replace(".png","") )

    print newlist
    print max(newlist)

    return 1 + int( max(newlist) )


def print_screen():

        global sftSW, enCol, enColIx, enShp, ctrlSW, altSW
        global canvas0
        
        ymd = datetime.datetime.now().strftime('%m%d')
        no = getFileNo( ymd )
        fname = "%s_%02d.png" %( ymd, no )

        print( "print screen", fname )
        clrEn()
        ctrlSW = 0
        
        ImageGrab.grab(bbox=rect).save( fname )
        AutoCloseMessageBoxW( '%s\rScreenCap OK' %fname, 'print screen',  1 ) 

# 「描く」ボタン
def draw(event):
    """ Click Event
    """
    print("draw")
    global imgData,canvas0  # <- グローバル参照を利用する
    img = Image.open( '1215_100.png' )
    imgData= ImageTk.PhotoImage(img )
    canvas0.scale("all", 0, 0, 0.5, 0.5)
    
    event.widget.itemconfig("fileIMG", image=imgData, anchor=tkinter.NW)

def print_screen2():

        global sftSW, enCol, enColIx, enShp, ctrlSW, altSW
        global canvas0,fileIMG123,root,imgData99


        ymd = datetime.datetime.now().strftime('%m%d')
        no = getFileNo( ymd )
        fname = "%s_%02d.png" %( ymd, no )
        text_widget.insert( 'end', '%s\rScreenCap OK\n' %fname )
        entry1.insert("end", '%s\rScreenCap OK\n' %fname)
        print( "print screen", fname )
                
        
        img = ImageGrab.grab(bbox=rect)
        img.save( fname )
        
        img = Image.open( fname )
        img = img.resize((600, 400))

        imgData99 = ImageTk.PhotoImage(img)
        canvas0.itemconfig( "fileIMG", image=imgData99, anchor=tkinter.NW )
        #canvas0.create_text(70, 30, text="old text")
        #canvas0.delete( fileIMG123 )
        #canvas0.create_image(40, 40, image=img)
        
        #clrEn()
        ctrlSW = 0

        return


def keyCallback( event ):

    global sftSW, enCol, enColIx, enShp, ctrlSW, altSW
    
    print( event.name, event.event_type )


    if event.name == "print screen" and event.event_type == "up":
        print_screen()


    if event.name == "shift":
        if event.event_type == "down":  sftSW = 1
        else:                           sftSW = 0

    if event.name == "alt":
        if event.event_type == "down":  altSW = 1
        else:                           altSW = 0
    #print( "altSW=", altSW )

    
    if sftSW == 1 and event.name == "ctrl" and event.event_type == "up":
        print( "ctrlSW-dayo" )
        if ctrlSW == 1:
            ctrlSW = 0
            clrEn()
        else:
            ctrlSW = 1
            dspEn( enCol )


    if ctrlSW == 0:
        return
        
    if event.name == "i" and event.event_type == "up":
        #print( "enCol-dayo" )
        if enColIx == len( enColList )-1:
            enColIx = 0
        else:
            enColIx += 1
            
            
        enCol  = enColList[ enColIx ]
        clrEn()
        dspEn( enCol )


    # Change Shape
    
    if event.name == "k" and event.event_type == "up":

        clrEn()

        if enShp == 2:
            enShp = 0
        else:
            enShp += 1

        dspEn( enCol )




def mouseCallback( event ):
    global enX,enY
    
    """
    if type( event ) == mouse.ButtonEvent:
        dspEn( enCol )
        print_screen()
"""

    if ctrlSW == 0:
        return

    print('mouseCallback-Event:', event, type(event))
    if ( sftSW == 1 or altSW == 1) and type( event ) == mouse.WheelEvent:
        #print("aaaaaaaa",event.time, event.delta)
        #円を描く

        dspEn()

        if sftSW == 1 :     enX += 25* event.delta
        if altSW == 1 :     enY += 25* event.delta

        if ctrlSW == 1:
            dspEn( enCol )



def left_mouse(event,e):
    print('Position:', mouse.get_position())
    print('Event:', event)




def timer():
    px,py = pyautogui.position() 
    #print( '{},{}'.format(px,py) )
    px -= (enX // 2)+5
    py -= (enY // 2)+5
    root2.geometry(str(lw)+"x"+str(lh)+"+"+str(px)+"+"+str(py) ) 
    root2.after(10, timer)







canvas.create_oval(10, 10, enX, enY, outline="white", width="10")
if sftSW == 1:
    canvas.create_oval(10, 10, enX, enY, outline= enCol, width="10")


shortcut = "shift+esc"
keyboard.add_hotkey(shortcut, print_screen2, suppress=True)

timer()
#mouse.on_click(left_mouse, args=('mouse_left', 'mouse_up'))

mouse.hook( mouseCallback )
keyboard.hook( keyCallback )

#dspEn("red")

img = Image.open( 'kao.gif' )
img = img.resize((600, 400))

imgData = ImageTk.PhotoImage(img)
fileIMG123 = canvas0.create_image(0, 0, image=imgData, anchor=tkinter.NW, tag="fileIMG")

canvas0.bind('<1>', draw)

root.mainloop()

2019年12月22日日曜日

昨日は、ずーっと

パイソンでグーグル検索をしたかったので、ググってたが

駄目だった、お話。

グーグルの検索をすると、以下のようなURLが生成されて検索を行なうんだけど、それをパイソンからやりたい

https://www.google.com/search?sxsrf=ACYBGNS-CNUdGsRy00ztrhjYGMrzgWx_fw%3A1576904614957&source=hp&ei=pqf9XfCWOMuQr7wP5oWF8Ag&q=%E6%97%A5%E6%9C%AC%E4%BB%A3%E8%A1%A8%E3%80%80%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&oq=%E6%97%A5%E6%9C%AC%E4%BB%A3%E8%A1%A8%E3%80%80%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&gs_l=psy-ab.3..0i4i70i253j0i4j0i30l6.4111.15509..16120...6.0..0.168.2794.17j11......0....1..gws-wiz.....10..35i362i39j35i39i19j35i39j0i131i4j35i305i39j0i4i37j0i131j0i131i4i37j0j0i4i37i70i253j0i4i30j0i8i4i30j0i13j0i13i30j0i5i4i30.SHMKKOxm5HQ&ved=0ahUKEwjwgau7-8XmAhVLyIsBHeZCAY4Q4dUDCAg&uact=5


結論!
ウインドウズのクライアントからは問題なし

vps(間借りのサーバー...)はダメ、ブラックリストの登録されているみたいです。
(期間はあるのかは、わかりませんが)


ソースコード
# -*- coding: utf-8 -*-
from google import search
def google_search(query, limit=3):
for url in search(query, lang="jp", num=3):
print url
def main():
google_search("kennsaku naiyou")
if __name__ == '__main__':
main()

上はダメで、最終的にはこちら

from googlesearch import search
for url in search('"python"simple-and-useful.net', stop=20):
print(url)


VPSでのエラーメッセージ
Traceback (most recent call last):
  File "/var/www/html/netpdb/pdbexe.py", line 194, in main
    pdb._runscript(mainpyfile)
  File "/usr/lib/python3.6/pdb.py", line 1548, in _runscript
    self.run(statement)
  File "/usr/lib/python3.6/bdb.py", line 431, in run
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "/var/www/html/netpdb/146/あああ", line 2, in <module>
    from googlesearch import search
  File "/usr/local/lib/python3.6/dist-packages/googlesearch/__init__.py", line 312, in search
    html = get_page(url, user_agent)
  File "/usr/local/lib/python3.6/dist-packages/googlesearch/__init__.py", line 176, in get_page
    response = urlopen(request)
  File "/usr/lib/python3.6/urllib/request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.6/urllib/request.py", line 532, in open
    response = meth(req, response)
File "/usr/lib/python3.6/urllib/request.py", line 642, in http_response    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.6/urllib/request.py", line 564, in error
    result = self._call_chain(*args)
  File "/usr/lib/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.6/urllib/request.py", line 756, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/usr/lib/python3.6/urllib/request.py", line 532, in open
    response = meth(req, response)
  File "/usr/lib/python3.6/urllib/request.py", line 642, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.6/urllib/request.py", line 570, in error
    return self._call_chain(*args)
  File "/usr/lib/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.6/urllib/request.py", line 650, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 429: Too Many Requests



悩んでいる人がいますが、適切な回答がまだありません
https://stackoverflow.com/questions/59084382/error-when-using-googlesearch-python-library-http-error-429-too-many-requests

I am trying to run this code:

try: 
    from googlesearch import search
except ImportError:
    print("No module named 'google' found") 

# to search
query = "Geeksforgeeks"

for j in search(query, tld="co.in", num=10, stop=1, pause=2):
    print(j)
On Ubuntu 16.04, Python version 3.5.2

and here is what I get:

Traceback (most recent call last):
  File "test.py", line 9, in <module>
    for j in search(query, tld="co.in", num=10, stop=1, pause=2):
  File "/usr/local/lib/python3.5/dist-packages/googlesearch/__init__.py", line 288, in search
    html = get_page(url, user_agent)
  File "/usr/local/lib/python3.5/dist-packages/googlesearch/__init__.py", line 154, in get_page
    response = urlopen(request)
  File "/usr/lib/python3.5/urllib/request.py", line 163, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.5/urllib/request.py", line 472, in open
    response = meth(req, response)
  File "/usr/lib/python3.5/urllib/request.py", line 582, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.5/urllib/request.py", line 504, in error
    result = self._call_chain(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 444, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 696, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "/usr/lib/python3.5/urllib/request.py", line 472, in open
    response = meth(req, response)
  File "/usr/lib/python3.5/urllib/request.py", line 582, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.5/urllib/request.py", line 510, in error
    return self._call_chain(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 444, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 590, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 429: Too Many Requests
The exact same code runs perfectly well on my Windows 10 machine, Python version 3.5.4

What could be the issue on my Ubuntu machine?

python python-3.x ubuntu-16.04 http-status-code-429
shareimprove this question
asked Nov 28 at 8:17

Vincent Roye
2,00577 gold badges2525 silver badges4444 bronze badges
Possible duplicate of How to avoid HTTP error 429 (Too Many Requests) python – furkanayd Nov 28 at 8:22
How can the exact same code run well on my Windows 10 machine and not on my Ubuntu 16.04 machine? – Vincent Roye Nov 28 at 8:24
Could it be because my Ubuntu VPS tries to access Google's server directly from a public address whereas my Windows machine is within a local network? – Vincent Roye Nov 28 at 8:35
Possibly, you are not using enough wait between your requests. python File "/usr/lib/python3.5/urllib/request.py", line 696, in http_error_302 return self.parent.open(new, timeout=req.timeout) in these lines search function shows that timeout for 302 error executed. Check this out : developer.mozilla.org/en-US/docs/Web/HTTP/Status/302 – furkanayd Nov 28 at 8:49 
Does this answer your question? Why does this program throw errors? – SitiSchu Nov 28 at 9:32
add a comment



私はこのコードを実行しようとしています:

試してください:
    googlesearchからインポート検索
ImportErrorを除く:
    print( "'google'という名前のモジュールが見つかりません")

# 検索する
クエリ= "Geeksforgeeks"

検索のj(クエリ、tld = "co.in"、num = 10、stop = 1、pause = 2):
    print(j)
Ubuntu 16.04では、Pythonバージョン3.5.2

ここに私が得るものがあります:

トレースバック(最後の最後の呼び出し):
  ファイル「test.py」、9行目、<module>
    検索のj(クエリ、tld = "co.in"、num = 10、stop = 1、pause = 2):
  ファイル「/usr/local/lib/python3.5/dist-packages/googlesearch/__init__.py」、288行目を検索
    html = get_page(url、user_agent)
  get_pageのファイル「/usr/local/lib/python3.5/dist-packages/googlesearch/__init__.py」の154行目
    応答= urlopen(request)
  ファイル「/usr/lib/python3.5/urllib/request.py」、163行目、urlopen
    opener.open(url、data、timeout)を返します
  ファイル「/usr/lib/python3.5/urllib/request.py」、行472、オープン
    応答= meth(req、response)
  http_responseのファイル「/usr/lib/python3.5/urllib/request.py」、行582
    「http」、リクエスト、レスポンス、コード、メッセージ、hdrs)
  ファイル「/usr/lib/python3.5/urllib/request.py」、504行目、エラー
    結果= self._call_chain(* args)
  _call_chainのファイル「/usr/lib/python3.5/urllib/request.py」、行444
    結果= func(* args)
  ファイル「/usr/lib/python3.5/urllib/request.py」、行696、http_error_302
    self.parent.open(new、timeout = req.timeout)を返します
  ファイル「/usr/lib/python3.5/urllib/request.py」、行472、オープン
    応答= meth(req、response)
  http_responseのファイル「/usr/lib/python3.5/urllib/request.py」、行582
    「http」、リクエスト、レスポンス、コード、メッセージ、hdrs)
  ファイル「/usr/lib/python3.5/urllib/request.py」、510行目、エラー
    self._call_chain(* args)を返します
  _call_chainのファイル「/usr/lib/python3.5/urllib/request.py」、行444
    結果= func(* args)
  ファイル「/usr/lib/python3.5/urllib/request.py」、590行目、http_error_default
    HTTPErrorを発生させます(req.full_url、code、msg、hdrs、fp)
urllib.error.HTTPError:HTTPエラー429:リクエストが多すぎます


私のWindows 10マシン、Pythonバージョン3.5.4でまったく同じコードが完全に実行されます

Ubuntuマシンで何が問題になるのでしょうか?

python python-3.x ubuntu-16.04 http-status-code-429
この質問を共有する
11月28日8時17分に尋ねた

ヴィンセント・ロイ
2,00577ゴールドバッジ2525シルバーバッジ4444ブロンズバッジ
HTTPエラー429(Too Many Requests)python-furkanayd Nov 28 at 8:22を回避する方法の重複
Ubuntu 16.04マシンではなく、Windows 10マシンでまったく同じコードを実行するにはどうすればよいですか? –ビンセントロイ11月28日8:24
私のUbuntu VPSがパブリックアドレスからGoogleのサーバーに直接アクセスしようとするのに対し、私のWindowsマシンはローカルネットワーク内にあるためでしょうか? –ビンセントロイ11月28日8時35分
リクエストの間に十分な待機時間を使用していない可能性があります。 pythonファイル「/usr/lib/python3.5/urllib/request.py」、http_error_302の696行目、これらの行の検索関数でself.parent.open(new、timeout = req.timeout)を返すと、302エラーのタイムアウトが示されます。実行されました。これをチェックしてください:developer.mozilla.org/en-US/docs/Web/HTTP/Status/302 – furkanayd Nov 28 at 8:49
これはあなたの質問に答えますか?このプログラムがエラーをスローするのはなぜですか? – SitiSchu 11月28日9:32
コメントを追加



グーグルはいろいろなサービスをパイソンのモジュールで提供しています。
使用してはもらいたいが、制約を付けないと自分のサーバーが大変です。

VPSなどからのアクセスは、頻繁に使用される可能性が高いので制約対象になると思われます。
(あくまでの自分の考え)
vpsが制限を掛けているのかもしれません、こちらも可能性はあります
※「ここからは、いろいろ検討した結果なので、文書散漫!」を参照


ググってみると翻訳、スカラーなど制約で悩んでいる人がいます。
翻訳などは制約する回数などが明記されていましたが...

また、
 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'})の
ユーザーエージェントが無いIPアドレスからのアクセスは、除外されているかもしれません!
以前、ユーチューブでダウンロードのプログラム作成時に、同様な問題が発生した。
こちらは、vpsとは関係がなくあくまでもユーチューブからアクセスが拒否されていた。
どうしてダメかと思ったとき、普通のブラウザとパイソンの違いから、ユーザーエージェントの設定
だと気が付いた!
以下の参考ソースには、指定がちゃんとある!
class Google:
    def __init__(self):
        self.GOOGLE_SEARCH_URL = 'https://www.google.co.jp/search'
        self.session = requests.session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'})

つまり、以下のモジュール(googlesearch)には、無いか、何か問題がある可能性がある、
ソースを見てみるのもいいのかもしれませんね!

from googlesearch import search
for url in search('"python"simple-and-useful.net', stop=20):
print(url)




あれやこれやで、
自分でクローリングするのが一番かな、人には頼らない



https://qiita.com/derodero24/items/949ac666b18d567e9b61

参考にさせて頂きましたソースです。
vps上で動作は問題が発生しません!
(ただし、BeautifulSoupのインストールなどlxmlのバージョンでうまくいかなかった
        soup = BeautifulSoup(html, 'lxml')

まぁ、それは何とでもなりそうな気がします。

import json
from urllib import parse
import requests
from bs4 import BeautifulSoup


class Google:
    def __init__(self):
        self.GOOGLE_SEARCH_URL = 'https://www.google.co.jp/search'
        self.session = requests.session()
        self.session.headers.update({
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0'})

    def Search(self, keyword, type='text', maximum=100):
        '''Google検索'''
        print('Google', type.capitalize(), 'Search :', keyword)
        result, total = [], 0
        query = self.query_gen(keyword, type)
        while True:
            # 検索
            html = self.session.get(next(query)).text
            links = self.get_links(html, type)

            # 検索結果の追加
            if not len(links):
                print('-> No more links')
                break
            elif len(links) > maximum - total:
                result += links[:maximum - total]
                break
            else:
                result += links
                total += len(links)

        print('-> Finally got', str(len(result)), 'links')
        return result

    def query_gen(self, keyword, type):
        '''検索クエリジェネレータ'''
        page = 0
        while True:
            if type == 'text':
                params = parse.urlencode({
                    'q': keyword,
                    'num': '100',
                    'filter': '0',
                    'start': str(page * 100)})
            elif type == 'image':
                params = parse.urlencode({
                    'q': keyword,
                    'tbm': 'isch',
                    'filter': '0',
                    'ijn': str(page)})

            yield self.GOOGLE_SEARCH_URL + '?' + params
            page += 1

    def get_links(self, html, type):
        '''リンク取得'''
        soup = BeautifulSoup(html, 'lxml')
        if type == 'text':
            elements = soup.select('.rc > .r > a')
            links = [e['href'] for e in elements]
        elif type == 'image':
            elements = soup.select('.rg_meta.notranslate')
            jsons = [json.loads(e.get_text()) for e in elements]
            links = [js['ou'] for js in jsons]
        return links


google = Google()
# テキスト検索
result = google.Search('ドラえもん', type='text', maximum=200)














ここからは、いろいろ検討した結果なので、文書散漫!

日商エレクトロニクス株式会社
https://newrelic.nissho-ele.co.jp/solution

ここでは、vpsを提供していると思われますが、この問題についてのページがあります。
https://newrelic.nissho-ele.co.jp/support/docs/apis/rest-api-v2/requirements/api-overload-protection-handling-429-errors

APIの過負荷防止:429エラーの処理

New Relicは、REST API呼び出しに素早く応答するために、他の顧客が時間のかかるクエリを実行している場合であっても、APIに過負荷防止を含めます。
大量のリソースを消費するような大量のデータのクエリを実行している場合は、APIの応答コードとヘッダーがアカウントで利用可能な容量を超えたことを示します。これはほとんどの顧客が見ることのない珍しい状態で、APIの使用にリソースを集中的に使用するカスタマーのみが体験します。

APIは通常の操作では過負荷保護状態を応答に追加しません。ユーザーはアクションを起こす必要がありません。
レポート期間の期間にわたり、New RelicはひとつひとつのAPI要求がシステムにおよぼす影響を追跡します。API呼び出しがレポート期間において過負荷防止システムのしきい値を超える場合には、以下の事象が発生します。 

API呼び出しを続行すると、HTTPエラーコード429(Too Many Requestsエラー)により処理を失敗します。
HTTPのヘッダーと本文には該当するエラーに関する詳細が含まれます
レポート期間の終了時に再度API呼び出しをすることが可能になります
ヘッダー


上限を超えた後でAPI応答に表示されるHTTPヘッダーは以下のとおりです。



過負荷のヘッダー

意味


NewRelic-OverloadProtection-Reset

現在のレポート期間終了時のUNIXタイムスタンプ(1970年1月1日以降の秒数)。


NewRelic-OverloadProtection-Docs

追加情報をすぐに取得できるこのドキュメントへのハイパーリンク。

2019年12月21日土曜日

ふと、考えた

本日は、天気は曇りでどんよりしている

自分は、以下のページをやっているが
今後は、転居させる事にした。

net.programming.jp

simple-and-useful.net

削除も考えたが、整理も含めて転居することにした

2019年12月15日日曜日

tkinter canvas で悩んだ!

tkinter を使って、キャンバスにイメージが書けなかったこと。

ルートにある場合はうまくいった。。。。。。変数は、すべてグローバルだからね!
(関数でない場合)

img = Image.open( '1215_96.png' )
img = ImageTk.PhotoImage(img)

canvas = tkinter.Canvas(root, bg = "black", width=400, height=300)
canvas.create_image(30, 30, image=img, anchor=tkinter.NW)

説明だけど
1.ファイルからイメージを読み込む
2.イメージの変換(IPL)からtkinterで使えるのにするみたい
3.キャンバスを作成
4.イメージを位置指定してソースを指定

ここで問題が発生した!
関数にして違う画像を表示しようとしたが、できなかった!

いろいろぐぐると、こんな感じだと思ったが違っていた。(もちろんテキストだが)
因みにテキストは、関数内でできる!
text = canvas.create_text(200, 200, text="old text")
canvas.delete(text)
text = canvas.create_text(200, 200, text="old text")こちらは、別の方法、
text = canvas.create_text(200, 200, text="old text")
canvas.itemconfig(text, text="new text")




原因は、黄色の部分のimageを指定いるものが、グローバル変数でないと駄目という事みたいだ。
canvas.create_image(30, 30, image=img, anchor=tkinter.NW)

結論、
イメージの変数指定の場合、グローバル変数にする事!
(キャンバスの画像は消えるが、画像は表示されないぞ~)

データ量が多いので、グローバルにしかできないと思っておこう