2015-01-15 13 views
9

Scrapyを使用して特定のWebサイトからすべての外部リンクを取得したいと考えています。次のコードを使用すると、スパイダーは外部リンクもクロールします。Scrapyは、内部URLに従うだけですが、見つかったすべてのリンクを抽出します

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors import LinkExtractor 
from myproject.items import someItem 

class someSpider(CrawlSpider): 
    name = 'crawltest' 
    allowed_domains = ['someurl.com'] 
    start_urls = ['http://www.someurl.com/'] 

    rules = (Rule (LinkExtractor(), callback="parse_obj", follow=True), 
) 

    def parse_obj(self,response): 
    item = someItem() 
    item['url'] = response.url 
    return item 

何が欠けていますか? 「allowed_domains」は外部リンクがクロールされないようにしますか? LinkExtractorに "allow_domains"を設定すると、外部リンクが抽出されません。私は内部のリンクをクロールするのではなく、外部リンクを抽出することを忘れました。どのようなヘルプappriciated!

+0

)私の問題を解決しました。少なくとも、「フィルタリングされたオフサイト要求を「www.externaldomain」に見ることができます。確かに私はここで何か些細なことを忘れていますか? – sboss

+0

:理解してください:特定のウェブサイトのすべての外部リンクのリストを持っていますか? – aberna

+0

はい – sboss

答えて

9

作るだろう。

リンク抽出プログラムによってリンクがフィルタリングされます。この例では、リンクエクストラクタは許可されたドメイン内のリンクを拒否し、外部のリンクのみを取得します。

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors import LxmlLinkExtractor 
from myproject.items import someItem 

class someSpider(CrawlSpider): 
    name = 'crawltest' 
    allowed_domains = ['someurl.com'] 
    start_urls = ['http://www.someurl.com/'] 

    rules = (Rule(LxmlLinkExtractor(allow=()), callback='parse_obj', follow=True),) 


    def parse_obj(self,response): 
    for link in LxmlLinkExtractor(allow=(),deny = self.allowed_domains).extract_links(response): 
     item = someItem() 
     item['url'] = link.url 
3

ソリューションはまた、あなたは、各ページを解析されると、すべてのリンクを引っ張って、リンク抽出を使用することができ、ここでの使用SgmlLinkExtractor ドキュメントでprocess_link機能http://doc.scrapy.org/en/latest/topics/link-extractors.html

class testSpider(CrawlSpider): 
    name = "test" 
    bot_name = 'test' 
    allowed_domains = ["news.google.com"] 
    start_urls = ["https://news.google.com/"] 
    rules = (
    Rule(SgmlLinkExtractor(allow_domains=()), callback='parse_items',process_links="filter_links",follow= True) , 
    ) 

def filter_links(self, links): 
    for link in links: 
     if self.allowed_domains[0] not in link.url: 
      print link.url 

    return links 

def parse_items(self, response): 
    ### ... 
+0

@sboss私はあなたが受け入れたことに気付き、提案された解決策をダウングレードした後、コードはうまくいきましたか?他の問題に気付きましたか? – aberna

+0

こんにちはアバナ、ダウングレードを申し訳ありません。私は重複してフィルタを組み込んだなどを使用する私は回答をappriciate! – sboss

3

12Ryan12の答えに基づいて更新されたコード、

from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors.lxmlhtml import LxmlLinkExtractor 
from scrapy.item import Item, Field 

class MyItem(Item): 
    url= Field() 


class someSpider(CrawlSpider): 
    name = 'crawltest' 
    allowed_domains = ['someurl.com'] 
    start_urls = ['http://www.someurl.com/'] 
    rules = (Rule(LxmlLinkExtractor(allow=()), callback='parse_obj', follow=True),) 

    def parse_obj(self,response): 
     item = MyItem() 
     item['url'] = [] 
     for link in LxmlLinkExtractor(allow=(),deny = self.allowed_domains).extract_links(response): 
      item['url'].append(link.url) 
     return item 
-2

ピップは、-Uのscrapy をインストールし、私はOffsiteMiddlewareを有効にした場合、リンクがクロールされませんが、また抽出されません

関連する問題