2016-10-27 12 views
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()     
+2

ほとんどすべての時間は、HTTP要求/応答時間とサーバーの可用性に依存します。そしてそれはいつも私たちのコントロール下にあるわけではありません。 – felipsmartins

+1

コードの改善と作業コードの最適化について:codereview.stackexchange.com – MooingRawr

+0

このコメントに沿って、HTTPリクエストはボトルネックであるため、これを常に実行するようにします。 HTTPコール間で同じスレッド上のテキストを分析するべきではありません。あるスレッドがすべてのIDを実行し、HTTP呼び出しの結果をキューに入れ、別のスレッドがinitからHTTPを実行するのではなく、その結果からデータを入力する紙オブジェクトを構築するようにしてください –

答えて

0

は、すでに述べたように、サイトのサーバーに依存しているので、それは主にHTTPリクエストの速度に依存し、他のユーザーが言及しました。物事をスピードアップするために、複数のプロセス間でペーパーを分割することができます。 また、なぜhtmlを読んでjson.loadsを使用するのか分かりませんが、json.loadをレスポンスに使用するだけで、これは少し高速化します。

関連する問題