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

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

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

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

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

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

Q&A

0回答

1180閲覧

スクレイピングのスレッド処理

KohnoseLami

総合スコア17

スクレイピング

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

並列処理

複数の計算が同時に実行される手法

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

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

0グッド

1クリップ

投稿2020/07/23 04:11

前提・実現したいこと

プロキシリストからプロキシを回転させてアクセスしつつスレッド処理を行いたいです。

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

エラーメッセージは表示されませんが、ソースコードのidsを次から次へと処理したいのに一つのことを16個(スレッド数)同じ内容で処理してしまいます。

該当のソースコード

Python3

1from concurrent.futures import ThreadPoolExecutor 2from bs4 import BeautifulSoup 3from mechanize import Browser 4import subprocess 5import requests 6import socks 7import socket 8import time 9import sys 10 11keywords_list = [""] 12regulation_list = [ 13 "", 14] 15 16 = [] 17 = [] 18 19with open("proxylist.txt") as f: 20 proxylist = f.read().splitlines() 21 22def get_proxies(): 23 proxies = proxylist 24 return proxies 25 26proxArr = get_proxies() 27 28def main(ids, retry=5): 29 30 for id in ids: 31 32 for proxy in proxArr: 33 34 proxies = {"http": proxy, "https": proxy} 35 36 res = requests.get("http://inet-ip.info/ip", proxies=proxies) 37 print("--------------------------------") 38 print() 39 print(res.text) 40 41 for i in range(retry): 42 43 try: 44 br = Browser() 45 br.set_handle_robots(False) 46 br.addheaders = [ 47 ("User-agent", "Opera/9.30 (Nintendo Wii; U; ; 2047-7; en)") 48 ] 49 br.set_proxies(proxies=proxies) 50 51 br.open( 52 "", timeout=10.0 53 ) 54 br.select_form(action="") 55 br[""] = id 56 br.submit() 57 58 html = BeautifulSoup(br.response().read(), "html.parser") 59 title = html.find("title").text 60 body = html.find("body").text 61 62 for keyword in keywords_list: 63 if keyword in title: 64 65 print("") 66 break 67 68 soupobject = BeautifulSoup(br.response().read(), "html.parser") 69 mailaddresses = soupobject.find_all("strong") 70 fullname = soupobject.find_all("b") 71 willwritedata = id 72 73 for mailaddress in mailaddresses: 74 willwritedata += "," + mailaddress.text 75 76 for fullname in fullname: 77 fullname = fullname.text 78 79 print(fullname) 80 print(willwritedata + "\n") 81 パスリセ.append(fullname + "," + willwritedata + "\n") 82 print("--------------------------------") 83 84 except KeyboardInterrupt: 85 print("強制終了") 86 87 with open(".txt", "w", encoding="utf-8") as f: 88 f.write("\n".join()) 89 90 with open(".txt", "w", encoding="utf-8") as f: 91 f.write("\n".join()) 92 93 print("\n終了") 94 input() 95 exit() 96 97 except TypeError: 98 for regulation in regulation_list: 99 if regulation in title: 100 print("") 101 print("--------------------------------") 102 pass 103 pass 104 break 105 106 else: 107 break 108 109 else: 110 print("5回試行しましたが実行できませんでした。") 111 112 with open(".txt", "w", encoding="utf-8") as f: 113 f.write("\n".join()) 114 115 with open(".txt", "w", encoding="utf-8") as f: 116 f.write("\n".join()) 117 118 print("\n終了") 119 input() 120 exit() 121 122 123with open("idlist.txt") as f: 124 ids = f.read().splitlines() 125 126threads = [] 127 128with ThreadPoolExecutor(max_workers=16) as pool: 129 threads = [br for br in pool.map(main, ids)] 130 131with open(".txt", "w", encoding="utf-8") as f: 132 f.write("\n".join()) 133with open(".txt", "w", encoding="utf-8") as f: 134 f.write("\n".join()) 135 136print("\n終了") 137input() 138

試したこと

threadingやasyncioに載せ換えてみたりなどを試しましたがまったく変わらずどこかしらを間違えているのですがいまいちわかりません...
また、いろいろな資料を見て回ったのですが同じことをスレッドで処理するというものが見つからずいまいちどこが悪いのかわからず質問させていただきました。
他にも自分の同じような似ているプログラムでは動いているのでそちらと比べて見たりなどをしましたがまったく見当がつきませんでした...

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

Python 3.8.2

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

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

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

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

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

sfdust

2020/07/23 06:11 編集

「エラーメッセージは表示されません」とのことですが、 ・ パスリセという未定義変数が入っている ・ 「= [] 」というエラーになる文が入っている ・ 終盤で「with open(".txt", "w", encoding="utf-8") as f」が2つ重なっていて、なおかつファイル書き込み内容が("\n".join())となっている ・ 結局このコードでは、main関数の中でスクレイピングした内容を保存するのか、main関数が終ってからまとめて保存するのか意図がわからない(mainの中でスクレイピング内容をprintしているがその意味は?) 等、エラーや不可解な部分がいくつも見受けられます。 idリストの内容も示されておらずこちらでは試せません。 わからなくて途中で投げてそのまま投稿したのかもしれませんが。 たとえば、マルチスレッドを使わずシングルスレッドでアクセスするバージョンなど、あなたの手元できちんと動くプログラムを書いたうえで「これをマルチスレッド化したい」という形で投稿していただくと他の方も答えやすいと思います。
KohnoseLami

2020/07/23 06:14

すみません、文字列には個人情報が含まれていたためこちらで文字列などはすべて消して投稿させていただきました。(一部消し忘れがございますがそちらは問題ありません。) なので文字列がすべて入っていてスレッドではなく普通にmainの関数を呼び出すと動作することを確認しています。 単純に二つの変数に結果を格納してその二つの変数を最後に二つのテキストファイルとして出力するものとなっています。 では、仮の名前で変数などを代入して修正いたしますので少々お待ちください。 自分が聞きたかったのはスレッドの動作時に同じスクレイピング内容をスレッド数投げてしまうのをどんどん次の内容のスクレイピングを実行させるためにはどこを修正したらいいかを聞きたかったのです。 わかりづらく申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問