@Alica

Как решить проблему при парсинге сайтов с помощью фреймворка Scrapy?

Добрый день! Я решаю следующую задачу: имеется архив новостей, например, www.fontanka.ru/fontanka/arc/news.html. Надо извлечь все статьи за все время и записать в базу данных. С помощью scrapy shell данную задачу мне удалось решить, но написать spider мне не получилось.
Когда я работаю в shell, часть программы выглядит следующим образом:
n = 0 #количество статей 
data = "/2013/02/13"
while(n <= 10000):
       fetch(site + data + "/news.html")
       list_site = sel.xpath('//a[contains(@class, pattern)]/@href')
       for i in list_site:
            #извлекаем содержимое i
            #записываем в базу данных
            n = n + 1
       data = #выбираем следующую дату

Как такую структуру организовать не используя shell? Была попытка использовать Request, но такой вложенности создать не удалось.
Заранее спасибо!
  • Вопрос задан
  • 2939 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Alica Автор вопроса
Проблему удалось решить с помощью python-библиотеки grab.
Ответ написан
Комментировать
ehles
@ehles
Я бы сделал это примерно так:
class my_spider(CrawlSpider):
    name = "fontanka"
    allowed_domains = ["fontanka.ru"]
    start_urls = ["http://www.fontanka.ru/fontanka/arc/news.html"]
    base_address = "http://www.fontanka.ru/"

    def parse(self, response):
        """
        Парсим стартовую страничку, 
        находим ссылки на другие странички        
        """
        for date in (date1, ....):
            # выбираем следующую дату
            site = self.base_address
            url = "%(site)s/%(date)s/news.html" % {
                "site": site,
                "date": date,
            }        
            request = Request(url, callback = self.parse_page)
            yield request

    def parse_page(self, response):
        """
        Парсим каждую загруженную страничку.
        """
        list_site = sel.xpath('//a[contains(@class, pattern)]/@href')
        for i in list_site:
            #извлекаем содержимое i
            #записываем в базу данных тут или в pipelines
            # http://doc.scrapy.org/en/latest/topics/item-pipeline.html


P.S. Рассмотрите вариант записи в БД через item pipeline
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы