単に urllib を使用する代わりに、http プロキシを介して動作する URL をマルチスレッドで高速にダウンロードするための最も効率的なパッケージを知っている人はいますか? 私は Twisted、Scrapy、libcurl などのいくつかを知っていますが、決定を下すのに十分な知識がなく、プロキシを使用できるかどうかさえ知りません.私の目的に最適なものを知っている人はいますか? ありがとう!
8949 次
2 に答える
17
これをPythonで実装するのは簡単です。
urlopen()関数は、認証を必要としないプロキシで透過的に機能します。UnixまたはWindows環境では、Pythonインタープリターを起動する前に、http_proxy、ftp_proxy、またはgopher_proxy環境変数をプロキシサーバーを識別するURLに設定します。
# -*- coding: utf-8 -*-
import sys
from urllib import urlopen
from BeautifulSoup import BeautifulSoup
from Queue import Queue, Empty
from threading import Thread
visited = set()
queue = Queue()
def get_parser(host, root, charset):
def parse():
try:
while True:
url = queue.get_nowait()
try:
content = urlopen(url).read().decode(charset)
except UnicodeDecodeError:
continue
for link in BeautifulSoup(content).findAll('a'):
try:
href = link['href']
except KeyError:
continue
if not href.startswith('http://'):
href = 'http://%s%s' % (host, href)
if not href.startswith('http://%s%s' % (host, root)):
continue
if href not in visited:
visited.add(href)
queue.put(href)
print href
except Empty:
pass
return parse
if __name__ == '__main__':
host, root, charset = sys.argv[1:]
parser = get_parser(host, root, charset)
queue.put('http://%s%s' % (host, root))
workers = []
for i in range(5):
worker = Thread(target=parser)
worker.start()
workers.append(worker)
for worker in workers:
worker.join()
于 2009-10-27T12:36:13.880 に答える
1
通常、プロキシはWebサイトの作成方法に基づいてWebサイトを分類的にフィルタリングします。カテゴリに基づいたプロキシを介してデータを送信することは困難です。たとえば、YouTubeはオーディオ/ビデオストリームとして分類されているため、一部の場所、特に学校ではYouTubeがブロックされています。プロキシをバイパスしてWebサイトからデータを取得し、それを登録できるドットコムWebサイトのような独自の本物のWebサイトに配置したい場合。あなたがウェブサイトを作って登録しているとき、あなたのウェブサイトをあなたが望むものとして分類してください。
于 2011-04-27T11:48:09.763 に答える