2017-04-09 7 views
-1

私はユーザーが最初に実行するスクリプトにURLを入力するWebクローラーを構築しています。その後、そのスクリプトは入力されたドメインでクローラーを実行します。私はいくつかのクリーニングをしていますが、プロトタイプを取得する必要があります。コードを作ったが、クローラスクリプトがURLを要求し続けるということが起こる。私はそれを入力するためにターミナルコマンドを使用してみましたが、私のコードはそれと互換性があるとは思わない。エンドユーザーが入力したドメインを別のスクリプトから渡す方が良い方法はありますか?ドメインをScrapy Webクローラーに渡す

# First script 
import os 

def userInput(): 
    user_input = raw_input("Please enter URL. Please do not include http://: ") 
    os.system("scrapy runspider crawler_prod.py") 

# Crawler Script 

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item 
from scrapy.spider import BaseSpider 

from run_first import userInput 

userInput() 

class InputSpider(CrawlSpider): 
     name = "Input" 
     user_input = "" 
     allowed_domains = [user_input] 
     start_urls = ["http://" + user_input + "/"] 

     # allow=() is used to match all links 
     rules = [ 
     Rule(SgmlLinkExtractor(allow=()), follow=True, callback='parse_item') 
     ] 

     def parse_item(self, response): 
      x = HtmlXPathSelector(response) 
      filename = "output.txt" 
      open(filename, 'ab').write(response.url + "\n") 

端末から最初のスクリプトを実行するだけで実行できます。ドメインを変数として渡す方法を理解するのに役立つものもあります。

答えて

1

ではなくstart_urlsstart_requestsメソッドを使用します。クモはそれが必要とするすべてのドメインを許可することができるように

def start_requests(self): 
    yield Request(url=self.user_input) 

... 

allowed_domainsクラス変数を削除します。あなただけscrapy crawl myspider -a user_input="http://example.com"

+0

問題でクモを呼び出すことができます

その方法は、私の目標は、唯一のドメイン上のリンクを含んでクローラを作成し、要求されたドメイン外のドメインを除外することであるということです。また、クローラを作成するのではなく、単一のクローラファイルとして実行しています。 私はあなたの解決策を試しましたが、 'NameError:global name '要求'が定義されていません.'というエラーがスクリプトにあります。 – George

+0

@George 'from scrapy import Request'。 'start_requests'メソッドは、クロールを開始するために' Request'オブジェクトを返す必要があります。デフォルトでは、 'start_urls'を反復し、リスト内のすべてのURLに対して' Request'オブジェクトを生成します。 – Granitosaurus

+0

@Granitosaurusはい私はそれが必要なのか分からなかった。私はそれを追加し、それが私の他の唯一の問題を働かせ始めたのは、同じドメインのクロールURLを制限するために許可されたドメインが必要だということです。だから私はまだ別のスクリプトから変数を渡す方法を見つけなければなりません。あるいは何か他のものを描く。 – George

関連する問題