2016-03-24 34 views
0

コードソース:http://mherman.org/blog/2012/11/08/recursively-scraping-web-pages-with-scrapy/#rules 私はpythonとscrapyに新しいです。私は再帰的な蜘蛛を探して、これを見つけました。 Scrapyはルールとのすべてのリンクをクロールしますか?

は、私はいくつかの質問を持っている:

次のしくみを教えてください。ページからhrefリンクを取得してリクエストキューに追加するだけですか?

ウェブページのうち、どの部分が不正にクロールされますか?

以下のコードは、すべてのリンクをウェブページから削り取りますか?

http://downloads.trendnet.com/

このウェブサイトから、私はすべてのファイルをクロールし、ダウンロードしたいとしましょう、私はおそらくそれを行うだろう方法は、このウェブサイト上のすべてのリンクをこすりとURLのコンテンツヘッダをチェックし、それがファイルであればダウンロードすることです。これは実現可能ですか?

申し訳ありませんが、それは悪い質問....

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from craigslist_sample.items import CraigslistSampleItem 

class MySpider(CrawlSpider): 
    name = "craigs" 
    allowed_domains = ["sfbay.craigslist.org"] 
    start_urls = ["http://sfbay.craigslist.org/search/npo"] 

    rules = (
     Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//a[@class="button next"]',)), callback="parse_items", follow= True), 
    ) 

    def parse_items(self, response): 
     hxs = HtmlXPathSelector(response) 
     titles = hxs.xpath('//span[@class="pl"]') 
     items = [] 
     for titles in titles: 
      item = CraigslistSampleItem() 
      item["title"] = titles.xpath("a/text()").extract() 
      item["link"] = titles.xpath("a/@href").extract() 
      items.append(item) 
     return(items) 

答えて

0

であれば、私はRTFMがここに本当に適用されると思いますが、あなたの短い答え与える:与えられた例に関しては

rules = (
     Rule(SgmlLinkExtractor(allow=(), restrict_xpaths=('//a[@class="button next"]',)), callback="parse_items", follow= True), 
    ) 

あなたはそれがクロール何を尋ねました。あなたがルールの下でセットアップしたものだけをクロールします。つまり、あなたのロボットは毎回次のページだけをクロールします。見つかった各ページに対して、それは:callback = parse_itemsです。この場合には何parse_items

def parse_items(self, response): 
     hxs = HtmlXPathSelector(response) 
     titles = hxs.xpath('//span[@class="pl"]') 
     items = [] 
     for titles in titles: 
      item = CraigslistSampleItem() 
      item["title"] = titles.xpath("a/text()").extract() 
      item["link"] = titles.xpath("a/@href").extract() 
      items.append(item) 
     return(items) 

は、リストのエントリをチェックしています。あなたはxpath経由でリストを定義します(上記のようにtitles = hxs.xpath('//span[@class="pl"]')で見ることができます)。リスト内の各エントリ(すなわちfor titles in titles:)に対して、テキストとリンクをアイテムにコピーします。その後、アイテムを返します(これは完了です)。

Parse_itemsは、クローラが次のボタンを押して見つけたページごとに実行されます。

設定には、DEPTH_LIMIT=3を含めることができます。この場合、クロールスパイダーは3つだけ深くクロールします。あなたが投稿サイトに関して

何の複数のページが存在しないので、いいえ、あなたは、crawlspiderを必要としません。通常のベーススパイダーで十分です。しかし、クロールスパイダーは機能しますが、私は下にいくつかのビットを示します。ルールをrestrict_xpath( '// a'、)に設定すると、ページ上のすべてのリンクに従います。

item.pyにすべての必要な項目が含まれていることを確認してください。例えば、それは以下の項目["link"]を指します。あなたのitem.pyに、link(caps-sensitive)という項目が含まれていることを確認してください。つまり、line-link = Field() - があることを確認してください。 parse_itemsの下

、このような何か:あなたがする必要がある最後のビットがどのようにアイテムのパイプラインの作品をチェックしている

def parse_items(self, response): 
     list = response.xpath('//a"') 
     items = [] 
     for titles in list: 
      item = [INSERT WHATEVER YOU CALLED YOUR ITEM] 
      item["title"] = titles.xpath("/text()").extract() 
      item["link"] = titles.xpath("/@href").extract() 
      if ".pdf" in item["link"]: 
       SEE COMMENT BELOW 
     return(items) 

を。あなたのアイテムにfile_urlsなどを使用します。

関連する問題