一次爬虫類の同時改造過程
豆弁抽選の小さなプログラムを書いているので、豆弁放送の転送されたすべてのユーザー情報を捕まえて、これらのユーザーから幸運な視聴者を抽出する必要があります.
典型的なIO密集型操作ですね.
まず爬虫類はラジオに入って全部でどれだけの転送ページがあるかを見つけて、大体こんなに長いです.
次に、各ページのユーザー情報を順に解析します.
簡単でしょう.
最初はrequestsライブラリで各ページの内容を直接順番に要求しました.コードが書いたらクリックして実行します.待ってください.待ってください.やっと登り終わりました.コンソールの出力:
私は目が黒くなって、もしユーザーがこれを使って抽選したら、黄花菜はもう冷めてしまいました.
時間:
悪くないようですね.前の順番よりかなり速く登りました.しかし、まだ少し遅いです.
そして私は携程(協程)に行くことにしました.
まず、Webコンテンツを取得するには、非同期で取得する必要があります.
その後、taskにすべてのリクエストを入れます.
次は奇跡を目撃する時だ!
△しかし、豆弁が私を封じたわけではありません.私はとても難しいです.
では、代理IPに行きましょう.また爬虫類が何百ものエージェントipアドレスを登ったと書いた.要求ごとにエージェントをランダムに選択:
効果を見てみましょう.
Amazing!!!
スレッド、プロセス、スレッドについては、前に書いた文章を参照してください.
pythonの同時プログラミングに対する思考
また、
私の豆弁抽選プログラム(豆味噌)はすでにオンラインになっています.バグを使ってください.
典型的な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の同時プログラミングに対する思考
また、
私の豆弁抽選プログラム(豆味噌)はすでにオンラインになっています.バグを使ってください.