2015-01-15 10 views
9

सभी लिंक निकालें, मैं स्केपर का उपयोग करके किसी दिए गए वेबसाइट से सभी बाहरी लिंक प्राप्त करना चाहता हूं। निम्नलिखित कोड का उपयोग करके स्पाइडर बाहरी लिंक भी क्रॉल करता है:स्क्रैप, केवल आंतरिक यूआरएल का पालन करें, लेकिन

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 

मुझे क्या याद आ रही है? क्या "अनुमति_डोमेन" बाहरी लिंक को क्रॉल करने से नहीं रोकता है? अगर मैं LinkExtractor के लिए "allow_domains" सेट करता हूं तो यह बाहरी लिंक निकालने नहीं करता है। बस स्पष्ट करने के लिए: मैं आंतरिक लिंक क्रॉल नहीं करना चाहता लेकिन बाहरी लिंक निकालना चाहता हूं। किसी भी मदद की सराहना की!

+0

हल किया। कम से कम तब मैं "www.externaldomain 'के लिए फ़िल्टर किए गए ऑफसाइट अनुरोध को देख सकता हूं। निश्चित रूप से मुझे यहां कुछ मामूली याद आ रही है? – sboss

+0

बस समझने के लिए: क्या आप किसी दिए गए वेबसाइट के लिए सभी बाहरी लिंक की सूची चाहते हैं? – aberna

+0

हां सही है! – sboss

उत्तर

9

तुम भी एक बार आप प्रत्येक पृष्ठ को पार्स कर रहे हैं सभी लिंक खींचने के लिए लिंक निकालने का उपयोग कर सकते उपयोग एक process_link कार्य करना होगा।

लिंक निकालने वाला आपके लिए लिंक फ़िल्टर करेगा। इस उदाहरण में लिंक निकालने वाले स्वीकृत डोमेन में लिंक अस्वीकार कर देगा, इसलिए यह केवल बाहरी लिंक प्राप्त करता है।

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 प्रलेखन यहाँ 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

हाय अर्नना, डाउनग्रेड के लिए खेद है। मुझे 12Ryan12: उत्तर मिला है क्योंकि यह अधिक सुरुचिपूर्ण है मैं निर्मित डुप्लिकेट फिल्टर आदि का उपयोग करने के लिए। हालांकि मैं जवाब की सराहना करता हूं! – 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

स्थापित पिप यू scrapy अगर मैं OffsiteMiddleware लिंक क्रॉल नहीं कर रहे हैं लेकिन यह भी निकाला नहीं सक्षम मेरी समस्या)

संबंधित मुद्दे