何百万ものドメインのリストから 1 ~ 3 ページを取得する Web クローラーを構築しています。マルチスレッドで Python を使用しています。束) とツイスト、スクレイピーですが、どれも約 10 メガビット以上の帯域幅を使用することを許可していません (私は 60 メガビットの速度を持っています)。通常、約 100-300 スレッドで最大になり、その後、失敗した要求が発生します。 . php/curlでもこの問題が発生しました。urllib3 と Threads モジュール (Python) を使用して google plus ページからスクレイピングし、100mbit 接続を最大化するスクレーパーを持っています (これは、同じホストで開いているソケットを再利用しており、google が高速であるためと考えられます)。ネットワーク応答)
これは、pycurl を使用したスクリプトの 1 つの例です。URL を含む csv ファイルから URL を読み取っています。
import pycurl
from threading import Thread
from Queue import Queue
import cStringIO
def get(readq,writeq):
buf = cStringIO.StringIO()
while True:
url=readq.get()
c = pycurl.Curl()
c.setopt(pycurl.TIMEOUT, 15)
c.setopt(pycurl.FOLLOWLOCATION, 1)
c.setopt(pycurl.USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0')
c.setopt(c.WRITEFUNCTION, buf.write)
c.setopt(c.URL, url)
try:
c.perform()
writeq.put(url+' '+str(c.getinfo(pycurl.HTTP_CODE)))
except:
writeq.put('error '+url)
print('hi')
readq=Queue()
writeq=Queue()
import csv
reader=csv.reader(open('alldataunq2.csv'))
sites = []
ct=0
for l in reader:
if l[3] != '':
readq.put('http://'+l[3])
ct+=1
if ct > 100000:
break
t=[]
for i in range(100):
Thread(target=get,args=(readq,writeq)).start()
while True:
print(writeq.get())
私のプロセッサ/メモリはほとんど使用されていないため、ボトルネックは間違いなくネットワーク IO です。100 メガビット以上のフル接続を使用できる同様のスクレーパーの作成に成功した人はいますか?
スクレイピングコードの速度を上げる方法についての意見は大歓迎です