帰国子女あるある。
帰国子女だから英語ができると思われている。
住んでいた時期が小学校~中学校ぐらいであれば現地の学校や友達ができたら英語が出来るようになってたかもしれない。
だけど、うちの子供が海外赴任でアメリカにいた年齢は
0歳~2歳
だったからね。
英語は愚か日本語だってまともに話して無かったわww
だけど帰国子女だから英語ができると思われている。
今回、子供が自宅学習により「英検5級」を受験しに会場に行った。
そこで、同じ小学校の知り合いにバッタリ会ってしまった。
保護者「あらー、ねほりさん宅は海外に住んでおられので、英検5級なんて受ける必要ないんじゃないからしら?ホホホ」
今までも何名からの帰国子女に出会ったけど、
外国に行ってたから英語が上手なんじゃなくて
そう言われるのが嫌で陰で一生懸命勉強している
から英語が出来るんだと思うよ。
因みに、私は海外赴任者なのに英語が全然できないけどねーーー。
何しに海外に行ったのさww
また「Yahoo!ニュース」からのWebスクレイピングができなくなった。
色々と調査して実装してブログを書いて……週末を潰したのに
10日
しか利用できなかった。
このサイトの訪問者は20人ぐらいで利益も年間50円ぐらなのに、しょっちゅう修正している。
ウーバーイーツで運搬作業やったほうがよっぽど金になるわ、糞ったれ。
[前回] 動的Ajaxのページを読み出す方法
静的サイトで発行されたトークンを探し出し、URLを生成する事でAjaxのサイトからJSON形式のデータを受け取る。
これが今までの方法だが、動作しなくなった。
ブラウザに見せかけるため、色々なヘッダを追加したけど駄目だった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$header = array( "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4606.61 Safari/537.36", "Accept-language: ja", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7", "Cache-Control: no-cache", "Connection: keep-alive", "Date: ".gmdate("D, j M Y H:i:s e", time()), "Content-Type: application/x-www-form-urlencoded; charset=UTF-8", "Pragma: no-cache", "X-Requested-With:XMLHttpRequest", "Referer: https://www.yahoo.co.jp/", ); //オプション設定 $options = array( 'http' =>array( 'method' => "GET", 'header' => implode("\r\n", $header), ) ); |
トークンは毎回ユニークなものが発行されるが、Javascriptが実行可能なクローラーでないとほしいデータが取れないような仕組みになってるんじゃないかな?
そして、このブログをYahooの関係者が読んでいるじゃない……?
アクセス数は数十人しかいないけどさwww
ローカルPCでWebスクレイピングを行いファイル転送する
契約しているさくらインターネットのレンタルサーバではChromeのインストールやGUI操作は不可能だ。
そのため、ローカルPCでSeleniumを使ってWebスクレイピングを行い、取得したデータをレンタルサーバーにSFTPでアップロードしてみる。
これは最終手段。
この方法は使いたくなかった。
何のためにサーバー契約しているのさ……。
Selenium使ってWebスクレイピング
Seleniumを使ったWebスクレイピングはググると大量に出てくる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup def getLastCommentbyChrome(driver, url): # ページにアクセス driver.get(url) html = driver.page_source.encode('utf-8') title = "" class_elems2 = "" class_elems3 = "" try: class_elems3 = driver.find_element_by_xpath('//*[@id="contentsWrap"]/div[3]/ul/li[1]/article[2]/div/div/div[2]/p') except: print('Warning3') try: class_elems2 = driver.find_element_by_xpath('//*[@id="contentsWrap"]/div[3]/ul/li[1]/article[3]/div/div/div[2]/p') except: print('Error2') return title + class_elems3.text return title + class_elems2.text return title + class_elems3.text def getLastComment(url): options = webdriver.ChromeOptions() options.add_argument('--headless') options.add_argument('--log-level=3') options.add_argument('--no-sandbox') # Bypass OS security model driver = webdriver.Chrome('./chromedriver.exe', options=options) comment = getLastCommentbyChrome(driver, url) with open("index.html", mode='w', encoding='utf-8') as f: f.write(comment) driver.close() driver.quit() |
特に難しくはない。
ただ、昔はPHPで実装していたのでHTML生成部分もPythonで書き換えることになってしまった。
結果、当時400行程度で書いたPHPのソースコードはPythonで250行程度で書き直すことができた。
Pythonは優れているね。
幾つかの記載方法でPHPからの移植で困ってググる必要があったので載せておく。
python多次元リストをsort(並べ替え)する方法
これはLambda式を使えば簡単に記載することができる。
1 2 3 4 5 |
src = [[1, 2, 3], [4, 5, 6]] src = sorted(src, reverse=True, key=lambda x: int(x[1])) print(src) |
結果は次のようになる。
1 |
[[4, 5, 6], [1, 2, 3]] |
python3 多次元配列での要素追加方法
PHPではarray_multisortを使って記載していた。
1 2 3 4 |
// SORT_ASC - 昇順にソート // SORT_DESC - 降順にソート for( $i=0 ; $i<$key; $i++ ) { $id[$i] = $i; } array_multisort($agree, SORT_DESC, $id); |
実は、これをPythonで書く場合には非常に容易に書くことができる。
1 2 3 4 5 6 |
src = [[1, 2, 3], [4, 5, 6]] for row in src: row.append(0) print(src) |
結果は次のようになる。
1 |
[[1, 2, 3, 0], [4, 5, 6, 0]] |
Proxy経由してローカルPCからリモートサーバーへファイル転送
Webスクレイピングが完了し index.html ファイルを作成できたら、次にファイルをレンタルサーバに転送する。
方法は以前調べたことがある。
Proxyを利用する場合にはSOCKS5を使った socket通信も対応が必要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# coding: utf8 import paramiko import socks import socket # 修正箇所 ================================== USERNAME = "" PASSWORD = "" IP_ADDRESS = "" PORT = 22 PROXY_HOST = "" PROXY_PORT = 1080 # ここまで ================================== socks.set_default_proxy(socks.SOCKS5, PROXY_HOST, PROXY_PORT) socket.socket = socks.socksocket with paramiko.SSHClient() as client: client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(IP_ADDRESS, port=PORT, username=USERNAME, password=PASSWORD, timeout=30) try: # SFTPセッション開始 sftp_connection = client.open_sftp() # ローカルPCからリモートサーバーへファイルを転送 sftp_connection.put('index.html', '/home/***/www/yahoonews/index.html') finally: client.close() |
実行してみるとレンタルサーバに転送することができた。
はい、週末終了……。
まとめ
この方法をタスクマネージャーによって定期的に呼びだせば、今まで通りのサービスを提供することはできる。
結局Seleniumを利用するしか方法が思いつかなかった。
他によい方法は無いのかな……