一次爬虫類の同時改造過程


豆弁抽選の小さなプログラムを書いているので、豆弁放送の転送されたすべてのユーザー情報を捕まえて、これらのユーザーから幸運な視聴者を抽出する必要があります.
典型的なIO密集型操作ですね.
まず爬虫類はラジオに入って全部でどれだけの転送ページがあるかを見つけて、大体こんなに長いです.
def get_pages(url):
    r = fetch(url)
    
    soup = BeautifulSoup(r, 'lxml')
    page_num = soup.find("div", class_="paginator").find_all("a")[-2].string

    return page_num

次に、各ページのユーザー情報を順に解析します.
def parse_one(r):
    human = list()
    soup = BeautifulSoup(r, 'lxml')
    try:
        content = soup.find_all("li", class_="list-item")
    except:
        logging.error("there is no info.")
        raise
        .....

    return human

簡単でしょう.
最初はrequestsライブラリで各ページの内容を直接順番に要求しました.コードが書いたらクリックして実行します.待ってください.待ってください.やっと登り終わりました.コンソールの出力:
  : 106.168...

私は目が黒くなって、もしユーザーがこれを使って抽選したら、黄花菜はもう冷めてしまいました.multiprocessing.Pool()を使用して複数のプロセスを作成し、効果を確認します.
pool = multiprocessing.Pool(5)
url_list = [url + '?start={}&tab=reshare#reshare'.format(i * 20) for i in range(0, int(page_num))]
with pool as p:
    res = p.map(parse_one, url_list)

時間:
  : 26.168740749359131

悪くないようですね.前の順番よりかなり速く登りました.しかし、まだ少し遅いです.
そして私は携程(協程)に行くことにしました.
まず、Webコンテンツを取得するには、非同期で取得する必要があります.
async def fetch(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50",
        ......
    }
    async with aiohttp.ClientSession(headers=headers) as session:
        async with session.get(url) as res:
            result = await res.text()
            return result

その後、taskにすべてのリクエストを入れます.
url_list = [redict_url + '?start={}&tab=reshare#reshare'.format(i * 20) for i in range(0, int(page_num))]
loop = asyncio.=get_event_loop()
tasks = [asyncio.ensure_future(reshare(url)) for url in url_list]
loop.run_until_complete(asyncio.wait(tasks))

for task in tasks:
    human.extend(task.result())

次は奇跡を目撃する時だ!
△しかし、豆弁が私を封じたわけではありません.私はとても難しいです.
では、代理IPに行きましょう.また爬虫類が何百ものエージェントipアドレスを登ったと書いた.要求ごとにエージェントをランダムに選択:
def random_proxy():
    url = hosts[random.randint(1, len(hosts))]
    proxy = "http://{}".format(url)
    return proxy

効果を見てみましょう.
  : 2.2529048919677734

Amazing!!!
スレッド、プロセス、スレッドについては、前に書いた文章を参照してください.
pythonの同時プログラミングに対する思考
また、
私の豆弁抽選プログラム(豆味噌)はすでにオンラインになっています.バグを使ってください.