質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Python

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

Q&A

0回答

756閲覧

herokuでスクレイピングを実行したいが、ModuleNotFoundError: No module namedエラーが出ている

su_da221

総合スコア59

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Python

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

0グッド

0クリップ

投稿2021/11/27 09:19

前提・実現したいこと

ローカルで動かしていたpythonファイルをherokuにアップロードして動かしたいです。
こちらのサイトを参考に、デプロイしたんですがエラーが出て実行できません。

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

Traceback (most recent call last): File "py.py", line 2, in <module> from selenium import webdriver ModuleNotFoundError: No module named 'selenium'

該当のソースコード

ディレクトリ
file
-- email.elsx
-- Pipfile
-- Pipfile.lock
-- Prockfile
-- py.py
-- requirements.txt
-- runtime.txt

pythonファイル

python

1import os 2from selenium import webdriver 3from selenium.webdriver.common.keys import Keys 4from selenium.webdriver.common.by import By 5import chromedriver_binary 6from selenium.webdriver.common.action_chains import ActionChains 7from selenium.webdriver.chrome.options import Options 8from time import sleep, time 9import random 10import requests 11from bs4 import BeautifulSoup 12import re 13from fake_useragent import UserAgent 14import openpyxl 15import time 16 17# 全てのリンクを辿って取得 18 19# そのリンクのページでbs4で取得 20 21def get_keyword(ws, keyword_lists, ex_row): 22 while not ws.cell(ex_row, 2).value is None: 23 print(ws.cell(ex_row, 2).value) 24 keyword = ws.cell(ex_row, 2).value 25 keyword_lists.append(keyword) 26 ex_row = ex_row + 1 27 28 if ex_row > 10000: 29 break 30 31 if keyword == 'None': 32 break 33 34def link_search(keyword): 35 driver.get('https://www.google.co.jp') 36 elem_h3_li = [] 37 38 search_bar = driver.find_element(By.NAME, "q") 39 search_bar.send_keys(keyword) 40 try: 41 search_bar.submit() 42 except: 43 print('なんかできない') 44 sleep(8) 45 46 try: 47 elem_h3_li = driver.find_elements_by_xpath('//a/h3') 48 except: 49 print('なし') 50 51 for elem_h3 in elem_h3_li: 52 i =+ 1 53 elem_a = elem_h3.find_element_by_xpath('..') 54 elem_a_href = elem_a.get_attribute('href') 55 if 'google.co.jp' in elem_a_href: 56 print('グーグルだ') 57 break 58 else: 59 link_lists.append(elem_a.get_attribute('href')) 60 61 if i > 6: 62 break 63 64 65def access(link_lists, keyword): 66 mail = '' 67 68 # 取得したリンクにアクセスして該当キーワードがあるか 69 for link in link_lists: 70 71 try: 72 # スクレイピング対象の URL にリクエストを送り HTML を取得する 73 res = requests.get(link,headers=header,timeout=(6.0, 10.5),verify=False) 74 except (requests.exceptions.ConnectTimeout,requests.exceptions.ReadTimeout): 75 break 76 except: 77 break 78 # レスポンスの HTML から BeautifulSoup オブジェクトを作る 79 try: 80 soup = BeautifulSoup(res.text, 'html.parser') 81 except: 82 print('アクセスできない') 83 print(link) 84 85 86 # 完全一致したら処理終了 87 if soup.find(text=keyword): 88 sleep(sleeptime) 89 hantei_num = hantei[2] 90 mail = soup.find(text=keyword) 91 print('-------完全一致--------') 92 print(mail) 93 return hantei_num, mail, link 94 95 # 似たようなものがあれば 96 if soup.find(text=re.compile(keyword)): 97 sleep(sleeptime) 98 hantei_num = hantei[1] 99 mail = soup.find(text=re.compile(keyword)) 100 print('-------似ている--------') 101 print(mail) 102 return hantei_num, mail, link 103 104 # 何もないので 105 hantei_num = hantei[0] 106 link = '' 107 return hantei_num, mail, link, 108 109 110def ex(ex_arry, ex_row): 111 # Excelに登録 112 ex_col = 3 113 for ex_item in ex_arry: 114 cell = ws.cell( row=ex_row, column=ex_col ) 115 cell.value = ex_item 116 print(ex_col) 117 print(ex_row) 118 ex_col = ex_col + 1 119 wb.save(ex_name) 120 wb.close() 121 122 123if __name__ == '__main__': 124 # heroku用にchromedriverのPATHを指定 125 driver_path = '/app/.chromedriver/bin/chromedriver' 126 # アクセスの定義づけ 127 options = Options() 128 options.add_argument('--headless') 129 options.add_argument('--disable-gpu') 130 options.add_argument('--no-sandbox') 131 options.add_argument('--disable-dev-shm-usage') 132 options.add_argument('--remote-debugging-port=9222') 133 driver = webdriver.Chrome(options=options, executable_path=driver_path) 134 # driver = webdriver.Chrome() 135 ua = UserAgent() 136 header = {'user-agent':ua.chrome} 137 138 start_time = time.time() 139 140 ex_name = "email.xlsx" 141 wb = openpyxl.load_workbook( ex_name ) 142 ws = wb[ "作業リスト" ] 143 ex_row = 1211 # 開始シート行 144 145 # 5〜10のランダム数字一時停止にしよう 146 sleeptime = random.randint(5,10) 147 148 # メールアドレスリスト 149 keyword_lists = [] 150 # 判定 151 hantei = ['×', '異なる', '同一'] 152 153 get_keyword(ws, keyword_lists, ex_row) 154 155 for keyword in keyword_lists: 156 # Googleの検索リンク初期化 157 link_lists = [] 158 159 # 該当するリンクを取得 160 link_search(keyword) 161 sleep(sleeptime) 162 print(keyword) 163 print('キーワード検索') 164 165 # メールアドレスのあるリンクをチェック 166 # 戻り値アドレス、判定num、リンクを変数に入れる 167 link, mail_item, h_num = access(link_lists, keyword) 168 print('--------結果------') 169 print(mail_item) 170 print(h_num) 171 print(link) 172 print('------------------') 173 # エクセルに追加 174 175 ex_arry = [] 176 177 ex_arry.append(h_num) 178 ex_arry.append(mail_item) 179 ex_arry.append(link) 180 181 print('エクセル記述') 182 print(ex_arry) 183 ex(ex_arry, ex_row) 184 ex_row = ex_row + 1

requirements.txtにはseleniumありました。

pip3 freeze > requirements.txt

このコードで中身は書いております。

試したこと

pipfile.lockをデプロイしたりしましたが、変わりませんでした。

補足情報(FW/ツールのバージョンなど)

mac
python 3.8.8
selenium
github
heroku

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

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

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

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

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

hoshi-takanori

2021/11/28 09:14

実行したら結果を表示して終了する普通のスクリプトに見えますが、heroku で動かしたいなら heroku で動くようなプログラム (たしか web または worker) にして、結果も外部の適切な場所に送信する必要があるような…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問