1
私はデジタルスクリーパーを作成して、デジタルライブラリー(sample document)に掲載された研究論文の情報を抽出しました。ウェブスクレーパーの速度を改善する
基本的には、各論文のタイトル、要約、および参考文献のリストを抽出し、テキストファイルに保存しています。このプロセスは、参照される全ての論文についても繰り返される。
- 私はドキュメントIDを格納するためにキューを使用しています。
- 少なくとも5000件の論文からこのような情報を抽出する必要がありますが、プログラムが遅すぎるため、250〜300件の論文を読むのに約3時間かかります。
このスクレーパの速度を改善する方法はありますか?ここで
はコードです:
# _*_ coding:utf-8 _*_
import urllib2
import json
import Queue
crawled = []
fo = open("paper.txt", "w")
class Paper(object):
def __init__(self, paper_id):
self.paper_id = paper_id
self.title, self.abstract = self.fetch_data()
def fetch_data(self):
base_url = "http://ieeexplore.ieee.org/rest/document/{0}/{1}"
data_url = base_url.format(self.paper_id, "abstract")
response = urllib2.urlopen(data_url)
html = response.readlines()
data = json.loads("\n".join(html))
title = data["title"]
abstract = data["abstract"]
return title, abstract
def fetch_ieee_references(self):
base_url = "http://ieeexplore.ieee.org/rest/document/{0}/{1}"
data_url = base_url.format(self.paper_id, "references")
response = urllib2.urlopen(data_url)
html = response.readlines()
data = json.loads("\n".join(html))
references = []
try:
for ref in data["references"]:
try:
ref_link = ref["links"]["documentLink"]
ref_paper_id = ref_link.split("/")[-1]
references.append(Paper(ref_paper_id))
except:
pass
except:
pass
return references
def extract_paper(self):
try:
print "Paper ID"
print self.paper_id
fname = str(self.paper_id)
fname = fname + ".txt"
fcon = open(fname,"w")
print
print "Title"
print self.title
print >>fcon, self.title
print "Abstract"
print self.abstract
print >>fcon, self.abstract
print "References"
for ref in self.fetch_ieee_references():
print ref.paper_id, ref.title
print >>fo, self.paper_id, ref.paper_id
except:
pass
def new_func():
n_id = 6639344
q = Queue.Queue()
q.put_nowait(n_id)
crawled.append(n_id)
while not q.empty():
p_id = q.get_nowait()
paper = Paper(p_id)
paper.extract_paper()
for ref in paper.fetch_ieee_references():
if ref.paper_id not in crawled:
crawled.append(ref.paper_id)
q.put_nowait(ref.paper_id)
new_func()
ほとんどすべての時間は、HTTP要求/応答時間とサーバーの可用性に依存します。そしてそれはいつも私たちのコントロール下にあるわけではありません。 – felipsmartins
コードの改善と作業コードの最適化について:codereview.stackexchange.com – MooingRawr
このコメントに沿って、HTTPリクエストはボトルネックであるため、これを常に実行するようにします。 HTTPコール間で同じスレッド上のテキストを分析するべきではありません。あるスレッドがすべてのIDを実行し、HTTP呼び出しの結果をキューに入れ、別のスレッドがinitからHTTPを実行するのではなく、その結果からデータを入力する紙オブジェクトを構築するようにしてください –