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

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

ただいまの
回答率

88.91%

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

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 236

KohnoseLami

score 11

前提・実現したいこと

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

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

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

該当のソースコード

from concurrent.futures import ThreadPoolExecutor
from bs4 import BeautifulSoup
from mechanize import Browser
import subprocess
import requests
import socks
import socket
import time
import sys

keywords_list = [""]
regulation_list = [
    "",
]

 = []
 = []

with open("proxylist.txt") as f:
    proxylist = f.read().splitlines()

def get_proxies():
    proxies = proxylist
    return proxies

proxArr = get_proxies()

def main(ids, retry=5):

    for id in ids:

        for proxy in proxArr:

            proxies = {"http": proxy, "https": proxy}

            res = requests.get("http://inet-ip.info/ip", proxies=proxies)
            print("--------------------------------")
            print()
            print(res.text)

            for i in range(retry):

                try:
                    br = Browser()
                    br.set_handle_robots(False)
                    br.addheaders = [
                        ("User-agent", "Opera/9.30 (Nintendo Wii; U; ; 2047-7; en)")
                    ]
                    br.set_proxies(proxies=proxies)

                    br.open(
                        "", timeout=10.0
                    )
                    br.select_form(action="")
                    br[""] = id
                    br.submit()

                    html = BeautifulSoup(br.response().read(), "html.parser")
                    title = html.find("title").text
                    body = html.find("body").text

                    for keyword in keywords_list:
                        if keyword in title:

                            print("")
                            break

                    soupobject = BeautifulSoup(br.response().read(), "html.parser")
                    mailaddresses = soupobject.find_all("strong")
                    fullname = soupobject.find_all("b")
                    willwritedata = id

                    for mailaddress in mailaddresses:
                        willwritedata += "," + mailaddress.text

                    for fullname in fullname:
                        fullname = fullname.text

                    print(fullname)
                    print(willwritedata + "\n")
                    パスリセ.append(fullname + "," + willwritedata + "\n")
                    print("--------------------------------")

                except KeyboardInterrupt:
                    print("強制終了")

                    with open(".txt", "w", encoding="utf-8") as f:
                        f.write("\n".join())

                    with open(".txt", "w", encoding="utf-8") as f:
                        f.write("\n".join())

                    print("\n終了")
                    input()
                    exit()

                except TypeError:
                    for regulation in regulation_list:
                        if regulation in title:
                            print("")
                            print("--------------------------------")
                            pass
                        pass
                    break

                else:
                    break

            else:
                print("5回試行しましたが実行できませんでした。")

                with open(".txt", "w", encoding="utf-8") as f:
                    f.write("\n".join())

                with open(".txt", "w", encoding="utf-8") as f:
                    f.write("\n".join())

                print("\n終了")
                input()
                exit()


with open("idlist.txt") as f:
    ids = f.read().splitlines()

threads = []

with ThreadPoolExecutor(max_workers=16) as pool:
    threads = [br for br in pool.map(main, ids)]

with open(".txt", "w", encoding="utf-8") as f:
    f.write("\n".join())
with open(".txt", "w", encoding="utf-8") as f:
    f.write("\n".join())

print("\n終了")
input()

試したこと

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

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

Python 3.8.2

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • sfdust

    2020/07/23 15:09 編集

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

    わからなくて途中で投げてそのまま投稿したのかもしれませんが。
    たとえば、マルチスレッドを使わずシングルスレッドでアクセスするバージョンなど、あなたの手元できちんと動くプログラムを書いたうえで「これをマルチスレッド化したい」という形で投稿していただくと他の方も答えやすいと思います。

    キャンセル

  • KohnoseLami

    2020/07/23 15:14

    すみません、文字列には個人情報が含まれていたためこちらで文字列などはすべて消して投稿させていただきました。(一部消し忘れがございますがそちらは問題ありません。)
    なので文字列がすべて入っていてスレッドではなく普通にmainの関数を呼び出すと動作することを確認しています。
    単純に二つの変数に結果を格納してその二つの変数を最後に二つのテキストファイルとして出力するものとなっています。

    では、仮の名前で変数などを代入して修正いたしますので少々お待ちください。
    自分が聞きたかったのはスレッドの動作時に同じスクレイピング内容をスレッド数投げてしまうのをどんどん次の内容のスクレイピングを実行させるためにはどこを修正したらいいかを聞きたかったのです。
    わかりづらく申し訳ありません。

    キャンセル

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

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る