web-dev-qa-db-fra.com

Scrapy, ne suivez que les URL internes mais extrayez tous les liens trouvés

Je veux obtenir tous les liens externes d'un site Web donné en utilisant Scrapy. En utilisant le code suivant, l'araignée explore également les liens externes:

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

Qu'est-ce que je rate? Le "domaine_autorisé" n'empêche-t-il pas l'analyse des liens externes? Si je mets "allow_domains" pour LinkExtractor, il n'extrait pas les liens externes. Juste pour clarifier: je ne veux pas explorer les liens internes mais extraire les liens externes. Toute aide appréciée!

16
sboss

Vous pouvez également utiliser l'extracteur de liens pour extraire tous les liens une fois que vous avez analysé chaque page.

L'extracteur de liens filtrera les liens pour vous. Dans cet exemple, l'extracteur de liens refusera les liens dans le domaine autorisé afin de n'obtenir que des liens externes.

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
13
12Ryan12

Un code mis à jour basé sur la réponse de 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
5
Ohad Zadok

Une solution serait de faire de l'utilisation une fonction process_link dans la documentation SgmlLinkExtractor ici 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):
        ### ...
3
aberna