סריקת אתר וזיהוי שינויים בנושא מסויים
-
עכשיו מגיע את החלק הקל <!-- 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)
-
פרוג שידרגו את האתר שלהם חסדי הקל
תוכל לקבל json עם פוסטים חדשים, כתבתי את רוב הסקריפט העבודה שנשארה יחסית קטנה.תהנה
#!/usr/bin/python3 import requests import time import json def getUpdate(): with requests.Session() as s: url = 'http://www.prog.co.il/activity/get' headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36', 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest'} params = {"filters[nodeid]":0, "filters[view]":"activity", "filters[per-page]":10, "filters[pagenum]":1, "filters[maxpages]":20, "filters[userid]":"0", "filters[showChannelInfo]":1, "filters[filter_time]":"time_lastmonth", "filters[filter_show]":"show_all", "filters[filter_new_topics]":1, "isAjaxTemplateRender":"true", "isAjaxTemplateRenderWithData":"true", "securitytoken":"replace with your security token"} resp = s.post(url, data=params, headers=headers).json() return checkUpdate(resp) def checkUpdate(json): ''' parse json to return only the new posts params json: json file of 10 last update post type json: dict ''' pass # DOTO # update per 5 min while True: print(getUpdate()) time.sleep(60*5)
פורסם במקור בפורום CODE613 ב20/04/2017 00:09 (+03:00)