🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pip

pipとは、Pythonを用いて書かれているパッケージソフトのインストールや管理を行うためのパッケージマネジメントシステムです。pipを使う主なメリットは、コマンドラインインターフェースにて容易にPythonパッケージソフトをインストール可能だという点です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

3625閲覧

以下のコードをpython3系で動かせるようにしたい。

apollo_

総合スコア14

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pip

pipとは、Pythonを用いて書かれているパッケージソフトのインストールや管理を行うためのパッケージマネジメントシステムです。pipを使う主なメリットは、コマンドラインインターフェースにて容易にPythonパッケージソフトをインストール可能だという点です。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

0グッド

2クリップ

投稿2021/01/25 07:56

編集2021/01/25 09:18

前提・実現したいこと

ァイルに書かれた、単語リストを読み取って、各単語を google イメージ検索で検索し、そのブラウザの画面毎キャプチャしファイルに保存するスクリプト
のコード

# -*- coding: utf-8 -*- import sys # START: Frawned approach to change default encoding # But I intentionally take this approach since it's easy and believe it non-problematic in this limited program. # See discussion detail here. # https://stackoverflow.com/questions/3828723/why-should-we-not-use-sys-setdefaultencodingutf-8-in-a-py-script reload(sys) sys.setdefaultencoding('UTF8') # END: Frawned approach to change default encoding import StringIO import os from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from PIL import Image import time import errno from optparse import OptionParser import re import hashlib def mkdir_p(path): try: os.makedirs(path) except OSError as exc: # Python >2.5 if exc.errno == errno.EEXIST and os.path.isdir(path): pass else: raise def get_filename(text): if re.search('[^\w.\-_]', text): return hashlib.sha256(text.encode('utf-8')).hexdigest() else: return text def save_snapshot(driver, word, idx): fname = os.path.join(Options.dir, "%s.jpg" % get_filename(Options.prefix + word)) idx = "%03d" % (idx + 1) if os.path.isfile(fname) and (not Options.force_save): print(" ! %s: %s exists!" % (idx, fname)) return url_template = Engines[Options.engine] driver.get(url_template % word) if Options.js_before_save: with open(Options.js_before_save) as f: driver.execute_script(f.read()) driver.execute_script("document.body.style.overflow = 'hidden';") # See: https://gist.github.com/jsok/9502024 screen = driver.get_screenshot_as_png() image = Image.open(StringIO.StringIO(screen)) image.convert("RGB").save(fname, 'JPEG', optimize=True) print(" %s %s: %s" % (u'\u2713', idx, fname)) time.sleep(Options.sleep) def get_words_from_file(fname): with open(fname) as f: content = f.readlines() content = [x.split("\t")[0].rstrip() for x in content] return content def retrieve_snapshot_for_words(driver, words): for idx, word in enumerate(words): save_snapshot(driver, word, idx) Options = {} Engines = { "google": 'https://www.google.com/search?gl=us&hl=en&pws=0&gws_rd=cr&tbm=isch&safe=active&q=%s', "google_unsafe": 'https://www.google.com/search?gl=us&hl=en&pws=0&gws_rd=cr&tbm=isch&q=%s', "bing": 'https://www.bing.com/images/search?safeSearch=Moderate&mkt=en-US&q=%s', "bing_unsafe": 'https://www.bing.com/images/search?safeSearch=Off&mkt=en-US&q=%s', } def main(): global Options usage = "usage: %prog [options] word-list" scroll_to_first_image_of_google = "document.getElementById('islmp').scrollIntoView(true)" scroll_to_first_carousel_of_google = "document.getElementsByTagName('scrolling-carousel')[0].scrollIntoView()" parser = OptionParser(usage=usage) parser.add_option("-d", "--dir", dest="dir", help="Directory to write captured images.", default="slideshow/imgs") parser.add_option("-j", "--js-before-save", dest="js_before_save", help="Eval js file before save mainly to scroll to element", default="") parser.add_option("-f", "--force-save", action="store_true", dest="force_save", help="Overwrite existing file if exists", default=False) parser.add_option("-p", "--prefix", dest="prefix", help="Prefix for filename", default="") parser.add_option("-w", "--window", dest="window", help="Window size. 1280x720 by default.", default="1280x720") parser.add_option("-e", "--engine", dest="engine", help="Image search engine to use one of %s" % Engines.keys(), default="google") parser.add_option("-s", "--show", action="store_true", dest="show", help="Do not hide chrome browser", default=False) parser.add_option("--sleep", dest="sleep", type="float", help="Sleep duration on each take", default=1.0) (Options, args) = parser.parse_args() if Options.engine not in Engines: print("Engine must be one of %s" % Engines.keys()) exit(1) chrome_options = webdriver.ChromeOptions() if not Options.show: chrome_options.add_argument('--headless') chrome_options.add_argument('--hide-scrollbars') driver = webdriver.Chrome(options=chrome_options) (screen_width, screen_height) = Options.window.split("x") driver.set_window_size(screen_width, screen_height) print(Options) mkdir_p(Options.dir) for file in args: print(file + ': start') retrieve_snapshot_for_words(driver, get_words_from_file(file)) driver.quit() main()

