Форум программистов, компьютерный форум, киберфорум
XoFfiCEr
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Парсинг сайта ibash.org.ru

Запись от XoFfiCEr размещена 07.11.2012 в 00:18
Показов 9076 Комментарии 3
Метки python, парсинг

Иногда в свободное время хочется почитать что нибудь из (около)компьютерного юмора, например сайт ibash.org,ru. К сожалению у меня на работе нет интернета, а читать с мобильника дорого (ибо GPRS) и неудобно. В итоге я сделал простой скрипт на python который "выдирает" цитаты со всех страниц сайта ibash.org.ry выводит их на экран помещает в текстовый файл.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# (c) XoFfiCEr
import os, sys, codecs
if __name__ == "__main__":
    baseurl='http://ibash.org.ru/?page='                                  #базовый url
    qfile=os.getcwd()                                                            #путь к скрипту
    qfile=qfile+'/ibash_quotes.txt'                                           #путь к текстовому файлу
    qpages=2                                                                        #кол-во страниц
    qquotes=0                                                                       #количество цитат
    sep='------------------------------------------'                                    #разделитель цитат
    i=1                                                                                  #счетчик как всегда
    tfile=open(qfile, 'w')                                                           #открываем файл для записи 
    while i<=qpages:                                                               #проход по всем страницам
        curpage=baseurl+str(i)                                                   #высчитываем url-страницы
        from urllib2 import urlopen                                             #подготовка к 
        u = urlopen(curpage)                                                     #парсингу
        headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.13) Gecko/2009073022 Firefox/3.0.13 (.NET CLR 3.5.30729)',
                   'Host' : 'http://ibash.org.ru/',              
                   'Referer' : 'http://www.google.ru/url?sa=t&rct=j&q=ibash&source=web&cd=1&cad=rja&ved=0CDEQFjAA&url=http%3A%2F%2Fibash.org.ru%2F&ei=TE2ZUK-RHIjLswaEx4H4BA&usg=AFQjCNHWvoI4s2wqm_lhLlsx2yyRmY9rqQ',   # заголовки
                   'Connection' : 'close',                                         #реферер у нас
                   'Pragma' : 'no-cache',                                           #такой словно мы зашли из поиска гугла
                   'Cache-Control' : 'no-cache',                                 #пусть думают что хотят
                  }                                                                           #заголовки http
        for line in u:                                                                     #читаем построчно
            decoder = codecs.getdecoder('cp1251')                          #переводим
            encoder = codecs.getencoder('utf-8')                             #строку
            tline=encoder(decoder(line)[0])[0]                                   #в utf-8 из cp-1251
            if qpages==2:                                                              #если истинное количество страниц еще не определено
                sfrag=tline.find('Страницы:  1  <a href=')                   #метка которую мы должны найти
                if sfrag!=-1:                                                              #если метка найдена
                    qline=tline[:-19]                                                     #вырезаем хвост              
                    qline=qline[24:]                                                     #не трогать
                    qline=qline[-2:]                                                      #уже один раз изменил, блz
                    qpages=int(qline)                                                   #количество страниц в int
            sfrag=tline.find('<div class="quotbody">')                        #ищем тела цитат
            if sfrag!=-1:                                                                   #если заголовок quoybody найден
                tline=tline[24:-7]                                                         #вырезаем текст
                tline=tline.replace('<br />', '\n')                                    #заменяем
                tline=tline.replace('&lt;', '<')                                         #заменяем
                tline=tline.replace('&gt;', '>')                                        #заменяем
                tline=tline.replace('&nbsp;', ' ')                                     #заменяем
                tline=tline.replace('&quot;', '"')                                     #заменяем
                print tline                                                                   #печатаем цитату
                print sep                                                                    #печатаем разделитель
                tfile.write(tline)                                                           #записываем цитату в файл
                tfile.write('\n')                                                             #line feed carriage return
                tfile.write(sep)                                                            #записываем разделитель в файл
                tfile.write('\n')                                                              #line feed carriage return
                qquotes+=1                                                                #инкремент количества цитат 
        i+=1                                                                                   #инкремент счетчика
    tfile.flush()                                                                              #вытолкнем буферы
    tfile.close()                                                                             #закроем
    print '\n'
    print 'Количество страниц: ' + str(qpages)
    print 'Количество цитат: ' + str (qquotes)
