前提・実現したいこと
テキストファイル内のURL一覧を一行ずつ参照しサイトにアクセスして、そのサイト内に設定した文字列が存在する場合にのみにURL一覧をテキストファイル形式で出力したい。
発生している問題・エラーメッセージ
スクレイピング対象URLがJavascriptで見事に動作しませんでした。
該当のソースコード
Python3
1import requests 2from time import time 3from threading import Thread 4import sys 5from bs4 import BeautifulSoup 6 7#コマンドライン引数 USAGE: $python check_url.py [input_file] 8args = sys.argv 9if len(args)==2: 10 input_file = args[1] 11else: 12 input_file ="list.txt" #デフォルト 13 14#キーワード設定 15keywords_list=["データが見つかりませんでした"] 16 17#結果を入れるリスト 18logs= [] 19urls_404 = [] 20urls_504 = [] 21urls_accept = [] 22 23def check_url(target_url): 24 25 try: 26 req = requests.get(target_url) 27 logs.append(str(req.status_code)+"\t"+target_url) 28 29 if req.status_code == 404: 30 urls_404.append(target_url) 31 32 elif req.status_code == 504: 33 urls_504.append(target_url) 34 35 elif req.status_code == 200: 36 html = BeautifulSoup(req.text, "html.parser") 37 #print(str(html)) 38 title = html.find("title").text #<title>~</title>の文字列 39 body = html.find("body").text #<body>~</body>の文字列 40 41 for keyword in keywords_list: 42 if keyword in body: # キーワードがbodyに含まれているか判定 43 urls_accept.append(target_url) 44 break 45 46 except requests.exceptions.ConnectTimeout: 47 print('タイムアウトしました') 48 logs.append("TIMEOUT"+"\t"+target_url) 49 50 51start = time() 52 53with open(input_file) as f: 54 urls = f.read().splitlines() 55 56threads = [] 57 58for url in urls: 59 thread = Thread(target=check_url, args=(url,)) 60 thread.start() 61 threads.append(thread) 62 63for thread in threads: 64 thread.join() 65 66print("\n".join(logs)) 67 68with open("log.txt", "w") as f: 69 f.write("\n".join(logs)) 70 71with open("404.txt", "w") as f: 72 f.write("\n".join(urls_404)) 73 74with open("504.txt", "w") as f: 75 f.write("\n".join(urls_504)) 76 77with open("output.txt", "w") as f: 78 f.write("\n".join(urls_accept)) 79 80print(time() - start) 81
試したこと
Javascriptでのスクレイピングで少し調べたのですがSeleniumでのスクレイピングで実際のブラウザを使用する方法が出てきたのですがこれでは結果が出るまでにかなり遅そうでなおかつとても動作が重そうでしたのでまだ何も試せていない状況です。
調べるURLの総数がかなり多いため速度を重視させたいです。
もしbs4などの軽い動作でなおかつ速度が出せるものがあれば教えてほしいです。
軽い動作のJavascriptスクレイピングモジュールが見つかっていないため教えていただけると助かります。
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/06 15:28