1

この同じコードは、イエローブックを問題なく、期待どおりにクロールします。ルールを CL に変更すると、最初の URL にヒットした後、関連する出力がないままぐらつきます。

from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from craigs.items import CraigsItem

class MySpider(CrawlSpider):
        name = "craigs"
        allowed_domains = ["craiglist.org"]

        start_urls = ["http://newyork.craigslist.org/cpg/"]

        rules = [Rule(SgmlLinkExtractor(restrict_xpaths=('/html/body/blockquote[3]/p/a',)), follow=True, callback='parse_profile')]

        def parse_profile(self, response):
                found = []
                img = CraigsItem()
                hxs = HtmlXPathSelector(response)
                img['title'] = hxs.select('//h2[contains(@class, "postingtitle")]/text()').extract()
                img['text'] = hxs.select('//section[contains(@id, "postingbody")]/text()').extract()
                img['tags'] =  hxs.select('//html/body/article/section/section[2]/section[2]/ul/li[1]').extract()

                print found[0]
                return found[0]

出力は次の とおりですhttp://pastie.org/6087878 ご覧のとおり、最初の URL をクロールする http://newyork.craigslist.org/mnh/cpg/3600242403.html> を取得するのに問題はありませんが、その後停止します。

CLI を使用して、この SgmlLinkExtractor(restrict_xpaths=('/html/body/blockquote[3]/p/a',)).extract_links(response) with xpaths またはキーワード SgmlLinkExtractor(allow=r') のようなすべてのリンクをダンプできます。 /cpg/.+').extract_links(応答)
出力 -> http://pastie.org/6085322

ただし、クロールでは、同じクエリが失敗します。なに?

4

1 に答える 1

3

ドキュメントを見ると、次のように表示されます。

allowed_domainsこのスパイダーがクロールを許可されているドメインを含む文字列のオプションのリスト。OffsiteMiddlewareが有効になっている場合、このリストで指定されたドメイン名に属していないURLの要求は実行されません。

許可されたドメインは

 allowed_domains = ["craiglist.org"]

しかし、あなたはサブドメインをフェッチしようとしています

02-07 15:39:03+0000 [craigs] DEBUG: Filtered offsite request to 'newyork.craigslist.org': <GET http://newyork.craigslist.org/mnh/cpg/3600242403.html>

それがフィルタリングされる理由です

allowed_domainsフィルタリングされたオフサイトリクエストを回避するために、クローラーから適切なドメインを追加することを削除します

于 2013-02-08T07:12:51.017 に答える