2015-01-15 1 views
9

Я хочу получить все внешние ссылки с данного сайта с помощью Scrapy. Используя следующий код, паук также сканирует внешние ссылки: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» обходить внешние ссылки? Если я устанавливаю «allow_domains» для LinkExtractor, он не извлекает внешние ссылки. Просто уточнить: я не сканирую внутренние ссылки, но извлекаю внешние ссылки. Любая помощь appriciated!

+0

Если я включаю OffsiteMiddleware ссылки не пополз, но и не извлеченное. По крайней мере, тогда я могу увидеть «Отфильтрованный внешний запрос на« 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

Решения будет сделать Usage функцию process_link в 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

Привет, abbera, извините за понижение. Я нашел 12Ryan12: s ответ более элегантный, поскольку он позволяет мне использовать встроенные дубликаты фильтров и т. д. Я утверждаю ответ, хотя! – 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 

 Смежные вопросы

  • Нет связанных вопросов^_^