В результате получился текстовый файл со всеми цитатами. Теперь я смогу читать оффлайн, просто открыв текстовый документ, а не браузер.
Метки python, парсинг
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 3
Комментарии
  1. Старый комментарий
    Аватар для soon
    Когда-то давно тоже писал граббер для топа баша. Правда, он валился на какой-то странице, но до нее все равно никто не дочитал. Работало до начала прошлого лета. А потом, вроде, на баше что-то поменяли, и просто так мне выдавать страницы с цитатами не захотели. Скорее всего, надо заголовники добавить, но допиливать мне лень.
    Python
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    #!/usr/bin/env python2
    # -*- coding: utf-8 -*-
     
    """
    Bash.im's top grabbing
    First param - out file(by default "quotes.txt")
    Second param - first page(by default "http://bash.im/byrating/1")
    """
     
    import sys, re, urllib
    from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup
     
    def get_quotes(f, p):
        max_page = 1
        if not re.match(ur"^(http://){0,1}bash.im/byrating/[1-9]\d{0,3}/?$", p):
            raise ValueError, "Incorrect web link"
        if "http://" not in p:
            p = "http://" + p
        page_num = re.search(ur"\d{1,3}/?", p)
        p = p.replace(page_num.group(), '')
        for page in range(int(page_num.group().replace('/', '')), max_page + 1):
            print "Processed page: ", page
            soup = BeautifulSoup(
                urllib.urlopen(p + str(page)).read(),
                fromEncoding = "utf-8"
            )
            print soup
            for quote_block in soup.findAll(u"div", {u"class" : u"quote"}):
                quote = str(quote_block).decode("utf8")
                quote_text = re.search(ur'<div class="text">.*</div>', quote);
                if quote_text:
                    text = quote_text.group()
                    text = text.replace(u'<div class="text">', u'')
                    text = text.replace(u"</div>", u'')
                    text = text.replace(u"<br />", u'\n')
                    text = BeautifulStoneSoup(text,convertEntities = \
                            BeautifulStoneSoup.HTML_ENTITIES).contents[0]
                    #text = text.replace(u"&lt;", u'<')
                    #text = text.replace(u"&gt;", u'>')
                    #text = text.replace(u"&quot;", u'"')
                    f.write(text.encode("utf8"))
                    f.write(u"\n\n")
     
    if __name__ == "__main__":
        file_name = u"quotes.txt" if len(sys.argv) < 2 else sys.argv[1]
        page = u"http://bash.im/byrating/1" if len(sys.argv) < 3 else sys.argv[2]
        try:
            with open(file_name, 'w') as f:
                try:
                    get_quotes(f, page)
                except ValueError:
                    print sys.exc_value
        except IOError:
            print u"Incorrect file name"
        except:
            print u"Unexpected error:", sys.exc_info()[0]
    Запись от soon размещена 07.11.2012 в 22:29 soon вне форума
  2. Старый комментарий
    Так это bash.im? Я вообще оттуда ничего не смог спарсить получаю 403 Forbidden.
    Запись от XoFfiCEr размещена 07.11.2012 в 22:42 XoFfiCEr вне форума
  3. Старый комментарий
    Аватар для soon
    Так это bash.im? Я вообще оттуда ничего не смог спарсить получаю 403 Forbidden.
    Да, я именно про это и говорил. С запросами особо не работал, поэтому предположил про заголовки.
    Запись от soon размещена 08.11.2012 в 05:38 soon вне форума
 
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 05.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 17.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru