2011-12-16 8 views
6

私はCrawlSpiderには、以下の特定のリンクを設定し、各問題へのリンクは、以下のURLスキームに従うニュース雑誌こすりありますScrapyは以下とスクレーピング非許可リンク

http://example.com/YYYY/DDDD/index.htm YYYYは年で、 DDDDは、3桁または4桁の発行番号です。

私は928以降の問題のみを希望し、私のルールは以下の通りです。サイトに接続したり、リンクをクロールしたり、アイテムを抽出するのに問題はありません(私はコードの残りの部分を含めませんでした)。スパイダーは許可されていないリンクに続くと判断されたようです。問題377,398などを掻き取ろうとしており、 "culture.htm"と "feature.htm"のリンクに続いています。これは多くのエラーを発生させ、非常に重要ではありませんが、データの大量のクリーニングが必要です。何がうまくいかないかについての示唆はありますか?

class crawlerNameSpider(CrawlSpider): 
name = 'crawler' 
allowed_domains = ["example.com"] 
start_urls = ["http://example.com/issues.htm"] 

rules = (
     Rule(SgmlLinkExtractor(allow = ('\d\d\d\d/(92[8-9]|9[3-9][0-9]|\d\d\d\d)/index\.htm',)), follow = True), 
     Rule(SgmlLinkExtractor(allow = ('fr[0-9].htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('eg[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('ec[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('op[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('sc[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('re[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('in[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(deny = ('culture.htm',)),), 
     Rule(SgmlLinkExtractor(deny = ('feature.htm',)),), 
    ) 

編集:私は2009年、2010年、2011 FOTはるかに単純な正規表現を使用して、これを固定しますが、誰もが何か提案を持っている場合は、上記の動作しませんなぜ私はまだ興味があります。

答えて

8

deny引数を渡すと、followへのリンクが収集されます。そして、1つの関数parse_itemを呼び出すと、多くのものを作成する必要はありません。Rule私はあなたのコードを記述します。それはあなたがparse_itemに使用されているルールで、実際のURLパターンをだ

rules = (
     Rule(SgmlLinkExtractor(
        allow = ('\d\d\d\d/(92[8-9]|9[3-9][0-9]|\d\d\d\d)/index\.htm',), 
        deny = ('culture\.htm', 'feature\.htm'), 
        ), 
      follow = True 
     ), 
     Rule(SgmlLinkExtractor(
       allow = (
        'fr[0-9].htm', 
        'eg[0-9]*.htm', 
        'ec[0-9]*.htm', 
        'op[0-9]*.htm', 
        'sc[0-9]*.htm', 
        're[0-9]*.htm', 
        'in[0-9]*.htm', 
        ) 
       ), 
       callback = 'parse_item', 
     ), 
    ) 

場合、それはこのように単純化することができます。

Rule(SgmlLinkExtractor(
       allow = ('(fr|eg|ec|op|sc|re|in)[0-9]*\.htm',), 
       callback = 'parse_item', 
     ), 
) 
+0

ファンタスティック。助けてくれてありがとう! – Trey

関連する問題