2012-12-06 12 views
5

私の最初の質問はここに:)ウェブページのすべてのリンクを詐欺でクロールしようとしています。しかし、私はページ上のリンクを出力することはできません

私はそこにある可能性のあるすべてのWebページのために私の学校のウェブサイトをクロールしようとしていた。しかし、私はテキストファイルへのリンクを取得することはできません。私は正しい権限を持っているので、問題はありません。

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.item import Item 
from scrapy.spider import BaseSpider 

class hsleidenSpider(CrawlSpider): 
     name = "hsleiden1" 
     allowed_domains = ["hsleiden.nl"] 
     start_urls = ["http://hsleiden.nl"] 

     # allow=() is used to match all links 
     rules = [ 
     Rule(SgmlLinkExtractor(allow=()), follow=True), 
     Rule(SgmlLinkExtractor(allow=()), callback='parse_item') 
     ] 

     def parse_item(self, response): 
       x = HtmlXPathSelector(response) 

       filename = "hsleiden-output.txt" 
       open(filename, 'ab').write(response.url) 

私はhsleiden.nlページのみをスキャンしています。そして、response.urlをテキストファイルhsleiden-output.txtに入れたいと思います。

これを行う方法はありますか?

+0

あなたの問題について具体的にご説明ください。何が起こると思いますか?代わりに何が起こっていますか? – Sheena

+0

コードを借りたいと思ったら、どうすればいいですか? –

答えて

1

CrawlSpiderのドキュメントを参照すると、複数のルールが同じリンクに一致する場合、最初のものだけが使用されます。

したがって、リダイレクトの結果として、最初のルールを使用すると、一見無限ループになります。 2番目のルールは無視されるため、一致するリンクはparse_itemコールバックに渡されません。これは出力ファイルがないことを意味します。

いくつかの調査は、リダイレクトの問題を修正するために(そして、それは第二と衝突しないように、最初のルールを変更するために)必要ですが、それを完全にコメントアウトすると、そのようなリンクの出力ファイルを生成します:

http://www.hsleiden.nl/activiteitenkalenderhttp://www.hsleiden.nlhttp://www.hsleiden.nl/vind-je-studie/proefstuderenhttp://www.hsleiden.nl/studiumgenerale

など

あなたは改行文字またはセパレータにあなたが出力ファイルに書き込むたびに、追加したい場合がありますので、これらはすべて、単一の行にまとめてマングドました。

+0

Thxの仲間、私のために働く。また、あなたの解決策 '\ n'も出力に固定されています。 –

関連する問題