Очистить alexa и показать результаты в таблице в django

Я хочу создать простое (одностраничное) веб-приложение с использованием Django и просмотреть 20 лучших веб-сайтов с alexa.com/topsites/global. Страница должна отображать таблицу с 21 строкой (1 заголовок и 20 веб-сайтов) и 3 столбцами (рейтинг, веб-сайт и описание).

Мои знания об использовании django ограничены, и мне действительно нужна помощь, если это возможно.

Я использовал шаблон для создания таблицы с помощью некоторого бутстрапа, но на самом деле я понятия не имею, как анализировать: рейтинг/имя веб-сайта/и описание.

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

Я знаю, что мне нужно использовать HTMLParser и реализовать что-то вроде:

from HTMLParser import HTMLParser

# create a subclass and override the handler methods
class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print "Encountered a start tag:", tag
    def handle_endtag(self, tag):
        print "Encountered an end tag :", tag
    def handle_data(self, data):
        print "Encountered some data  :", data

# instantiate the parser and fed it some HTML
parser = MyHTMLParser()
parser.feed('<html><head><title>Test</title></head>'
            '<body><h1>Parse me!</h1></body></html>')

Но я не знаю, как использовать его в своих требованиях в моем приложении.


Итак, я возвращаюсь с обновлением. Я пытался сделать это (просто распечатать результаты, чтобы посмотреть, получу ли я то, что хочу), но я получаю только некоторые ссылки.

Любая помощь ?

import urllib2, HTMLParser

class MyHTMLParser(HTMLParser.HTMLParser):
    def reset(self):
        HTMLParser.HTMLParser.reset(self)
        #count div to get the rank of website
        self.in_count_div = False
        #description div to get description of website
        self.in_description_div = False
        #a tag to get the url
        self.in_link_a = False

        self.count_items = None
        self.a_link_items = None
        self.description_items = None

    def handle_starttag(self, tag, attrs):
        if tag == 'div':
            if('class', 'count') in attrs:
                self.in_count_div = True

        if tag == 'a':
            for name, value in attrs:
                if name == 'href':
                    self.a_link_items = [value,'']
                    self.in_link_a = True
                    break

        if tag == 'div':
            if('class', 'description') in attrs:
                self.in_description_div = True

    #handle data for each section
    def handle_data_count(self, data):
        if self.in_count_div:
            self.count_items[1] += data

    def handle_data_url(self, data):
        if self.in_link_a:
            self.a_link_items[1] += data

    def handle_data_description(self, data):
        if self.in_description_div:
            self.description_items[1] += data

    #endtag
    def handle_endtag(self, tag):
        if tag =='div':
            if self.count_items is not None:
                print self.count_items
            self.count_items = None
            self.in_count_div = False

        if tag =='a':
            if self.a_link_items is not None:
                print self.a_link_items
            self.a_link_items = None
            self.in_link_a = False


if __name__ == '__main__':
    myhtml = MyHTMLParser()
    myhtml.feed(urllib2.urlopen('http://www.alexa.com/topsites/global').read())

person Cajuu'    schedule 28.03.2015    source источник


Ответы (3)


Если вам нужен API, для Alexa есть здесь

Если вы хотите слишком много парсинга, я бы посоветовал BeautifulSoup
(скрейпинг слишком тяжел для этого, так как единственное, что вы будете делать, это читать с одного URL-адреса.)

Сделать это просто:

  • Создайте модуль Python, который занимается извлечением данных из ссылки Alexa с помощью BeautifulSoup, в модуле сделайте так, чтобы он запускал задачу каждые 5 минут или в любой промежуток времени, с которым ваше приложение будет эффективным, а затем сохраните его в своей базе данных.
  • Чтобы отобразить данные, вы должны получить их из базы данных, а затем передать их в шаблон в переменной шаблона, и html должен выглядеть примерно так (не используйте таблицы):
<table>
    {% for site in top_20_sites %}
    <tr>
        <td>{{site.rank}}</td>
        <td>{{site.name}}</td>
        <td>{{site.description}}</td>
    <\tr>
    {% endfor %}
</table>

О том, как парсить, смотрите этот замечательный учебник здесь

person HassenPy    schedule 28.03.2015
comment
Поскольку вы новичок в django, я предлагаю вам пройти это руководство: tangowithdjango.com/book17 - person HassenPy; 28.03.2015
comment
Необходимо добавить эту информацию в базу данных? Или я могу получать его каждые 5 минут с веб-сайта? Допустим, у меня есть список для site.rank , один для site.name и один для site.descrpition. Я пройдусь по каждому элементу с помощью цикла for и занесу информацию в таблицу. Это возможно ? - person Cajuu'; 28.03.2015
comment
Я пробовал кое-что. Не могли бы вы вести меня в правильном направлении? Спасибо :) Я не хочу использовать BeautifulSoup. - person Cajuu'; 29.03.2015
comment
Вы можете сделать так, чтобы парсинг запускался каждый раз, когда пользователь заходит на вашу страницу, но в большинстве случаев это будет ненужным, а также потребляющим ресурсы. Вы можете установить менее 5 минут, это зависит от требований приложения. Я взглянул на страницу Alexa, вы должны найти элемент <li> с class="site-listing" , вложенный в этот ‹li›, вы найдете div описания с class="description" и div с class=desc-paragraph, содержащий тег привязки ‹a› с URL. - person HassenPy; 29.03.2015

Если вы выполните быстрый поиск в Google, вы найдете кучу вопросов SO о том, как использовать модуль HTMLParser. Помимо результатов, эти 2 вопроса кажутся относящимися к тому, что вы пытаетесь сделать (извлечь определенные теги):

Но, как следует из другого ответа выше, вы сэкономите много работы, используя такую ​​​​библиотеку, как BeautifulSoup, для анализа и извлечения тегов:

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

person kchan    schedule 28.03.2015

Почему бы вам не создать сканер с помощью Scrapy, настроить его запуск каждый день, сохранить данные в своей базе данных и создать сайт с Django, который показывает последние результаты. Все на Питоне.

person Jaakko    schedule 28.03.2015
comment
Потому что я хочу учиться так, как я просил. Я ищу не решение, а конкретное. - person Cajuu'; 28.03.2015