をpython3で動くように修正したいです。

発生している問題・エラーメッセージ

記載されているコード

python bulk-screen-capture.py -d collection.media -p "google-img--" -j before_scroll.js -w 720x720 sample.tsv

を実行したところ

Traceback (most recent call last): File "bulk-screen-capture.py", line 9, in <module> reload(sys) NameError: name 'reload' is not defined

が出てうまく実行できませんでした。

試したこと

python3系ではデフォルトエンコードがUTF8のため、
sys.setdefaultencoding('UTF8')は推奨されていないとのことで、

import sys reload(sys) sys.setdefaultencoding('UTF8')

は削除しました。

StringIOもpython3系では対応していないため、
import StringIOも
import io as cStringIOに書き換え、
58行目の
image = Image.open(cStringIO.StringIO(screen))

image = Image.open(cStringIO.StringIO(screen))
に書き換えたら、以下のエラーが表示されました。

{'dir': 'collection.media', 'js_before_save': 'before_scroll.js', 'force_save': False, 'prefix': 'google-img--', 'window': '720x720', 'engine': 'google', 'show': False, 'sleep': 1.0} sample.tsv: start Traceback (most recent call last): File "bulk-screen-capture.py", line 120, in <module> main() File "bulk-screen-capture.py", line 117, in main retrieve_snapshot_for_words(driver, get_words_from_file(file)) File "bulk-screen-capture.py", line 71, in retrieve_snapshot_for_words save_snapshot(driver, word, idx) File "bulk-screen-capture.py", line 58, in save_snapshot image = Image.open(cStringIO.StringIO(screen)) TypeError: initial_value must be str or None, not bytes

ここにより詳細な情報を記載してください。
マシン環境はm1macbookです。
pythonのversionは3.8.2です
pip listは
Package Version


Pillow 8.1.0
pip 21.0
selenium 3.141.0
setuptools 41.2.0
six 1.15.0
urllib3 1.26.2
wheel 0.33.1
です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2021/01/25 08:03

python2系で動かすのでは駄目なのでしょうか?
68user

2021/01/25 08:10

修正したけれども、まだエラーが出ているのですか?
Daregada

2021/01/25 08:13

「reload(sys)」や「sys.setdefaultencoding('UTF8')」を削除したのであれば、提示されているエラーは出なくなるので、その後は何が問題になっているのか書いてください。
apollo_

2021/01/25 09:17

{'dir': 'collection.media', 'js_before_save': 'before_scroll.js', 'force_save': False, 'prefix': 'google-img--', 'window': '720x720', 'engine': 'google', 'show': False, 'sleep': 1.0} sample.tsv: start Traceback (most recent call last): File "bulk-screen-capture.py", line 120, in <module> main() File "bulk-screen-capture.py", line 117, in main retrieve_snapshot_for_words(driver, get_words_from_file(file)) File "bulk-screen-capture.py", line 71, in retrieve_snapshot_for_words save_snapshot(driver, word, idx) File "bulk-screen-capture.py", line 58, in save_snapshot image = Image.open(cStringIO.StringIO(screen)) TypeError: initial_value must be str or None, not bytes となり、エラーが出ています。
guest

回答1

0

image = Image.open(cStringIO.StringIO(screen))
TypeError: initial_value must be str or None, not bytes

ぐぐっただけですが、下記ですかね?

https://www.monotalk.xyz/blog/python3-%E3%81%A7-typeerror-initial_value-must-be-str-or-none-not-bytes-%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B/

投稿2021/01/25 15:49

68user

総合スコア2022

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apollo_

2021/01/25 22:52

ありがとうございます。試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問