1

CrawlSpider がサイト全体をクロールしないという問題が発生しています。ニュース サイトをクロールしようとしています。約 5900 個のアイテムを収集し、「終了」という理由で終了しますが、スクレイピングされたアイテムには日付の大きなギャップがあります。カスタムミドルウェアや設定は使用していません。助けてくれてありがとう!

私のスパイダー(一番下にある厄介なリストコードを許してください)とその後のログファイルの最後の行:

from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from news.items import NewsItem
import re

class CrawlSpider(CrawlSpider):
name = 'crawl'
allowed_domains = ['domain.com']
start_urls = ['http://www.domain.com/portal//']
rules = (
    Rule(SgmlLinkExtractor(allow=r'news/pages/.*|[Gg]et[Pp]age/.*'), callback='parse_item', follow=True),
)

def parse_item(self, response):
    p = re.compile(r"(%\d.+)|(var LEO).*|(createInline).*|(<.*?>|\r+|\n+|\s{2,}|\t|[\'])|(\xa0+|\xe2+|\x80+|\\x9.+)")
    hxs = HtmlXPathSelector(response)
    i = NewsItem()
    i['headline'] = hxs.select('//p[@class = "detailedArticleTitle"]/text()').extract()[0].strip().encode("utf-8")
    i['date'] = hxs.select('//div[@id = "DateTime"]/text()').re('\d+/\d+/[12][09]\d\d')[0].encode("utf-8")
    text = [graf.strip().encode("utf-8") for graf in hxs.select('//div[@id = "article"]//div[@style = "LINE-HEIGHT: 100%"]|//div[@id = "article"]//p//text()').extract()]
    text2 = ' '.join(text)
    text3 = re.sub("'", ' ', p.sub(' ', text2))
    i['text'] = re.sub('"', ' ', text3)
    return i

ログ出力:

2012-04-19 11:13:57-0700 [crawl] INFO: Closing spider (finished)
2012-04-19 11:13:57-0700 [crawl] INFO: Stored csv feed (5949 items) in: news.csv
2012-04-19 11:13:57-0700 [crawl] INFO: Dumping spider stats:
{'downloader/exception_count': 2,
 'downloader/exception_type_count/twisted.internet.error.ConnectionLost': 2,
 'downloader/request_bytes': 5778930,
 'downloader/request_count': 12380,
 'downloader/request_method_count/GET': 12380,
 'downloader/response_bytes': 635795595,
 'downloader/response_count': 12378,
 'downloader/response_status_count/200': 6081,
 'downloader/response_status_count/302': 6062,
 'downloader/response_status_count/400': 234,
 'downloader/response_status_count/404': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2012, 4, 19, 18, 13, 57, 343594),
 'item_scraped_count': 5949,
 'request_depth_max': 23,
 'scheduler/disk_enqueued': 12380,
 'spider_exceptions/IndexError': 131,
 'start_time': datetime.datetime(2012, 4, 19, 17, 16, 40, 75935)}
2012-04-19 11:13:57-0700 [crawl] INFO: Spider closed (finished)
2012-04-19 11:13:57-0700 [scrapy] INFO: Dumping global stats:
{}
4

1 に答える 1

0

メソッドparse_item()はロードされたアイテムを返す必要があります。スクレイピーのドキュメントを参照してください。 このようなもの:

class MySpider(CrawlSpider):
    name = 'crawl'
    allowed_domains = ['domain.com']
    start_urls = ['http://www.domain.com/portal/']
    rules = (Rule(SgmlLinkExtractor(allow=r'news/pages/.*|[Gg]et[Pp]age/.*'),
             callback='parse_item', follow=True))

    def parse_item(self, response):
        p = re.compile(r"(%\d.+)|(var LEO).*|(createInline).*|(<.*?>|\r+|\n+|\s{2,}|\t|[\'])|(\xa0+|\xe2+|\x80+|\\x9.+)")
        hxs = HtmlXPathSelector(response)
        i = NewsItem(selector=hxs)
        i.add_xpath('headline', '//p[@class = "detailedArticleTitle"]/text()')
        i.add_xpath('date', '//div[@id = "DateTime"]/text()', 
                    re=('\d+/\d+/[12][09]\d\d'))
        # Do something...
        return i.load_item()

後処理 ( や などstrip())encode("utf-8")は「パイプライン」で行うことができます。

更新:コードにはいくつかの誤りがあります:

  • カスタム スパイダー クラス名は継承クラス ( ) とは異なる必要があります。名前CrawlSpiderを変更してください (例: MySpider)
  • start_urls が正しくありません: ' http://www.domain.com/portal// ' と 2 つのスラッシュ
  • 良いスタイルは、セレクターの引数をNewsItemオブジェクト定義に設定することです ( i = NewsItem(selector=hxs))
于 2013-03-27T02:21:53.723 に答える