4

スパイダーの開始時に小さなリストで始まるスパイダーがありallowed_domainsます。パーサー内からスパイダリングが続行されるため、このホワイトリストにドメインを動的に追加する必要がありますが、後続のリクエストがまだフィルタリングされているため、次のコードはそれを達成できません。allowed_domainsパーサー内で別の更新はありますか?

class APSpider(BaseSpider):
name = "APSpider"

allowed_domains = ["www.somedomain.com"]

start_urls = [
    "http://www.somedomain.com/list-of-websites",
]

...

def parse(self, response):
    soup = BeautifulSoup( response.body )

    for link_tag in soup.findAll('td',{'class':'half-width'}):
        _website = link_tag.find('a')['href']
        u = urlparse.urlparse(_website)
        self.allowed_domains.append(u.netloc)

        yield Request(url=_website, callback=self.parse_secondary_site)

...
4

2 に答える 2

9

(この回答が書かれた瞬間、の最新バージョンはscrapyです1.0.3。この回答は、の最近のすべてのバージョンで機能しますscrapy

は、信号の処理中にプリコンパイル済みの正規表現オブジェクトを初期化するときOffsiteMiddlewareにのみコンテンツを読み取るため、 の値は後でアクセスされることはありません。 したがって、単にコンテンツを更新するだけでは問題は解決しません。allowed_domainsspider_openedallowed_domains
allowed_domains

基本的に、次の 2 つの手順が必要です。

  1. allowed_domains実際の必要に応じて の内容を更新します。
  2. 正規表現キャッシュをOffsiteMiddleware更新します。

ステップ#2で使用するコードは次のとおりです。

# Refresh the regex cache for `allowed_domains`
for mw in self.crawler.engine.scraper.spidermw.middlewares:
    if isinstance(mw, scrapy.spidermiddlewares.offsite.OffsiteMiddleware):
        mw.spider_opened(self)

上記のコードは、応答コールバック内で呼び出されることになっているため、selfここではスパイダー クラスのインスタンスになります。

以下も参照してください。

于 2015-10-08T06:01:00.913 に答える
1

次のようなことを試すことができます。

class APSpider(BaseSpider):
name = "APSpider"

start_urls = [
    "http://www.somedomain.com/list-of-websites",
]

def __init__(self):
    self.allowed_domains = None

def parse(self, response):
    soup = BeautifulSoup( response.body )

    if not self.allowed_domains:
        for link_tag in soup.findAll('td',{'class':'half-width'}):
            _website = link_tag.find('a')['href']
            u = urlparse.urlparse(_website)
            self.allowed_domains.append(u.netloc)

            yield Request(url=_website, callback=self.parse_secondary_site)

    if response.url in self.allowed_domains:
        yield Request(...)

...
于 2011-03-02T03:52:40.333 に答える