בית פורומים עצור כאן חושבים

גיבוי *תוכן* הפורום

שלום אורח. באפשרותך להתחבר או להירשם
הצג 15 הודעות בעמוד הוסף לדף האישי  דווח למנהל שלח לחבר
נשלח ב-21/4/2012 21:19 לינק ישיר 
גיבוי *תוכן* הפורום

  לאחרונה עלה עניין גיבוי תוכן הפורום, והתבקשתי לעזור.
   ישנן מספר תוכנות המאפשרות להוריד את כל דפי האתר ל"גלישה" מנותקת מהאינטרנט. תוכנות אלו אינן מבינות את תוכן הדפים; לכן הן שומרות כמויות גדולות של מידע לא רלוונטי (החדשות של בח"ח, איך לדווח על תוכן פוגעני, וכו'), ואינן מתאימות להעברת התוכן לפלטפורמה אחרת במקרה שיהיה צורך בכך. להלן תוכנה קצרה שכתבתי העושה זאת: הרצתה תשמור, עבור כל אשכול, קובץ המכיל בפורמט ברור את הודעות האשכול המנוקות בצירוף המחברים וזמני השליחה. תמונות מוטבעות יישמרו ג"כ, כ"א בקובץ משלה. הגיבוי ארך אצלי כשעה (תלוי בחומרה וברוחב הפס), ושמר 6370 אשכולות בחצי ג'יגה של דיסק (כולל התמונות).


# -*- coding: utf-8 -*-


import urllib
import urllib2
import re
import sys
import traceback
import itertools
import datetime
import time
import codecs
import os
import os.path
import multiprocessing


def _get_page(url):
    attempts = 20
    to = 60
    sleep = 60    
    for i in xrange(attempts):
        print 'retrieving', url, '...'
        try:
            resp = urllib2.urlopen(url, timeout = to)
            content = resp.read()
            print 'done'
            return unicode(content, 'windows-1255')
        except urllib2.URLError, e:
            sys.stderr.write('Failed to fetch %s: %s\n' % (url, str(e)))
            time.sleep(sleep)
    raise urllib2.URLError('Failed to fetch %s' % url)
    
    
def _get_res(url, fname):
    attempts = 20
    to = 240
    sleep = 60    
    for i in xrange(attempts):
        print 'retrieving', url, 'to', fname, '...'
        try:
            urllib.urlretrieve(url, fname)
            print 'done'
            return
        except urllib2.URLError, e:
            sys.stderr.write('Failed to fetch %s: %s\n' % (url, str(e)))
            time.sleep(sleep)
    sys.stderr.write('Failed to fetch %s\n' % url)


def _num_main_pages():
    url = 'http://www.bhol.co.il/forums/forum.asp?forum_id=1364'    
    content = _get_page(url)
    n = max([int(d) for d in _num_main_pages._main_pages_re.findall(content)])
    print 'altogether %d main pages' % n
    return n
_num_main_pages._main_pages_re = re.compile(ur'<option value="(\d+?)">', re.UNICODE)
    

def _text_to_clusters(text):
        return [(int(m[0]), m[1], m[2]) for m in _text_to_clusters._cluster_re.findall(text)]
_text_to_clusters._cluster_re = re.compile(ur'<a href="topic.asp\?.*?cat_id=24&topic_id=(\d+?)" class="par2" style="dir: rtl">(.+?)</a></span><br /><span class="par2" style="font-size:8pt;">&nbsp;&nbsp; מחבר: <a href="usercard.asp\?uid=.+?">(.+?)</a></span></td>', re.UNICODE)


def _main_page_clusters(page_num):
    url = 'http://www.bhol.co.il/forums/forum.asp?page=%d&forum_id=1364' % page_num
    try:
        cs = _text_to_clusters( _get_page(url) )
        print '%s clusters in %s' % (str([c[0] for c in cs]), url)
        return cs
    except Exception, e:
        sys.stderr.write('Failed to find clusters in %s\n' % url)
        raise
        
        
def _all_clusters():
    for page_num in xrange(1, 1 + _num_main_pages()):
        for (num, title, auth) in _main_page_clusters(page_num):
            yield (num, title, auth)


def _num_pages_in_cluster(content):
    found = [int(d) for d in _num_pages_in_cluster._pages_re.findall(content)]
    n = max(found) if found else 1
    print 'altogether %d pages' % n
    return n
_num_pages_in_cluster._pages_re = re.compile(ur'<option value=\'(\d+?)\'>', re.UNICODE)
    
    
_user_re = re.compile(
    ur'menubar\d+?\.addItem\("1", "(.+?)", "", "", true, null, "user\d+?"\);')


def _parse_seg(url, i, seg):
     auth = _user_re.search(seg).groups()[0]

     (day, month, year, hour, sec) = (int(i) for i in _parse_seg._sent_in_re.search(seg).groups())
     dt = datetime.datetime(year, month, day, hour, sec)

    for re in [_parse_seg._wo_title_msg_start_re, _parse_seg._w_title_msg_start_re]:
        m = re.search(seg)
        if m:
            seg = m.groups()[0]
             seg = seg[: seg.find(_parse_seg._msg_end)]                  
             _seg_res(seg)
            break
    else:
        sys.stderr.write('Failed to find segment in %s %d\n' % (url, i))
        seg = 'ERROR'
     
     return (auth, dt, seg)
_parse_seg._sent_in_re = re.compile(ur'<td align=\'right\' width=\'60%\' style=\'padding-right: 4px; font-size: 8pt; color: gray\'>נשלח ב-(\d+)/(\d+)/(\d+)&nbsp;(\d+):(\d+)</td>', re.UNICODE)
_parse_seg._w_title_msg_start_re = re.compile(ur'</u></b></font><br /><font size=\'2\'><b></b></font><p><font size=\'2\'>(.*)',
    re.UNICODE | re.DOTALL)
_parse_seg._wo_title_msg_start_re = re.compile(ur'<b>\s?<u>\s?</u>\s?</b>\s?</font>\s?<br\s?/>\s?<font size=\'2\'>\s?<b>\s?</b>\s?</font>\s?<p>\s?<font size=\'2\'>(.*)', re.UNICODE | re.DOTALL)
_parse_seg._msg_end = u'</font><br /></p><br><br><table width="100%"><tr><td align="left"><a align="left" href=":void(0);" =":openWindow2(\'report.asp?'


def _page_msgs(url, content):
    print 'parsing page messages %s' % url
    try:
        starts = [m.start() for m in _user_re.finditer(content)] + [len(content)]
        print 'found %d messages' % (len(starts) - 1)
        for (i, b, e) in itertools.izip(xrange(len(starts) - 1), starts[: -1], starts[1 :]):
            yield _parse_seg(url, i, content[b : e])
    except Exception, e:
        sys.stderr.write('Problem: %s in %s\n' % (url, str(e)))        
        traceback.print_exc(file = sys.stderr)
        raise


def _seg_res(content):
    for url in _seg_res._img_re.findall(content):
        m = _seg_res._shitty_convention_re.match(url)
        if not m:
            continue
        if m.groups()[0] != m.groups()[1]:
            continue
        fname = url.replace(':', '_colon_').replace(' ', '_space_').replace('/', '_slash_')
        _get_res(url, fname)
_seg_res._img_re = re.compile(ur'<img.*? src="(.+?)".*?/>', re.UNICODE)
_seg_res._shitty_convention_re = re.compile('.*_(.*)\.(.*)', re.UNICODE)


def _cluster_msgs(url):
    content = _get_page(url)    
    for i in xrange(1, 1 + _num_pages_in_cluster(content)):
        page_url = '%s?whichpage=%d&%s' % (url.split('?')[0], i, url.split('?')[1])
        if i > 1:        
            content = _get_page(page_url)
        for c in _page_msgs(page_url, content):
            yield c
            
            
def cluster_worker(q):
    sep = '@' * 80 + '\n'
    while True:
        num_title = q.get()
        if num_title is None:
            return
        num, title = num_title
            
        url ='http://www.bhol.co.il/forums/topic.asp?cat_id=24&topic_id=%d&forum_id=1364' % num
        fname = '%d.txt' % num
        f = codecs.open(fname, 'w', encoding = 'utf-8')
        try:
            f.write('%s\n%s' % (title, sep))
            f.write(title + '\n')
            for (auth, dt, seg) in _cluster_msgs(url):
                f.write('%s\n%s' % (auth, sep))
    
                f.write('%s\n%s' % (str(dt), sep))

                f.write('%s\n%s%s%s' % (seg, sep, sep, sep))
            f.close()
        except Exception, e:
            sys.stderr.write('Problem in %d: %s\n' % (num, str(e)))
            f.close()
            os.remove(fname)            
            
            
if __name__ == '__main__':
    num_workers = multiprocessing.cpu_count() * 8
    workers = []
    q = multiprocessing.Queue()
    for i in xrange(num_workers):
        w = multiprocessing.Process(target = cluster_worker, args = (q, ))
        w.start()
        workers.append(w)
    for (num, title, auth) in _all_clusters():
        q.put((num, title))
    for i in xrange(num_workers):
        q.put(None)
    for worker in workers:
        worker.join()
       
הוראות הרצה:
  1. מתקינים מפרשן פייתון. בחלונות כנראה יש לבחור את הMSI Installer
  2. מייצרים תיקיה חדשה, ושומרים את הקובץ שכאן בשם backup.py
  3. מריצים את הקובץ מתוך התיקיה. בחלונות, יש כנראה ללחוץ על "Start", ולכתוב cmd. בחלון הנפתח יש לעבור לתיקיה המתאימה, ולרשום משהו כמו c:\python27\python.exe backup.py



דווח על תוכן פוגעני

מנותק
נשלח ב-21/4/2012 21:22 לינק ישיר 
קוד מקור

מועבר בפרטי למיימוני.


תוקן על ידי xibolaiyu ב- 21/04/2012 21:27:30





דדווח על תוכן פוגעני

מנותק
נשלח ב-21/4/2012 21:22 לינק ישיר 

אני מרשה לעצמי להודות בשם כולם.



דדווח על תוכן פוגעני

מחובר
נשלח ב-21/4/2012 21:57 לינק ישיר 

מצטרף לברכות, תודה רבה ושכרך הרבה מאוד,



דדווח על תוכן פוגעני

מנותק
נשלח ב-21/4/2012 22:08 לינק ישיר 

תודה שיבולייהו תבורך. כמה שאלות/הערות ברשותך:

1. ראיתי שמופיע בקוד שלך הביטוי "cat_id=24" ואני מקווה ששמת לב שאמנם הקישורים מתוך העמודים הראשיים של הפורום לאשכולות כוללים ביטוי זה, אבל הקישורים בתור האשכולות עצמם לעמודים הבאים לאשכולות (אם אתה נגיד בעמ' 2 באשכול ורוצה לעבור לעמ' 3) לא כוללים את הביטוי הזה אלא רק את topic_id כך שאם לכאורה הקוד שלך שומר רק דפים שכוללים את cat_id=24 אז הוא ישמור רק את העמוד הראשון והאחרון בכל אשכול.

2. אני חושב שאפשר לשלב את הפרמטר PerPage=30 בשמות הדפים בתוך האשכול באופן שמקצר בחצי את מספר הדפים שיישמרו (30 עמודים לדף במקום ברירת המחדל של 15), כמו שאפשר לראות בקישור הבא:
3. איזו שורה צריך לשנות בקוד כדי לשמור טקסט בלבד להימנע משמירת תמונות?

4. יש לך איזה רעיון איך לגבות פורום סגור שמצריך Cookie והזנת שם וסיסמה כאן בפלטפורמה (הדבר היחיד שמצאתי זה תוכנת surfoffline 2.1 אבל היא מצליחה לשמור רק את העמוד הראשון והאחרון של כל אשכול)?

5. והערה לגבי דבריך על תוכנות: בעקרון עם הגדרות טובות לאחר ניסוי וטעייה הדבר המיותר היחיד ש-httrack שומרת זה דפים כפולים משולשים ומרובעים, ובכל זאת הגיבוי כנראה תופס 5 ג'יגה (בלי תמונות) כי הוא כולל את כל ה"זבל" העודף בדף ה-HTML.

בכל מקרה שוב תודה על הכל בשמי ובשם קוראי וכותבי הפורום לדורותיו.


תוקן על ידי אזנים_לכתל ב- 21/04/2012 22:25:31





דדווח על תוכן פוגעני

מנותק
נשלח ב-22/4/2012 04:56 לינק ישיר 

כמה הערות, האם כשיש קישור מאשכול לאשכול זה עובד?
בגבוי האחרון שעשיתי בעזרת התוכנה של אזניים, הוספתי את הקובץ אקסל שלך. מכיוון שהתוכנה בונה מחדש את הקישורים, יש אפשרות להגיע לכל נושא ישירות מהאקסל.
בנוסף לחיפוש נושאים לפי תאריך כתיבת תגובה האחרונה.



דדווח על תוכן פוגעני

מנותק
נשלח ב-22/4/2012 10:40 לינק ישיר 

אזנים_לכתל כתב:
תודה שיבולייהו תבורך. כמה שאלות/הערות ברשותך:
1. ראיתי שמופיע בקוד שלך הביטוי "cat_id=24" ואני מקווה ששמת לב שאמנם הקישורים מתוך העמודים הראשיים של הפורום לאשכולות כוללים ביטוי זה, אבל הקישורים בתור האשכולות עצמם לעמודים הבאים לאשכולות (אם אתה נגיד בעמ'
2 באשכול ורוצה לעבור לעמ' 3) לא כוללים את הביטוי הזה אלא רק את topic_id כך שאם לכאורה הקוד שלך שומר רק דפים שכוללים את cat_id=24 אז הוא ישמור רק את העמוד הראשון והאחרון בכל אשכול.
  אהלן,

  אצלי זה עובד קצת שונה: מהעמודים הראשיים מחלצים את האשכולות, ומהעמוד הראשון של כל אשכול מחלצים את עמודי האשכול. אינני כלל עובר על הקישורים הפנימיים (להבנתי, אין בכך צורך).

2. אני חושב שאפשר לשלב את הפרמטר 
PerPage=30 בשמות הדפים בתוך האשכול באופן שמקצר בחצי את מספר הדפים שיישמרו (30 עמודים לדף במקום ברירת המחדל של 15), כמו שאפשר לראות בקישור הבא:
http://www.bhol.co.il/forums/topic.asp?topic_id=2954263&PerPage=30

  כנראה שאתה צודק, אבל בסוף התוכנה שכתבתי מייצרת עמוד אחד פר אשכול בכל מקרה. מה שאתה אומר אולי (אינני בטוח) היה מקצר מעט את זמן הגיבוי, אבל הוא עומד גם כך על שעה, ולכן אינני בטוח האם זה קריטי. אגב, גם חשבתי להוסיף גיבוי אינקרמנטלי (מגבה רק מה שהתשנה מהקודם), אבל עבור שעה אינני בטוח שיש טעם.

3. איזו שורה צריך לשנות בקוד כדי לשמור טקסט בלבד להימנע משמירת תמונות?

  אפשר למחוק את שורה 105
_seg_res(seg,
או, לחלופין, פשוט להוסיף סולמית לתחילת השורה. כמובן שצריך בשביל זה את קוד המקור (שאותו העברתי למיימוני).


4. יש לך איזה רעיון איך לגבות פורום סגור שמצריך Cookie והזנת שם וסיסמה כאן בפלטפורמה (הדבר היחיד שמצאתי זה תוכנת surfoffline 2.1 אבל היא מצליחה לשמור רק את העמוד הראשון והאחרון של כל אשכול)?

  בסופו של דבר, כל פעולה שאתה עושה עם העכבר והעין, אפשר לעשות באופן אוטומטי. מה שכתבתי, לדוגמה, הוא פשוט הגרסה האוטומטית של אדם שעובר אשכול אחרי אשכול וקורא הודעה אחרי הודעה. באותו אופן, הזנת שם משתמש וסיסמה זה פשוט רצף של בתים שנשלח ומתקבל ע"י form כלשהו. אם תגיד לי באיזו שפה אתה כותב, אשתדל לבדוק איך לעשות זאת בה. תוכנות למניפולציות אתרים אינני מכיר כ"כ, צר לי.

5. והערה לגבי דבריך על תוכנות: בעקרון עם הגדרות טובות לאחר ניסוי וטעייה הדבר המיותר היחיד ש-httrack שומרת זה דפים כפולים משולשים ומרובעים, ובכל זאת הגיבוי כנראה תופס 5 ג'יגה (בלי תמונות) כי הוא כולל את כל ה"זבל" העודף בדף ה-HTML.

 בודאי, כל מה שעובד בסוף הוא מצויין, וכל הכבוד לך על העבודה עם httrak. עדיין, נראה לי שהיכולת להעביר את התוכן לפלטפורמה אחרת, אם יהיה צורך, מצריך משהו שיודע לחלץ את התוכן מתוך הHTML.

  כל טוב.



דדווח על תוכן פוגעני

מנותק
נשלח ב-22/4/2012 10:43 לינק ישיר 

תמיכה_טכני כתב:
כמה הערות, האם כשיש קישור מאשכול לאשכול זה עובד?

  שלום,

  מכיוון שרציתי לשחזר את תוכן האשכולות, לאו דווקא את הצגת הדפים, אז עשיתי זאת באופן שונה. הגיבוי אינו נזקק לקישורים הפנימיים.

בגבוי האחרון שעשיתי בעזרת התוכנה של אזניים, הוספתי את הקובץ אקסל שלך. מכיוון שהתוכנה בונה מחדש את הקישורים, יש אפשרות להגיע לכל נושא ישירות מהאקסל.
בנוסף לחיפוש נושאים לפי תאריך כתיבת תגובה האחרונה.

  מעולה. כל טוב.
 



דדווח על תוכן פוגעני

מנותק
נשלח ב-22/4/2012 10:57 לינק ישיר 

.


שיבולאיו - יש"כ.

אפשר שאלה טכנית של משתמש קצה?

התקנתי בחלונות לפי הוראותיך.

בעת נסיון להריץ, התקבלה הודעת שגיאה על שורה 100,
 for re in [_parse_seg._wo_title_msg_start_re, _parse

ההודעה היתה כי
IndentationError: Unindent does not match any outer indentation level

משהו שעשיתי שגוי?


נ.ב.
בחלונות, בשורת הפקודה, את שם הקובץ צריך להכניס למרכאות.






דדווח על תוכן פוגעני

מנותק
נשלח ב-22/4/2012 11:19 לינק ישיר 

שיבולייהו, רק למען הסר ספק, כששאלתי על גיבוי פורומים סגורים הכוונה שלי הייתה כמובן לפורומים שסוגרים שיש לי אליהם הרשאת גישה באמצעות סיסמה ושמנהליהם מעוניינים לבצע גיבוי (יש כאלה), לא למשהו בלתי חוקי או בלתי מורשה.

בנוגע לקוד, לא הבנתי למה אתה אומר שהקוד אצל מיימוני כשפרסמת את כולו כאן בפורום, האם יש איזשהו חלק מהקוד שלא פרסמת כאן ושבלעדיו התוכנה לא תעבוד?

שוב תודה.



דדווח על תוכן פוגעני

מנותק
נשלח ב-22/4/2012 11:50 לינק ישיר 

   מואדיב, אזניים_לכותל,

  לאחר שההודעה הראשונה - המכילה את הקוד - נשלחה, ראיתי שהאתר אוטומטית שינה את כל העימוד וההזחה של הקוד. בפייתון, ההזחה קובעת את המשמעות (ולכן הודעת השגיאה אצל מואדיב, לדוגמה). לכן שלחתי למיימוני את הקוד כקובץ מצורף לדוא"ל. אם יש אפשרות לצרף קובץ כאן להודעה - אשמח לעשות זאת (לא ראיתי אפשרות כזאת). אם לא, אפשר להעביר את הקובץ בדוא"ל (אישית מעדיף ממיימוני, אבל מי שירשום לי דוא"ל בפרטי, אשלח לו כשאכנס לאתר שוב).
  אזניים_לכותל - לא חשבתי שכוונתך היתה לפעולה לא חוקית.



דדווח על תוכן פוגעני

מנותק
נשלח ב-22/4/2012 15:04 לינק ישיר 

לגבי הפורומים הסגורים, אני מדבר למשל על הפורום כאן באתר "בחצרות החסידים" שמנהלו יהופיץ הסמיך אותי לטפל בגיבויו:



תוקן על ידי אזנים_לכתל ב- 22/04/2012 15:04:17




דדווח על תוכן פוגעני

מנותק
נשלח ב-22/4/2012 21:24 לינק ישיר 

אזנים_לכתל כתב:
לגבי הפורומים הסגורים, אני מדבר למשל על הפורום כאן באתר "בחצרות החסידים" שמנהלו יהופיץ הסמיך אותי לטפל בגיבויו:

תוקן על ידי אזנים_לכתל ב- 22/04/2012 15:04:17



http://stackoverflow.com/questions/189555/how-to-use-python-to-login-to-a-webpage-and-retrieve-cookies-for-later-usage

אבל בא נראה קודם שהגיבוי עובד לך לעצכ"ח.



דדווח על תוכן פוגעני

מנותק
נשלח ב-22/4/2012 22:07 לינק ישיר 

# -*- coding: utf-8 -*-


import urllib
import urllib2
import re
import sys
import traceback
import itertools
import datetime
import time
import codecs
import os
import os.path
import multiprocessing


def _get_page(url):
    attempts = 20
    to = 60
    sleep = 60    
    for i in xrange(attempts):
        print 'retrieving', url, '...'
        try:
            resp = urllib2.urlopen(url, timeout = to)
            content = resp.read()
            print 'done'
            return unicode(content, 'windows-1255')
        except urllib2.URLError, e:
            sys.stderr.write('Failed to fetch %s: %s\n' % (url, str(e)))
            time.sleep(sleep)
    raise urllib2.URLError('Failed to fetch %s' % url)
    
    
def _get_res(url, fname):
    attempts = 20
    to = 240
    sleep = 60    
    for i in xrange(attempts):
        print 'retrieving', url, 'to', fname, '...'
        try:
            urllib.urlretrieve(url, fname)
            print 'done'
            return
        except urllib2.URLError, e:
            sys.stderr.write('Failed to fetch %s: %s\n' % (url, str(e)))
            time.sleep(sleep)
    sys.stderr.write('Failed to fetch %s\n' % url)


def _num_main_pages():
    url = 'http://www.bhol.co.il/forums/forum.asp?forum_id=1364'    
    content = _get_page(url)
    n = max([int(d) for d in _num_main_pages._main_pages_re.findall(content)])
    print 'altogether %d main pages' % n
    return n
_num_main_pages._main_pages_re = re.compile(ur'<option value="(\d+?)">', re.UNICODE)
    

def _text_to_clusters(text):
        return [(int(m[0]), m[1], m[2]) for m in _text_to_clusters._cluster_re.findall(text)]
_text_to_clusters._cluster_re = re.compile(ur'<a href="topic.asp\?.*?cat_id=24&topic_id=(\d+?)" class="par2" style="dir: rtl">(.+?)</a></span><br /><span class="par2" style="font-size:8pt;">&nbsp;&nbsp; מחבר: <a href="usercard.asp\?uid=.+?">(.+?)</a></span></td>', re.UNICODE)


def _main_page_clusters(page_num):
    url = 'http://www.bhol.co.il/forums/forum.asp?page=%d&forum_id=1364' % page_num
    try:
        cs = _text_to_clusters( _get_page(url) )
        print '%s clusters in %s' % (str([c[0] for c in cs]), url)
        return cs
    except Exception, e:
        sys.stderr.write('Failed to find clusters in %s\n' % url)
        raise
        
        
def _all_clusters():
    for page_num in xrange(1, 1 + _num_main_pages()):
        for (num, title, auth) in _main_page_clusters(page_num):
            yield (num, title, auth)


def _num_pages_in_cluster(content):
    found = [int(d) for d in _num_pages_in_cluster._pages_re.findall(content)]
    n = max(found) if found else 1
    print 'altogether %d pages' % n
    return n
_num_pages_in_cluster._pages_re = re.compile(ur'<option value=\'(\d+?)\'>', re.UNICODE)
    
    
_user_re = re.compile(
    ur'menubar\d+?\.addItem\("1", "(.+?)", "", "", true, null, "user\d+?"\);')


def _parse_seg(url, i, seg):
     auth = _user_re.search(seg).groups()[0]

     (day, month, year, hour, sec) = (int(i) for i in _parse_seg._sent_in_re.search(seg).groups())
     dt = datetime.datetime(year, month, day, hour, sec)

    for re in [_parse_seg._wo_title_msg_start_re, _parse_seg._w_title_msg_start_re]:
        m = re.search(seg)
        if m:
            seg = m.groups()[0]
             seg = seg[: seg.find(_parse_seg._msg_end)]                  
             _seg_res(seg)
            break
    else:
        sys.stderr.write('Failed to find segment in %s %d\n' % (url, i))
        seg = 'ERROR'
     
     return (auth, dt, seg)
_parse_seg._sent_in_re = re.compile(ur'<td align=\'right\' width=\'60%\' style=\'padding-right: 4px; font-size: 8pt; color: gray\'>נשלח ב-(\d+)/(\d+)/(\d+)&nbsp;(\d+):(\d+)</td>', re.UNICODE)
_parse_seg._w_title_msg_start_re = re.compile(ur'</u></b></font><br /><font size=\'2\'><b></b></font><p><font size=\'2\'>(.*)',
    re.UNICODE | re.DOTALL)
_parse_seg._wo_title_msg_start_re = re.compile(ur'<b>\s?<u>\s?</u>\s?</b>\s?</font>\s?<br\s?/>\s?<font size=\'2\'>\s?<b>\s?</b>\s?</font>\s?<p>\s?<font size=\'2\'>(.*)', re.UNICODE | re.DOTALL)
_parse_seg._msg_end = u'</font><br /></p><br><br><table width="100%"><tr><td align="left"><a align="left" href=":void(0);" =":openWindow2(\'report.asp?'


def _page_msgs(url, content):
    print 'parsing page messages %s' % url
    try:
        starts = [m.start() for m in _user_re.finditer(content)] + [len(content)]
        print 'found %d messages' % (len(starts) - 1)
        for (i, b, e) in itertools.izip(xrange(len(starts) - 1), starts[: -1], starts[1 :]):
            yield _parse_seg(url, i, content[b : e])
    except Exception, e:
        sys.stderr.write('Problem: %s in %s\n' % (url, str(e)))        
        traceback.print_exc(file = sys.stderr)
        raise


def _seg_res(content):
    for url in _seg_res._img_re.findall(content):
        m = _seg_res._shitty_convention_re.match(url)
        if not m:
            continue
        if m.groups()[0] != m.groups()[1]:
            continue
        fname = url.replace(':', '_colon_').replace(' ', '_space_').replace('/', '_slash_')
        _get_res(url, fname)
_seg_res._img_re = re.compile(ur'<img.*? src="(.+?)".*?/>', re.UNICODE)
_seg_res._shitty_convention_re = re.compile('.*_(.*)\.(.*)', re.UNICODE)


def _cluster_msgs(url):
    content = _get_page(url)    
    for i in xrange(1, 1 + _num_pages_in_cluster(content)):
        page_url = '%s?whichpage=%d&%s' % (url.split('?')[0], i, url.split('?')[1])
        if i > 1:        
            content = _get_page(page_url)
        for c in _page_msgs(page_url, content):
            yield c
            
            
def cluster_worker(q):
    sep = '@' * 80 + '\n'
    while True:
        num_title = q.get()
        if num_title is None:
            return
        num, title = num_title
            
        url ='http://www.bhol.co.il/forums/topic.asp?cat_id=24&topic_id=%d&forum_id=1364' % num
        fname = '%d.txt' % num
        f = codecs.open(fname, 'w', encoding = 'utf-8')
        try:
            f.write('%s\n%s' % (title, sep))
            f.write(title + '\n')
            for (auth, dt, seg) in _cluster_msgs(url):
                f.write('%s\n%s' % (auth, sep))
    
                f.write('%s\n%s' % (str(dt), sep))

                f.write('%s\n%s%s%s' % (seg, sep, sep, sep))
            f.close()
        except Exception, e:
            sys.stderr.write('Problem in %d: %s\n' % (num, str(e)))
            f.close()
            os.remove(fname)            
            
            
if __name__ == '__main__':
    num_workers = multiprocessing.cpu_count() * 8
    workers = []
    q = multiprocessing.Queue()
    for i in xrange(num_workers):
        w = multiprocessing.Process(target = cluster_worker, args = (q, ))
        w.start()
        workers.append(w)
    for (num, title, auth) in _all_clusters():
        q.put((num, title))
    for i in xrange(num_workers):
        q.put(None)
    for worker in workers:
        worker.join()


תוקן על ידי אזנים_לכתל ב- 22/04/2012 22:09:05




דדווח על תוכן פוגעני

מנותק
נשלח ב-22/4/2012 22:09 לינק ישיר 

נראה לי שכעת הקוד מוזח כהלכה.



דדווח על תוכן פוגעני

מנותק
נשלח ב-22/4/2012 22:42 לינק ישיר 

הקוד שפרסמת כאן, גם בגרסה המוזחת שלי, נותן אותה הודעת שגיאה כמו של מואדיב.הקוד ששלחת לי במייל עובד, ניסיתי אותו על פורום "אגודה אחת" (קטן פי 20 מהפורום הזה), הוא אכן מייצר קובצי טקסט לכל אשכול, הם כוללים הרבה "לכלוך" אבל גם את כל הטקסט של האשכולות. מה שכן, אי אפשר לפתוח אותם כ-HTML או לפחות אני לא הצלחתי כך שזה גיבוי די "מכוער" ו"מסורבל", גם שמות הקבצים לא כוללים את שם האשכול.מה שצריך לדעתי זה איזשהו אינדקס שמבוסס על העמודים הראשיים של הפורום.בכל אופן תודה רבה שיבולייהו!

התיקון שהצעת כדי לבטל שמירת תמונות עובד גם כן.

תוקן על ידי אזנים_לכתל ב- 22/04/2012 22:53:10



תוקן על ידי אזנים_לכתל ב- 22/04/2012 22:54:12





דדווח על תוכן פוגעני

מנותק
   
בית > פורומים > דת ואמונה > עצור כאן חושבים > גיבוי *תוכן* הפורום
מנהל לחץ כאן לנעילת האשכול
הוסף לעמוד האישי  דווח למנהל שלח לחבר
1 2 לדף הבא סך הכל 2 דפים.

bholext