3

これは私の作業コードです:

from scrapy.item import Item, Field

class Test2Item(Item):
    title = Field()

from scrapy.http import Request
from scrapy.conf import settings
from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule

class Khmer24Spider(CrawlSpider):
    name = 'khmer24'
    allowed_domains = ['www.khmer24.com']
    start_urls = ['http://www.khmer24.com/']
    USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22 AlexaToolbar/alxg-3.1"
    DOWNLOAD_DELAY = 2

    rules = (
        Rule(SgmlLinkExtractor(allow=r'ad/.+/67-\d+\.html'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        hxs = HtmlXPathSelector(response)
        i = Test2Item()
        i['title'] = (hxs.select(('//div[@class="innerbox"]/h1/text()')).extract()[0]).strip(' \t\n\r')
        return i

10 または 15 のレコードのみを破棄できます。常に乱数!http://www.khmer24.com/ad/any-words/67-anynumber.htmlのようなパターンを持つすべてのページを取得することはできません

リクエストが重複しているため、Scrapy がクロールを終了したのではないかと疑っています。彼らは使用することを提案しdont_filter = Trueましたが、コードのどこに配置すればよいかわかりません。

私は Scrapy の初心者で、本当に助けが必要です。

4

1 に答える 1

5

1.「彼らはdont_filter = Trueを使用することを提案しましたが、コードのどこに配置すればよいかわかりません。」

この引数は、CrawlSpider が継承する BaseSpider にあります。( Scrapy/spider.py ) デフォルトでは True に設定されています。

2.「10~15件しか廃棄できない」

理由: これは、start_urlsが適切でないためです。この問題では、スパイダーはhttp://www.khmer24.com/でクロールを開始し、10 個の URL を追跡すると仮定します (これらはパターンを満たしています)。そして、スパイダーはこれらの 10 個の URL をクロールし続けます。しかし、これらのページには満足のいくパターンがほとんど含まれていないため、スパイダーはいくつかの URL を取得し (URL がない場合でも)、クロールを停止します。

考えられる解決策: 上記の理由は、icecrimeの意見を言い換えているだけです。ソリューションも同様です。

  • 「すべての広告」ページをstart_urlsとして使用することを提案します。(ホームページをstart_urlsとして使用し、新しいrulesを使用することもできます。)

  • 新しいルール:

    rules = (
        # Extract all links and follow links from them 
        # (since no callback means follow=True by default)
        # (If "allow" is not given, it will match all links.)
        Rule(SgmlLinkExtractor()), 
    
        # Extract links matching the "ad/any-words/67-anynumber.html" pattern
        # and parse them with the spider's method parse_item (NOT FOLLOW THEM)
        Rule(SgmlLinkExtractor(allow=r'ad/.+/67-\d+\.html'), callback='parse_item'),
    )
    

参照: SgmlLinkExtractorCrawlSpider の例

于 2013-03-05T05:46:39.463 に答える