LoginSignup
2
2

More than 5 years have passed since last update.

pythonのスクレイピングで躓いたところをメモ

Last updated at Posted at 2018-08-15

Pythonをそもそも初めて使ったのですが、
その時に苦労したことをメモ書き

環境

python3.7
Django2
pydrive
selenium
chromedriver
CentOS7.0

OSがCentOS6だとchromedriverが動かない

CentOS7にあげる

ローカルだと動くのに, Webから動かすとバグが出た

エラーを記録するのを忘れたのだが
python3.5の標準機能のバグでした。
python3.7にupgradeするとうまくいきました.

日本語の情報がなかったので

pydrive crontabで実行するとエラー

エラー内容

 File "/home/XXXX/.pyenv/versions/3.7.0/lib/python3.7/site-packages/pydrive/auth.py", line 388, in LoadClientConfigFile
    raise InvalidConfigError('Invalid client secrets file %s' % error)
pydrive.settings.InvalidConfigError: Invalid client secrets file ('Error opening
 file', 'client_secrets.json', 'No such file or directory', 2)

修正箇所

# Google Drive 認証を行う
google_auth = GoogleAuth()
credential_path = os.path.join(DIR_PATH,'credentials.json')
# DIR_PATHは自身の絶対PATH
store = Storage(credential_path)
credentials = store.get()
google_auth.credentials = credentials

# ここを追加するとcrontabで動かしても大丈夫になりました
google_auth.LoadClientConfigFile(DIR_PATH + 'client_secrets.json')
# client_secrets.json も絶対PATHで指定

drive = GoogleDrive(google_auth)

これ解消するのにめっちゃ時間かかった.

外部ファイルimport(Djangoとローカルで動きが違う)

python3からimportの挙動が変わったようだ.

importされる側 のファイルをaa.pyとすると

エラー内容(Djangoでは動くが,ローカルで動かそうとしたとき)

Traceback (most recent call last):
  File "importする側.py", line 38, in <module>
    from . import aa
ImportError: cannot import name 'aa' from '__main__' (importする側.py)

修正

importする側.py
if __name__ == '__main__':
   # こちらローカルで動かすとき
   import aa
   main()
else:
  # こちらDjangoで動かすとき
  from . import aa
  main()

これでとりあえずは大丈夫

Chromeの開き過ぎのエラー

raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: chrome not reachable
  (Session info: headless chrome=68.0.3440.84)
  (Driver info: chromedriver=2.38.552522 (437e6fbedfa8762dec75e2c5b3ddb86763dc9dcb),platform=Linux 3.10.0-862.9.1.el7.x86_64 x86_64)
scraping.py
# pythonからシェルコマンドを動かす
import subprocess

def scraping:
  try:
    for i in range(100) :
      # とりあえずたくさん開く
      driver.get(url) # urlは実際のURLを入れてください

  finally:
    driver.quit() # これだけだとバグが出るケースがある。
    # 下を追加
    subprocess.call("killall chrome",shell=True)
    subprocess.call("killall chromedriver",shell=True)

シェルでkillallさせる。とりあえずこれで動く。


ps aux|grep chrome

これで消えているか確認する

だいぶ走り書きをしてしまったが、今度清書するかもしないかも

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2