25

私はスクレイピーを使用して動作するクローラーを作成しましたが、
今では Django webapp を介して制御したいと考えています。

  • 1つまたは複数を設定start_urls
  • 1つまたは複数を設定allowed_domains
  • 設定settings
  • スパイダーを起動する
  • スパイダーの停止/一時停止/再開
  • 実行中にいくつかの統計を取得する
  • スパイダーが完了した後、いくつかの統計を取得します。

最初は、 scrapydはこのために作成されたものだと思っていましたが、ドキュメントを読んだ後、「パッケージ化されたスパイダー」、別名「scrapy の卵」を管理できるデーモンのようです。そして、すべての設定 ( start_urlsallowed_domainssettings) は「スクレイピー エッグ」自体にハードコーディングする必要があります。何かを見逃していない限り、私の質問に対する解決策のようには見えません。

私はこの質問も見ました:クロールのためにスクレイピーに URL を与えるには? ; しかし、複数の URL を提供するための最良の答えは、著者 himeslf によって、いくつかの Python サブプロセスと複雑なシェル処理を含む「醜いハック」として認定されているため、ここで解決策を見つけることはできないと思います。また、 に対しては機能する可能性がありますが、またはstart_urlsは許可されていないようです。allowed_domainssettings

次に、scrapy webservicesを調べました。これは、統計を取得するための優れたソリューションのようです。ただし、実行中のスパイダーが必要であり、変更の手がかりはありませんsettings

この件に関していくつかの質問がありますが、どれも満足のいくものではないようです:

  • 0.7 以降、 scrapy は大幅に進化しているため、これは時代遅れのようです。
  • creating-a-generic-scrapy-spider 受け入れられた答えはありません。まだシェルパラメーターの調整について話し合っています。

Scrapy が本番環境で使用されていることは知っています。そして、scrapyd のようなツールは、これらの要件を処理する方法が確実にいくつかあることを示しています (scrapyd が扱っているスクレイピーの卵が手作業で生成されているとは思えません!)

どうもありがとうございました。

4

4 に答える 4

10

最初は、scrapyd はこのために作成されたものだと思っていましたが、ドキュメントを読んだ後、「パッケージ化されたスパイダー」、別名「scrapy の卵」を管理できるデーモンのようです。そして、すべての設定 (start_urls、allowed_domains、settings) は「スクレイピー エッグ」自体にハードコーディングする必要があります。何かを見逃していない限り、私の質問に対する解決策のようには見えません。

上記のステートメントに同意しません。start_urls をハードコーディングする必要はありません。クラスに動的に渡すことができます。このように引数として渡すことができるはずです。

http://localhost:6800/schedule.json -d project=myproject -d spider=somespider -d setting=DOWNLOAD_DELAY=2 -d arg1=val1

または、データベースまたはファイルから URL を取得できる必要があります。このようなデータベースから取得します

class WikipediaSpider(BaseSpider):
    name = 'wikipedia'
    allowed_domains = ['wikipedia.com']
    start_urls = []

    def __init__(self, name=None, url=None, **kwargs):
        item = MovieItem()
        item['spider'] = self.name
        # You can pass a specific url to retrieve 
        if url:
            if name is not None:
                self.name = name
            elif not getattr(self, 'name', None):
                raise ValueError("%s must have a name" % type(self).__name__)
            self.__dict__.update(kwargs)
            self.start_urls = [url]
        else:
            # If there is no specific URL get it from Database
            wikiliks = # < -- CODE TO RETRIEVE THE LINKS FROM DB -->
            if wikiliks == None:
                print "**************************************"
                print "No Links to Query"
                print "**************************************"
                return None

            for link in wikiliks:
                # SOME PROCESSING ON THE LINK GOES HERE
                self.start_urls.append(urllib.unquote_plus(link[0]))

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        # Remaining parse code goes here
于 2013-06-15T03:47:20.217 に答える
8

プログラムで設定を変更し、アプリ内からスクレーパーを実行するために、私が得たものは次のとおりです。

from scrapy.crawler import CrawlerProcess
from myproject.spiders import MySpider
from scrapy.utils.project import get_project_settings

os.environ['SCRAPY_SETTINGS_MODULE'] = 'myproject.my_settings_module'
scrapy_settings = get_project_settings()
scrapy_settings.set('CUSTOM_PARAM', custom_vaule)
scrapy_settings.set('ITEM_PIPELINES', {})  # don't write jsons or anything like that
scrapy_settings.set('DOWNLOADER_MIDDLEWARES', {
   'myproject.middlewares.SomeMiddleware': 100,
})
process = CrawlerProcess(scrapy_settings)
process.crawl(MySpider, start_urls=start_urls)
process.start()
于 2016-02-04T21:22:38.080 に答える
3

これは実はとても簡単です!

from mypackage.spiders import MySpider
from scrapy.crawler import CrawlerProcess

results = []

class MyPipeline(object):
    """ A custom pipeline that stores scrape results in 'results'"""
    def process_item(self, item, spider):
        results.append(dict(item))

process = CrawlerProcess({
    # An example of a custom setting
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',  
    'ITEM_PIPELINES': {'__main__.MyPipeline': 1},   # Hooking in our custom pipline above
})

start_urls=[
    'http://example.com/page1', 
    'http://example.com/page2',
]
process.crawl(MySpider, start_urls=start_urls)
process.start() # the script will block here until the crawling is finished

# Do something with the results
print results
于 2015-09-23T23:25:13.250 に答える
0

私はあなたがこれを見る必要があると思います

http://django-dynamic-scraper.readthedocs.org/en/latest/

これはあなたが望むものと幾分似ています。また、タスクシェドゥリングのセロリを使用します。彼が何をしているかを確認するためのコードを見ることができます。彼のコードをあなたが望むことをするように修正すれば簡単だと思います

また、djangoとのインターフェースをセットアップする方法に関する優れたドキュメントもあります

于 2013-01-25T05:17:11.020 に答える