סריקת אתר וזיהוי שינויים בנושא מסויים
-
שלום!
אנימעדיין בור למדי בתחום ורק יודע בסיס של js. מ"מ אין לימוד יותר טוב מלנסות בפועל.הבעיה. שאין לי מושג מהיכן להתחיל.. איך קוראים למה שאני צריך. אשמח לעזרתכם.
אני מעוניין לכתוב תוכנה זו:
תרוץ כל הזמן על השרת. באחסון אתרים שרכשתי. (ואם זה לא אפשרי- אז על המחשב שלי בלבד. בזמן שפועל)
תבדוק כל כמה דקות אתר מסויים. (פורום) ואם פורסמה הודעה חדשה בנושא ספציפי שאני מתענין בו-
תשלח לי מייל.מי שיודע לתת קצה חוט - יבורך.
רצוי בעקרונות כללים ולא דווקא דוגמאות קוד בשפה ספציפית. (האחסון שרכשתי לא תומך בc#. זה באחסון של בלוהוסט הכי פשוט. נועד לphp וכו')
וסליחה אם אני כותב הבלים... אני מנסה ללמוד.
תודה לכולכם!
פורסם במקור בפורום CODE613 ב20/02/2017 09:45 (+02:00)
-
שלום אליעזר, אתה מכוון די גבוה.
להלן רשימת חברות לדוגמא שמתמודדות עם מה שאתה רוצה לעשות (לאו דווקא בהצלחה גדולה):
גוגל
פייסבוק
אמזון
מייקרוסופט
לינקדאין
טוויטר
ועוד רשימה ארוכה מאוד.
כל אחת מהם שווה מעל עשרה מיליארד דולר.בגדול תוכנה זאת לא הבעיה, אתה יכול לכתוב קוד שסורק אתרי אינטרנט (קוראים לזה "זחלן") ויש הרבה כאלו בגיט האב בכל מיני שפות (אני ממליץ על פייתון, שם זה מאוד מפותח).
הבעיה הגדולה היא זיהוי מילות מפתח, איך תדע שנושא מסויים שמעניין אותך עלה עכשיו לאוויר, יש כל כך הרבה צורות איך לכתוב על נושא וכו'. בשביל זה יש משהו שנקרא "משין לרנינג" (למידת מכונה) תחום שצובר תאוצה לאחרונה, הוא קשור רק באופן מקרי למדעי המחשב, הוא יותר שייך לתורת ההסתברות, ויש אנשים שעוסקים בזה בלי לכתוב קוד בכלל. המחשב הוא פשוט הכלי היחידי שמסוגל ליישם את התורה הזו, אבל בגדול זהו מקצוע אקדמאי ובלי ידע בתורת ההסתברות אין לך סיכוי שם.
אגב החברות הנ"ל משוועות לכוח אדם איכותי שיעזור להם לפתור בעיות מעין אלו. אם יש לך פריצת דרך בתחום, המנכלי"ם שלהם יעבדו אצלך בשכר מינימום ולו בכדי ללמוד את הסוד שאיש עוד לא גילה.עלה והצלח.
פורסם במקור בפורום CODE613 ב20/02/2017 10:02 (+02:00)
-
תודה רבה.
באמת התחום של למידת מחשב מענין אותי מאד...
מ"מ כהתחלה אסתפק בכך שיוכל לדווח לי לפי רשימה קצרה של מילות מפתח שהוזכרו בהודעה.אני מבין מדבריך שזה נקרא זחלן. אחפש.
אני חשבתי על פיתון לזה. אני שמח שהיא מתאימה.תודה מקרב לב
פורסם במקור בפורום CODE613 ב20/02/2017 10:45 (+02:00)
-
אני חושב שארכיטקט לא הבין אותך - הוא חשב שאתה רוצה לדעת את כל האינטרנט, בעוד מדבריך נשמע שמדובר באתר ספציפי ועוד פורום!
אז אם ככה החיים לכאורה די פשוטים.
ישנם שתי דרכים:
א. קריאת הפיד (feed = הזנה) בפורמט XML לעדכונים שקיים כמעט בכל מערכת פורומים אבל אתה צריך למצוא את הכתובת של זה (פתח את האתר בדפדפן והצג את מקור הדף. חפש בhtml את המילים application/atom+xml או application/rss+xml.
אם יש לאתר כזה פיד, אז זה מאוד קל לכתוב קוד, עשו פה בעבר לפורום הזה: http://code.613m.org/viewtopic.php?f=1&t=249א. סריקת דף הHTML של ההודעות החדשות.
זה הדרך הפחות מומלצת אבל גם תעבוד לא רע. עליך ללמוד את דף ההודעות החדשות ולנתח אותו עם regex או כלים אחרים לקריאת HTML.בקשר לשרת של blueHost הוא תומך בנוד?
פורסם במקור בפורום CODE613 ב20/02/2017 11:22 (+02:00)
-
תודה!
אתה צודק, לזה כוונתי. באתר ספציפי שהוא פורום.
אבל לא מחפש כל עדכון אלא רק עדכון שיכיל מילת מפתח כגון "סקריפט".אני לא יודע אם תומך בNODE.JS...אבדוק.
יום נפלא שיהיה לכם ותודה שוב
(מה שחשבתי תאורתית זה ככה:
לשלוח בקשת http לאתר לקבל מידע לפי חיפוש "מה חדש" (זה חיפוש קיים שם, כמו כאן, "הודעות חדשות"), לשמור בבסיס נתונים קטן, את התוצאות,(דף אחד בלבד). כל חמש דקות, לבקש שוב, ואם יש משהו חדש לסנן אותו לשלוח לינק במייל)עכשיו מגיע את החלק הקל <!-- s:-) --><img src="{SMILIES_PATH}/icon_e_smile.gif" alt=":-)" title="מחייך" /><!-- s:-) --> :
ללמוד פייתון, או NODE.JS ... ולעשות זאת....)ובנתיים אנסה את http://code.613m.org/viewtopic.php?f=1&t=249#p1756
פורסם במקור בפורום CODE613 ב20/02/2017 13:43 (+02:00)
-
עכשיו מגיע את החלק הקל <!-- s:-) --><img src="{SMILIES_PATH}/icon_e_smile.gif" alt=":-)" title="מחייך" /><!-- s:-) --> :
ללמוד פייתון, או NODE.JS ... ולעשות זאת....)בהצלחה!
פורסם במקור בפורום CODE613 ב21/02/2017 14:17 (+02:00)
-
משהו כזה לדוגמא
http://www.prog.co.il/search.php?query=סקריפט&exactname=1&starteronly=0&forumchoice[]=0&prefixchoice[]=&childforums=1&titleonly=0&showposts=0&searchdate=30
נ"ב: כמה שניסתי לא הצלחתי להבין כיצד מוצאים את המחרוזת הזאת בחיפוש של פרוג (כלומר כיצד ידעת לנסחה)?
בכל מקרה, היא לא עוזרת לי כל כך כי מגיע לדף החיפוש עצמו, ואני צריך את הURL שיחזיר את תוצאות החיפוש... (או שלא הבנתי משהו בדרך?)בנתיים נראה לי לעשות כך:
לקבל חזרה הHTML, לחפש לפי ניתוח הדף את הרשימת לינקים (שהם ההפניות לנשואים הנידונים, למשל:
ואותם לנתח עד להגעת לdictionary כזה: {title:link}
ואז להשוות למילון קודם שישמר בקובץ חיצוני, ואם יהיה הפרש, ישלח לי מייל עם הלינק והכותרת.מה דעתכם?
תודה רבה
נ"ב: תיעוד התוכנית כרגע, שיסייע להבנה, מחילה על האנגלית הקלוקלת...
from Tools.scripts.h2py import filedict import os def askSite(urlQuery,words): """find in site by query strings, find only data from last day :param urlQuery: semple:"" :param words: query strings, simple: "yosi cohen" :return: dictionary of all href html in site, simple: "{title:link}" """ pass def filterNews(oldData,newData): """filtr parms and return news date only :param oldData: dictionary :param newData: dictioanry :return: Only data that is in the newData or null """ pass def sendMail(dictionaryData,ToMail): """format dictionry and send the data to "toMail" :param dictionaryData: dictionary only :param ToMail: text mail only: "mail@.domain.end" :return: true to successful false to failure """ pass def saveDataToFile(fromDict,filePath): """save the data to text file in json format :param dict: dictionary :param filePath: filePath, exies or not (the def create file if it no exies) :return: true to successful false to failure """ pass #initialization varibals filePath="objects\DB.txt" if os.path.exists(filePath): OldDate = open(filePath, "r+") print(OldDate.read(),"old") OldDate.close() else: OldDate=open(filePath,"w+") print(OldDate.read(),"new") OldDate.close() #המשך טרם נכתב
פורסם במקור בפורום CODE613 ב20/03/2017 18:36 (+02:00)
-
נ"ב למותר לציין שזה קוד הפייתון הראשון שאני כותב.
כרגע החסרון העקרי ברעיון הזה, הוא שהתוכנית תתאים ככפפה ליד רק לאתר מסוים, פרוג. ולא תצלח כלל לאתר אחר.
זה לא באמת בעיה מצד הצורך שלי. אבל זה נשמע לי תכנון "תוכנה" לקוי מאד.פורסם במקור בפורום CODE613 ב20/03/2017 20:56 (+02:00)
-
תשלח בקשת POST לכתובת הזו:
http://www.prog.co.il/search.php?do=process
עם הנתונים האלה
beforeafter=after&childforums=1&do=process&dosearch=%D7%97%D7%A4%D7%A9&exactname=1&forumchoice%5B%5D=0&order=descending&prefixchoice%5B%5D=&query=%D7%A1%D7%A7%D7%A8%D7%99%D7%A4%D7%98&replyless=0&replylimit=0&s=&saveprefs=1&searchdate=30&searchthreadid=&searchuser=&securitytoken=guest&showposts=0&sortby=lastpost&starteronly=0&tag=&titleonly=0
זה יפנה אותך לדף של "בקשת החיפוש בטיפול" שמכיל לינק למזהה של החיפוש. משם תוכל להמשיך לדף של תוצאות החיפוש ולנתח את התוצאות.
בקשר לתכנון התוכנה, נראה לי שצריך להפריד את זה ל3 שכבות, בקשת החיפוש, ניתוח התוצאות, וההחלטה מה לעשות עם התוצאות. בשלב השני אין מנוס מלתכנן את זה לכל אתר בנפרד, וגם השלב הראשון כנראה ישתנה מאתר לאתר. כך שתוכל לתכנן את הקוד בצורה שאפשר להוסיף מחלקות רלוונטיות לכל אתר שתרצה להוסיף בהמשך, ולשלוח את התוצאות אחרי ניתוח לשכבה השלישית
פורסם במקור בפורום CODE613 ב20/03/2017 23:01 (+02:00)
-
תודה רבה!
נשמע מאד הגיוני.(כעת עלה בדעתי לנסות אולי לכתוב הכל דרך חיפוש מותאם בגוגל, וככה יתאים לכל אתר, רק יש לבדוק אם ניתן לקבל תוצאות כמו חיפוש באתר עצמו, מצד האיכות, כרגע אני לא מצליח לכתוב חיפוש בגוגל שיחפש רק בתת פורם עיצוב גרפי למשל, וגם רימון חוסם יותר את החיפוש הזה)
פורסם במקור בפורום CODE613 ב21/03/2017 11:47 (+02:00)
-
לחיפוש גוגל יש חסרונות עצומים כשזה נוגע לפורומים (שמתעקשים להיות ישנים בכל התפיסה של SEO).
למשל אם יש בחתימה של מישהו את המילה שאתה מחפש, כל מקום שהוא מופיע זה רלוונטי בדיוק כמו תוכן ההודעה שלו.
אותו דבר התאריך - כל הדף שווה את התאריך ההקפצה.
לכן בפרוג עדיף לחפש עם המנוע שלהם.פורסם במקור בפורום CODE613 ב21/03/2017 11:57 (+02:00)
-
שלום!
האם מקובל להציג כאן קוד לדון עליו ולא רק שאלות בו?
אם לא, תקנו אותי בבקשה.אם כן...
כאמור זה הקוד פייתון הראשון שלי, אשמח לכל הערה בונה, ולכן אני מצרף כאן את הקוד של הפונקציה שכתבתי היום...
יעודו:
מקבל שתי רשימות באורך זהה, הראשונה היא זו שאליה משווים, השניה זו שנבדקת בפועל. עובר לפי הסדר בלבד, ומשווה אברים, אברים לא זהים, מוחזרים ברשימה חדשה.תודה לכולכם!
def filterNews(OldData, NewData): """filtr parms and return news date only (test if 1==1,2==2...) :param oldData,newList: identical lists of dictionary [{title:link},{title:link}] :return: Only data that is in the newData or null (if new[1]!=old[1],now[2]!=old[2]...) """ try: if str(type(OldData)) and str(type(NewData)) !="<class 'list'>": raise AttributeError("the def work on list only!") if len(OldData) != len(NewData): raise AttributeError("The lists are not identical in length!") newList=[] startIndex=0 endIndex=len(NewData) while startIndex<endIndex: if str(OldData[startIndex])!=str(NewData[startIndex]): newList.append(NewData[startIndex]) startIndex+=1 except AttributeError as er: print("Error:", er) return False else: return newList old=[1,2,3,4,5] new=[4,5,3,45,5] print(filterNews(old,new)) print(old,new)
פורסם במקור בפורום CODE613 ב22/03/2017 20:57 (+02:00)
-
שלום!
האם מקובל להציג כאן קוד לדון עליו ולא רק שאלות בו?
אם לא, תקנו אותי בבקשה.אם כן...
כאמור זה הקוד פייתון הראשון שלי, אשמח לכל הערה בונה, ולכן אני מצרף כאן את הקוד של הפונקציה שכתבתי היום...
יעודו:
מקבל שתי רשימות באורך זהה, הראשונה היא זו שאליה משווים, השניה זו שנבדקת בפועל. עובר לפי הסדר בלבד, ומשווה אברים, אברים לא זהים, מוחזרים ברשימה חדשה.תודה לכולכם!
def filterNews(OldData, NewData): """filtr parms and return news date only (test if 1==1,2==2...) :param oldData,newList: identical lists of dictionary [{title:link},{title:link}] :return: Only data that is in the newData or null (if new[1]!=old[1],now[2]!=old[2]...) """ try: if str(type(OldData)) and str(type(NewData)) !="<class 'list'>": raise AttributeError("the def work on list only!") if len(OldData) != len(NewData): raise AttributeError("The lists are not identical in length!") newList=[] startIndex=0 endIndex=len(NewData) while startIndex<endIndex: if str(OldData[startIndex])!=str(NewData[startIndex]): newList.append(NewData[startIndex]) startIndex+=1 except AttributeError as er: print("Error:", er) return False else: return newList old=[1,2,3,4,5] new=[4,5,3,45,5] print(filterNews(old,new)) print(old,new)
הגרסה שלי לקוד
עם הזמן תראה שאתה יכול להשתמש בפייתון בלי לדחוף לכל דבר try except
try except אתה משתמש במקומות שאתה נזרק מהתוכנית כי אתה לא יודע מה אתה מקבל ואין לך אפשרות לבדוק / לא כדאי לך לבדוק את שלל האופציות האחרותdef filterNews(OldData, NewData): """filtr parms and return news date only (test if 1==1,2==2...) :param oldData,newList: identical lists of dictionary [{title:link},{title:link}] :return: Only data that is in the newData or null (if new[1]!=old[1],now[2]!=old[2]...) """ if not isinstance(OldData, list) and not isinstance(NewData, list): print("the def work on list only!") return None elif len(OldData) != len(NewData): print("The lists are not identical in length!") return None newList=[] for New, Old in zip(NewData, OldData): if NewData[New] != OldData[Old]: newList.append(New) return newList old=[1,2,3,4,5] new=[4,5,3,45,5] print(filterNews(old,new)) print(old,new)
מה היה לנו פה
zip עובר על שתי מערכים בו זמנית אבר מפה ואבר משם
In [8]: a, b = range(1, 10), range(100, 1000, 100)In [9]: for i, j in zip (a, b): ...: print("{0} -- {1}".format(i, j)) ...: 1 -- 100 2 -- 200 3 -- 300 4 -- 400 5 -- 500 6 -- 600 7 -- 700 8 -- 800 9 -- 900
בפייתון מעבר על מילון בלולאה מוציא רק את המפתחות ולא את התוכן (אתה מקבל מערך של מפתחות)
In [13]: my_dict = {i:j for i, j in zip(range(1,10), "ABCDEFGIJ")} In [14]: my_dict Out[14]: {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F', 7: 'G', 8: 'I', 9: 'J'} In [16]: for i in my_dict: ...: print (i) ...: 1 2 3 4 5 6 7 8 9
isinstance הצורה בפייתון שבודקים type של אובייקט
אחרי כל הברברת נראה שזה מה שאתה מחפש
https://github.com/GregUK/vb3_7_scraperאגב זה לא רק לאתר אחד אלא למערכת פורומים אחת שנחשבת בין הפופולריות.
פורסם במקור בפורום CODE613 ב23/03/2017 19:39 (+02:00)