私はユーザーが最初に実行するスクリプトに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")
端末から最初のスクリプトを実行するだけで実行できます。ドメインを変数として渡す方法を理解するのに役立つものもあります。
問題でクモを呼び出すことができます
その方法は、私の目標は、唯一のドメイン上のリンクを含んでクローラを作成し、要求されたドメイン外のドメインを除外することであるということです。また、クローラを作成するのではなく、単一のクローラファイルとして実行しています。 私はあなたの解決策を試しましたが、 'NameError:global name '要求'が定義されていません.'というエラーがスクリプトにあります。 – George
@George 'from scrapy import Request'。 'start_requests'メソッドは、クロールを開始するために' Request'オブジェクトを返す必要があります。デフォルトでは、 'start_urls'を反復し、リスト内のすべてのURLに対して' Request'オブジェクトを生成します。 – Granitosaurus
@Granitosaurusはい私はそれが必要なのか分からなかった。私はそれを追加し、それが私の他の唯一の問題を働かせ始めたのは、同じドメインのクロールURLを制限するために許可されたドメインが必要だということです。だから私はまだ別のスクリプトから変数を渡す方法を見つけなければなりません。あるいは何か他のものを描く。 – George