Каков наилучший способ очистить несколько доменов с помощью скрапа? - PullRequest
4 голосов
/ 31 марта 2011

У меня есть около 10 странных сайтов, с которых я хотел бы почистить.Несколько из них - блоги WordPress, и они следуют той же самой структуре HTML, хотя и с различными классами.Остальные - форумы или блоги других форматов.

Информация, которую я люблю просматривать, является обычной: содержание сообщения, метка времени, автор, заголовок и комментарии.

Мой вопросмне нужно создать один отдельный паук для каждого домена?Если нет, то как я могу создать универсального паука, который позволяет мне очищать, загружая параметры из файла конфигурации или чего-то подобного?

Я подумал, что мог бы загрузить выражения xpath из файла, местоположение которого можно загрузить через командную строкуно, похоже, возникают некоторые трудности, когда для очистки некоторого домена требуется использование регулярного выражения select(expression_here).re(regex), а для некоторых - нет.

Ответы [ 5 ]

1 голос
/ 25 ноября 2013

Ну, я столкнулся с той же проблемой, поэтому я создал класс паука динамически, используя type(),

from scrapy.contrib.spiders import CrawlSpider
import urlparse

class GenericSpider(CrawlSpider):
    """a generic spider, uses type() to make new spider classes for each domain"""
    name = 'generic'
    allowed_domains = []
    start_urls = []

    @classmethod
    def create(cls, link):
        domain = urlparse.urlparse(link).netloc.lower()
        # generate a class name such that domain www.google.com results in class name GoogleComGenericSpider
        class_name = (domain if not domain.startswith('www.') else domain[4:]).title().replace('.', '') + cls.__name__
        return type(class_name, (cls,), {
            'allowed_domains': [domain],
            'start_urls': [link],
            'name': domain
        })

Так сказать, чтобы создать паука для 'http://www.google.com' Я просто сделаю -

In [3]: google_spider = GenericSpider.create('http://www.google.com')

In [4]: google_spider
Out[4]: __main__.GoogleComGenericSpider

In [5]: google_spider.name
Out[5]: 'www.google.com'

Надеюсь, это поможет

1 голос
/ 24 декабря 2011

Вы можете использовать пустой атрибут allowed_domains, чтобы указывать scrapy не фильтровать какие-либо сторонние запросы.Но в этом случае вы должны быть осторожны и возвращать только соответствующие запросы от вашего паука.

1 голос
/ 04 июня 2011

Я делаю то же самое, используя следующие выражения XPath:

  • '/html/head/title/text()' для заголовка
  • //p[string-length(text()) > 150]/text() для содержимого сообщения.
1 голос
/ 11 июня 2011

В scrapy spider установите для allow_domains список доменов, например:

class YourSpider(CrawlSpider):    
   allowed_domains = [ 'domain1.com','domain2.com' ]

надеюсь, это поможет

0 голосов
/ 01 апреля 2011

Вам следует использовать BeautifulSoup, особенно если вы используете Python.Позволяет находить элементы на странице и извлекать текст с помощью регулярных выражений.

...