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

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

Запись от XoFfiCEr размещена 07.11.2012 в 00:18
Показов 9268 Комментарии 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 вне форума
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru