[השמעת מוסיקה] רוברט KRABEK: שלום, חבר 'ה. השם שלי הוא רוברט Krabek, ו אני אלמד אתכם איך לגרד את האינטרנט עם Nokogiri, אשר היא ספריית רובי, וקימונו, שהנו תוסף כרום. אז קודם כל יש כמה דברים שאתה יכול לעשות אם אולי אתה כבר עושה את כל psets עד כה וסביבת העבודה שלך היא מקבל קצת מלא. אנחנו יכולים למעשה רק הולכים ו ליצור סביבת עבודה חדשה בשבילך רק כדי לעשות פרויקט חדש ב. אז אם אתם רוצים להמשיך עובד במספר תבנית CS50 שיש לך כעת, תרגיש חופשי, ורק אתה יכול להתקין Nokogiri עם CFLAGS פנינת equals-- להתקין nokogiri. אבל חוץ מזה אני אראה לך כיצד להגדיר את אחד חדשה. ואז זה בעצם יורד יותר גלגלי עזר. ואתה קידוד כאילו היית רק קידוד בSublime או משהו. אז אם אנחנו משמרות אותו. אז אומר שזה CS 50 מזהה הנוכחי שלך. אתה פשוט יכול ללכת לCloud9 כאן. אתה יכול ללכת ללוח המחוונים שלך. זה צריך להעלות את כרטיסיית סביבות עבודה. ואז אתה יכול פשוט ללחוץ כאן, צור חדשה סביבת עבודה. שם סביבת העבודה החדשה שלך, אולי מבחן, או גירוד. ולאחר מכן לחץ על כרטיסייה מותאמת אישית זה כאן, במקום כרטיסיית תבניות CS50. ואז אתה יכול פשוט ללכת וליצור סביבת עבודה חדשה. אני כבר יצרתי סביבת עבודה כאן. אז אנחנו נעבוד עם זה. ואם יצרת חדש סביבת עבודה כל כך עם הכרטיסייה המותאמת אישית, אתה יכול פשוט להקליד פנינה להתקין nokogiri, שהוא לא הולך כאן. אישור, זה קצת קפוא. אבל אתה יכול להקליד פנינה להתקין nokogiri. וזה צריך להיות כל מה ש יש להתקנה. כפי שאמרתי קודם, אם אתה עדיין עובד במספר תבנית CS50, אתה רק צריך להקליד CFLAGS שווה פנינה להתקין nokogiri. ואני כבר מותקן זה כאן אז אני לא אעשה את זה. אבל עבור אלה הבאים לאורך, מוזמן לעשות זאת. אז ברגע שיש לך Nokogiri מותקן סביבת עבודה או בספרייה, אני הולך לתת לך קצת של קורס מזורז בתחביר רובי כי Nokogiri היא ספריית רובי. אז אתה צריך לדעת כמה בסיסי תחביר רובי לעבודה עם Nokogiri. אז כמה הבדלים בסיסיים ממה שאתה רגיל ל אולי אם אתה כבר עובד עד כה רק C ו- PHP, אתה מצהיר משתנים ללא סוג. אתה לא משתמש בנקודה-פסיק, שהוא סוג של הקלה. אין סוגריים עכשיו סביב לאו תוך לולאות, למשל. רק יש לך בלוק של קוד, ו אז אתה שם את הסוף בסוף ש. אין בתוספת בתוספת או מינוס מינוס, כל כך פשוט יודע שכאשר אתה עושה ללולאות, רק שווים ושווים מינוס פלוס. ובמקום חשיש כוללים, תוכל להשתמש דורש ולאחר מכן כל מה שמנסה ספרייה כדי לטעון לתכנית שלך. רובי הוא לא הידור שפה. אז זה הקלה נוספת. זה יותר דומה ל- PHP שבי זה שפה פירשה. אתה יכול להפעיל את כל תסריט רובי ש אתה כותב עם רובי ואחרי בשם התסריט או התכנית שלך. למקרה בו מדוברים בתכנית רובי, אתה פשוט לסיים אותו עם .rb במקום .ג. ויש משתנה מערכים בגודל ברובי, אשר הוא סופר נוח כשאתה גירוד ואולי רוצה לצרף הנתונים, כי אתה כבר גרד לתוך מערך. אתה לא צריך malloc מערך חדש ו להעתיק את המערך הישן למערך החדש. אתה יכול פשוט לצרף עם שני סימני החץ. ואין תווים, יש רק מכתב אחד חוטים. כך שצריך להיות קצת יותר קל. אז אנחנו פשוט אתן לך כמה דוגמאות של כמה תחביר רובי בסיסי. אז הנה אתה יכול לראות שבמקום הקו הנטוי הנטוי, על מנת להגיב ברובי, אתה פשוט להשתמש בסימן פאונד. והצהרה משתנה, אתה פשוט להקליד את שווים משתנים מה שאתה רוצה להיות משתנה. הם יכולים להיות מחרוזות. אתה יכול להיות מערך, ש אתה לאכלס עם ערכים. מעמיד הדפסים ודומים. למטרות שלנו, הבדל היחיד הוא באמת זה מעמיד אשר מייצג, שמה, רק מכניס את קו חדש דמות בכל מה שאתה מדפיס. אז אם אנחנו נותנים קטנים הפגנה כאן, אנחנו יכולים להפעיל את זה with-- לפתוח מסוף חדש. אתה יכול לראות את כל אלה קבצים שנמצאים במסוף שלי. ואם אני רק לרוץ רובי, intro.rb אודם, זה מוציא חמישה שלום מאת'ר, קווינסי, מוביל. אדמס. כך שכל מה שיש למערכי הכרזה. קהל: רוברט, אתה יכול לעשות הגופן שלך קצת יותר גדול? רוברט KRABEK: כן. ואני יכול להתמקד בבגלל שאתה לא יכול להתקרב לגופני מסוף כנראה. אז ככה אתה מדפיס משתנים למסוף שלך. ניתן גם להשתמש ב משתנים בתוך מחרוזת. אז לאחרונה ב- PHP, ייתכן שלמדת שיש אינטרפולציה מחרוזת. אז אם אתה תסתכל כאן, אם אני להכריז שלושה משתנים, שם, ספרייה, ומניח שפה, ואני, אני לכתוב מחרוזת, שלום השם שלי הוא. ואז במקום PHP גרסה של אינטרפולציה המחרוזת שנראה קצת יותר כמו זה, יש לך סימן ליש"ט, ולאחר מכן סד מתולתל, ולאחר מכן השם המשתנה. וכך היית להדפיס, אומרים, מה השם המשתנה הוא. ואז אתה יכול גם לשרשר מחרוזות. רובי עושה את זה סופר קל עם סימן החיבור. רק יש לך מחרוזת אחת בצד השמאל בתוספת משתנה או מחרוזת אחרת בתוספת מחרוזת. אז אם אני להדפיס את זה, הוא צריך רק לומר שלום, השם שלי הוא רוברט. אני אלמד אותך nokogiri ברובה. ובואו רק לאשר ש אכן intro אודם case--. שלום, השם שלי הוא רוברט. אני אלמד אותך nokogiri ברובה. על העברה, אם הצהרות אחרת, זה קצת שונה ממה אתה עשוי לשמש ל אם אתה כבר עובד בג אתה לא צריך סוגריים. אתה לא צריך סוגריים המסולסלים. ובמקום אחר אם, זה elsif בשרשור. אז כאן, אם אני כבר הכריז x עד כאן, כפי שניתן לראות, x הוא עדיין 5. אז אם x הוא פחות מ 3, זה יהיה לשים קטן. אם זה פחות מ 7, בינוני, גדול אחר. אז 5 הוא מספר בינוני. ואני בסופו של גוש זה של קוד עם הסוף. הנה שלי ללולאה. ותחביר זה הוא גם שונה במקצת. 0 עד חמש רק במהות מכריז מערכים של 0 עד 5. אז יש חמישה חריצים במערך. ולאחר מכן לכל חריץ שב מערך, אני אהיה הגדלה אני. כך זה צריך להדפיס 0 עד 5, או 0-4. ואת זה צריך להדפיס בינוני. ואני רק להבה דרך. יהיה לך חבר 'גישה קוד זה בהמשך. אז אתם יכולים להפעיל את זה בעצמכם. אז זה הזמן שהלולאה הבסיסית שלך. זה פשוט יהיה הדפסת j, הגדלה ידי 1 עד שנגיע 5. קורס מזורז רובי סופר מהיר על איך לכתוב פונקציה. במקום, אומר, int עצרת מספר, אנחנו רק צריכים def. ובעצם אתה הגדרת תפקיד כאן. זה הולך להיות שם הפונקציה, וזה כל משתנים ש רוצה לעבור לתפקיד. אתה יכול לקבל אם הצהרות ב. אתה יכול לחזור. במקרה זה, אנחנו הגדרה באופן רקורסיבי פונקצית עצרת מיושמת. אז אנחנו פשוט לקרוא לפונקציות ברובי כמו זה. אז אם אני כבר מוגדר זה, אני אפשר לקרוא לעצרת, עובר ב 3, ולאחר מכן 3 יהיו משתנים המספר שאני יכול להשתמש בפונקציה. וto_s זה רק הופך את לחזור ערך של עצרת למחרוזת. אחרת זה יהיה לזרוק שגיאה אומר אוי, אני לא ניתן להדפיס string-- כי כמו שאתה זוכר, מעמיד הוא לשים string-- בגלל זה העצרת חזרה מספר. אז אנחנו יכולים להמיר ש למחרוזת כמו כזה. ולהפך, אתה יכול גם להמיר מחרוזת למספר שלם עם to_i. אז מה שהופך את כל מה שסופר פשוט, אם אני רק להעיר את זה, להציל ולהפעיל את פונקצית העצרת. אנחנו צריכים להיות מסוגלים לראות עצרת של 3 היא 6. וזה אכן נכון. אז זה הקורס המזורז שלך ברובה. ועכשיו שאתה יודע רובי, אנחנו יכולים ללכת על לNokogiri הבסיסי מגרד להגדיר. בעיקרו של דבר כל מה שאתה צריך לעשות הוא, ברובי, דורשים ספריות. ולמטרות שלנו נהיה באמצעות ספריית OpenURI כמו גם Nokogiri. ואז מה שאתה do-- וזה ימצא לתת לך את התחביר לזה-- הוא שאתה פותח את כתובת האתר בהרבה כפי שהיית ב בקשת תלתל, אשר מייצגת URL C. אז אתה לוקח את הכתובת של האתר מדובר. אתה לאחסן אותו במשתנה. ואז אתה יכול לחפש דרך ש משתנה לתגי HTML ייחודיים באמצעות פקודת .css. ואז אתה יכול פלט תוכן לכל מקום שאתה רוצה. אתה יכול להתחיל בבסיס נתונים. אתה יכול פלט בקובץ, או אפילו רק להדפיס אותו למסך. אז אנחנו אראה לך מגרד בסיסי. אז עד כאן אתה יכול לראות שיש לנו דורש nokogiri, דורש פתוח אורי. להגדיר הבסיסי שלך, בואו קורא לזה מסמך או doc, שווה Nokogiri :: HTML פתוח, המהווה את הפקודה שנמסרה לנו על ידי OpenURI סִפְרִיָה. ואנחנו אחפש, לאלה של שלכם שעלול להיות חיים במרובע, לאופניים שנמצאים בבוסטון רשומה בסעיף אופני בוסטון קרייגסליסט אֲתַר. אז אם אתה לא מוכר עם תלתל, אני פשוט אראה לך מה אמיתי מהיר cURL תעשה. אם אני רוצה לקבל את כל כתובת האתר מ אתר Craigslist, אם אני מקליד תלתל, זה פשוט מרוקן את כל כתובת האתר מאופני האתר Craigslist על המסוף שלי. זה לא במיוחד שימושי כי אני לא רוצה לעבור באופן ידני ו למצוא את הדבר שאני מחפש. אבל רק כדי שתוכל רואה שאני בעצם באמצעות הקוד הנכון, אם אתה מסתכל בכתובת האתר לקרייגסליסט בbikes-- מסיבה כלשהי זה לא מצא. אם אתה מסתכל בדף זה ואתה מסתכל על כתובת האתר, זה צריך להיות זהה ל בקשת תלתל שאני פשוט לשלוח. ואכן, זה מה שלהיות מאוחסן במשתנה doc. אז כשאתה חוזר לקוד שלנו, אנחנו אז יכול לפעול על משתנה doc זה באמצעות .css. אז אומר שאני רוצה לקבל את כל התגים שspan.txt, וכל התגים בתוך התג ש. ולמה אנו עשויים רוצים לעשות את זה, אני שומע אותך בוכה? אם בדיקת רכיב, זה נותן לך פירוט של איך את כתובת האתר בנוי. אם אני לגלול למטה דרך כאן, אתה יכול לראות מה כל אחד מאלה שונים אלמנטים מייצגים. אז אולי אני רוצה לגשת ל אלמנט המסוים הזה. אז אני משתמש במפתח Chrome כלים לבדיקת רכיב. אני יכול לראות כאן למטה שזה הוא תג בתוך טווח לתייג עם כיתה של txt. אז זה מגיע לנו פעולה ראשונה ש היא תוחלת doc.css, המהווה את התג ש אני מחפש בתוך כל כתובת אתר זו. ולאחר מכן .txt פועל כמו CSS עושה כשאתה רק כותב CSS בקבצי HTML שלך על ידי מפרט כיתה. אז מפעיל מסוים זה יהיה לציין תג span עם כיתה של txt. ואז אם אני עוזב את מקום, זה אז ילך בתוך התג ש ואז למצוא בתוך תג ש. אז אם אני רק לשים את זה ל המסוף, אני צריך תוכל לראות בעצם כל מה ש שנמצא בטווח זה של txt הכיתה. אז אנחנו אתן שדרכים. קרייגסליסט-מגרד אודם. ואכן זה נותן לנו את כל אלה תגים של הרישומים השונים ש הם בדף קרייגסליסט. אז אם אנחנו חוזרים, אנחנו יכולים להפוך את זה למשהו קצת יותר שימושי. אולי אנחנו רוצים רק את הקישורים. כי בתוך התג הזה, אני גם יש קישור של הנתיב שהדף הזה הולך. אם אתה מסתכל על קוד זה כאן אז, מה אני אעשה הוא במקום .css, אני יכול ללכת at_css. וזה רק יקבל ראשון אלמנט של כל הדברים האלה. אז אם אני היה לעשות את זה ב קוד אני רק הוכחנו בעבר, במקום לחזור כל זה, זה פשוט להחזיר את הראשון של אלה. אז ככה מפעיל at_css עובד. אז אנחנו רוצים לאחסן נתיב כל הראשון תג. ומכיוון שייתן לנו זה-- ולכן אנחנו עדיין הולכים להשתמש .css. אבל בגלל זה הוא הולך לתת לי שלנו בחזרה מערך שלם של תגים, אנחנו הולכים לגישה האלמנט הראשון. אז זה הוא דרך נוספת שאתה יכול לגשת לכל אלמנט מסוים אם יש מערך של אלמנטים שהוא חזר, כי אתה יכול לטפל בכל דבר ש חוזר .css כמערך, בעצם. ואז אנחנו הולכים כדי לגשת ל תכונת התייחסות היפרטקסט של זה. אז אם אתה תסתכל, אם אתה נראה ממש קרוב לכאן, אם אתה רק במהות מסתכל על שורת כתובת האתר, זהו הנתיב ש אתה הולך להיות גירוד. אז אם אנחנו פשוט להפעיל את זה שוב, ולוודא שחסכנו אותו. אתה יכול לבדוק בבית. זה אכן תואם עם קישור זה. אז למה אנחנו ייתכן שנרצה להשתמש בזה? אם אתה רוצה לגרד הדף יש וזה דף של קישורים כמו קרייגסליסט עושה, אתה אולי כדאי לך ללכת אז לכל אחד מקישורים אלה ולאחר מכן לגרד תוכן של זה, ש זה בדיוק מה שאנחנו הולכים לעשות. אז ברגע שיש לך נתיב כ משתנה, אני כבר לא ממש אכפת להדפיס אותו. אני רק צריך לאחסן אותו כמשתנה. ואז אני יכול לגשת אחר דף באותו אופן שהגישה doc במקום הראשון. מלבד עם כתובת האתר, אנחנו הולכים להשתמש אינטרפולציה מחרוזת כמו שתארתי ב רובי קודם לכן על לצרף בדרך לסוף השורש. אז מה זה הולך לעשות הוא זה הולך לשים על הנתיב שגרדתי בעבר ולאחר מכן להפוך את זה לפריט חדש, כל מה שאתה רוצה קורא it-- first_listing, למשל. אבל אני הולך לעזוב זה על פריט לעכשיו, כי זה מה שאני משתמש כאן. אז אומר שאני רוצה לקבל את התיאור של הפרסום הראשון בקרייגסליסט. אז הייתי הולך כאן למטה. הייתי לחץ על בדוק אלמנט שוב, כי זה התיאור. הייתי הולך לכאן ולראות אם אני יכול למצוא איך אני יכול תוכל לחפש תג ייחודי זה. ובמקרה הזה, יש לו זיהוי, מה שמוביל אותנו לדרך הבאה שלנו מחפש תגים, שהוא עם hashtag. אז לשיעורים, אתה יכול להשתמש במפעיל הנקודה. אז .txt הוא מפרט ברמה של txt, ואילו החשיש מציין זהות. אז במקרה הזה, הוא התג סעיף, וזיהוי הוא postingbody. אז זה הולך ומוצא first-- בגלל שאנחנו באמצעות at_css-- זה הולך ו מוצא את האלמנט הראשון ש מגיע עם התג של סעיף וזיהוי של postingbody. ואז אתה יכול לגשת לאלמנט הטקסט של הפריט שחזרה עם .text. ואז אנחנו יכולים לאחסן כי בתיאור. אז עכשיו שיש לנו תיאור משתנה, אולי נוכל לעשות, למשל, להגיש קלט / פלט. אז להגיש קלט / פלט ברובי דומה מאוד להגיש קלט / פלט בC שבו אנו פותחים קובץ. אנחנו יכולים לכתוב את זה. ואז לסגור קובץ ש. אז הנה, אנחנו רק שמות להגיש, כמה משתנים שרירותי. אנחנו יכולים גם פשוט לשים את זה כאן. יש לנו משתנה שאנחנו אחסון הקובץ הפתוח כעם File.open. ואנחנו כותבים בקובץ זה, כך אנחנו פותחים אותו עם מפעיל w. ואז אנחנו שמים את המחרוזת ל להגיש עם מפעיל .puts. ואז אנחנו שמים את המשתנה ש רוצה לכתוב לקובץ בתוך זה. ואז אנחנו פשוט לסגור את התיק. אז אם אנחנו הולכים קדימה ולהפעיל את זה, זה צריך לייצר מסמך עם description.txt שיהיה יש תיאור זה בתוך זה. אז אם אני מפעיל it-- לא. זה מיוצר קובץ טקסט עם, אני מקווה, את אותו הדבר. אז אולי היה פרסום חדש כי הוא בא בזמן שאני מדבר. ואכן זה נראה כמו חל. אז אם אנחנו הולכים לאופניים הקלאסיים הזה, 1962, נראה כי שנת 1966 כדי להתאים. והנה לך. אז זה בסיסי ביותר הפונקציונליות של גירוד. יש לנו יכול במקום רק כותב בקובץ זה, אנחנו יכולים להוסיף דברים למערך. אז אם אני מצהיר שלושה מערכים, כותרת, מחיר, ותיאור. ואנחנו פועלים על פריט doc עכשיו. אנחנו יכולים לעבור ו למצוא את כל span.txt. וזכור, זה מחזיר מערך של כל הפריטים שהוא מוצא. ולאחר מכן ברובי, אתה יכול פשוט להשתמש .each ללחזר דרך כל פריט של המערך. ולאחר מכן עבור כל פריט, אני רק הולך לקרוא לזה קישור, כי זה בעצם מה שזה. אז אם אני שם את כל a.hdrlnk נקודת link.css, זה בעצם הולך לקישור ומציאת בתוך שחוליה נוספת אלמנט HTML וכיתה מקבילה. אז אם אנחנו זוכרים את מה ש זה היה, span.txt, אתה יכול תראה תן לי רק לחזור quick-- האמיתי בתוך span.txt יש לנו הרבה סוגים אחרים. אז בתוך span.txt, אנחנו מחפשים לתג עם hdrlnk כיתה. אז תן לי רק למצוא ש בשבילכם ממש מהר. אז אתם יכולים לראות כאן, זה הוא תג זה בפרק הזמן של txt הכיתה שיש hdrlnk הכיתה. וזה אכן מה ש אנחנו מנסים להשיג. אז אנחנו מנסים עכשיו כדי לאחסן את כל מאותם קישורים בתוך הכותרת. ואז אנחנו הולכים להדפיס את כל אחד מקישורים אלו. לא מצטער. אנחנו הולכים להדפיס המחיר של כל אחד מאלה. אז בואו נריץ את זה באמת מהיר ולראות מה זה עושה. אז זה רק בעצם הלך באמצעות כל אחד מהקישורים בתורו, לגשת אל התג בשאלה, ולאחר מכן הוציא את המחיר. וזה עשה את זה כי אחרי יש לך הכל בכותרת, רק אנחנו כבר מאוחסנים בתואר לשם. שמנו רק מאוחסן על הקישור בתוך כותרת המערך. ובזה לפעולת לולאה, שבו במקום ללכת לa.hdrlnk, אנחנו מחפשים span.price. אז אם אני יכול רק באמת למצוא במהירות המחיר, אם אתה בודק את האלמנט, תראה שזה תוחלת עם הכיתה של מחיר. וזה בעצם איך אנחנו מקבלים את המחיר שיש. אז זה באמת מקרה בסיסי של גירוד. ככה אתה מקבל את כל האלמנטים בדף כי, למשל, אתה כבר יודע את כתובת האתר של. אז אם אנחנו רוצים להגיע קצת יותר לעומק, אנחנו יכולים לגרד דפים בתוך דפים. ולמשל זה, אני להיות פלט לקובץ CSV. אז אני דורש CSV כאן כי רובי לא, בתוך עצמו, יש לי פונקציונלי לקבצי CSV רק פלט. אז זה סופר פשוט. תן לי רק ללכת למשנהו. כיסינו אני קובץ / O. אז זה דומה לאופן בו הוא בג ולפני שאנחנו עוברים לקימונו, אני רק אראה לך ממש מהר איך לגרד אתרים במראות. אז אנחנו כבר למדנו איך להכריז מערכים ברובה. אז רק אני מכריז חבורה של מערכים שרירותיים שיהיה אחסון נתונים בתוך. דוק פועל באותה הדרך כפי שעשה בקובץ הקודם. אנחנו הולכים ב, מציאת כל אחד מspan.txt של. אנחנו כבר יודעים ש. שהוא המכל שבתוכו כל קישור יש את כל הנתונים שאנו רוצים. אז הנה מה שאנחנו עושים הוא לכל קישור של txt כיתת תוחלת, אנחנו הולכים ב ואנחנו מוצאים את תג, מציאת האלמנט הראשון של ש. זכור, .css מחזיר מערך, כך שאתה לא יכול פשוט לגשת אליו כמו שהוא. אנחנו הולכים למצוא את האלמנט הראשון. גם אם זה מערך של אחד פריט, אתה צריך להשתמש בתחביר זה, ואז לשלוף את תכונת href. אז עשינו את זה קודם לכן. אז זה צריך להיראות מוכר. אז עכשיו יש לנו מערך נתיבים בשמם של כל הקישורים שלנו שאנחנו הולכים לרצונך להשתמש. אז אם יש לנו מערך זה של כל של השבילים שאנחנו רוצים להשתמש, אז אנחנו יכולים ליצור פריט עבור כל דפים שבהם אנחנו פותחים דף זה. אז כמו שראינו גם ב התחביר לפני, שבו עושה אינטרפולציה מחרוזת עם הנתיב כאן, כך התחביר הוא רק לנתיב. ואני יכול שם זה משתנה כל שם שרירותי. זה חשוב אחד. זהו המערך כי אתה להיות גישה לכל רכיב. אבל כשאתה אומר לדרך בשבילים, זה אומר עבור כל רכיב בשבילים, קורא לזה הדרך, ולהשתמש בזה. זהו למעשה כמו בעת לעשות ללולאה ואתה משתמש int i. אז אתה יכול לטפל בנתיב כ משתנה זה הגדלה. ואז לכל אחד מאלה, להיכנס לכל אחד מקישורים אלו. כי אנחנו אחסונו בדף פריט, כך אנו יוצרים דף חדש בכל פעם אנחנו לגשת אליו. ואז בתוך הדף החדש, למצוא span.postingtitletext, span.price, ולאחר מכן # סעיף postingbody. אנחנו כבר כיסינו # postingbody סעיף כשהסתכלנו בתיאור. אז אנחנו יכולים ללכת לראות בפוסט קרייגסליסט, אם אתה רק מסתכל על הכותרת, אתה יכול לראות את זה כאן, postingtitletext תוחלת. וזה למה זה שם. ולאחר מכן במחיר, אתה יכול לגשת אליו עם כיתת טווח של מחיר. אז אנחנו גם אולי אולי רוצה לאחסן את כתובת האתר. אז אנחנו פשוט נרוץ זה שוב, לאחסן אותו במערך, כי אם אתה מחפש על קרייגסליסט, אתה כנראה הולך רוצה דרך, אם אתה רואה משהו שמעניין אותך, לחזור לאתר זה. אז אתה רק רוצה לאחסן כתובת האתר למען אזכור. זה רק במהות תחביר אחר ללולאה. אני רק יכול לעשות paths.each במקום של לדרך בשבילים עם מדד. ותחביר זה רובי for-- הדרך היא מה שעשינו עד כאן, הכרזה משתנה עבור כל פריט. ומדד מתנהג כמו אני בC ללולאות. אז אתה יכול לעקוב אחר ממה הוא המדד. אז הנה הוא רק דבר נוח קטן כאשר אתה מפעיל את המגרד. אם אתה מגרד מאות עמודים, כדי לוודא שזה לא תלוי, זה יהיה רק ​​פלט, אני גישה דף זה, ולוודא כי זה עדיין ממשיך. אבל למטרות שלנו, משום ש יש מאה פריטים, אני הולך לגשת רק שלושה מהם כדי שלא נגמר לו הזמן כאן. אבל לפני שנגיע לזה, אני רק הולך להראות לכם באמת מהיר, אני יהיה פלט הכותרת, מחיר, תיאור, ואת כתובת אתר של כל אחד מהקישורים שאני כבר גרדתי. ואז זה פשוט תחביר לספריית CSV. אתה פותח CSV. זה מה שאני הולך לקרוא לזה. לפתוח אותו עם כותב. ולאחר מכן CSV יהיה הקובץ ש אתה מזין את הכל לתוך. זה רק לבדוק את שפיות ל שלי לדעת שזה פועל. וזה הוא לבדוק את השפיות שלי לדעת שזה הושלם. אז אני שם את הכותרת לשורה ב CSV, מחיר, כתובת אתר, תיאור, כל לתוך השורות בCSV. אז אם אנחנו הולכים וברחתי now-- זה ואני פשוט לוודא שאני כבר הצלתי it-- במקום רק פלט זה למסוף, אנחנו צריכים CSV קובץ שמיוצר. אז הנה אנחנו יכולים לראות CSV קובץ שהופק. זה הפלט של scape שפשוט רצתי. כפי שניתן לראות כאן, גישה לדף 0, 1, 2, 3. אלה הם הכותרות, מחירים, תיאורים. ואם אנחנו מסתכלים על זה CSV קובץ שאנחנו כבר נוצרו, אתה יכול לראותה תשודר כאן. זה לא Excel, כך שזה לא מעוצב בשורות ועמודות. אבל אתה יכול לדמיין איך זה יכול להיות מעוצב. CSV מייצג ערכים מופרדים בפסיקים. אז אתה יכול לדמיין שזה יכול להיות בשורה. והיית כל פסיק מצביע טור נפרד. רק מילה של caution-- לפעמים אתה גירוד דברים עם הרבה פסיקים. אז אם אתה פלט אותו לקובץ CSV, זה לא יכול פלט דרך שנדמה לך. אז זה בעצם כל יש לגירוד HTML בסיסי דפים עם Nokogiri. אז בן האינטרנט חדשני כפי שהיא באה אותו עם יותר אוטומטי וGUI גרסה, אם כי פחות חזק גרסה של גירוד אתרי אינטרנט שונים. ולמטרות שלנו אני אדגים הארכת Chrome נקראת קימונו. וכל מה שאתה צריך לעשות הוא לנווט אותך לדף שברצונך לגרד. אתה לוחץ על שדה של עניין. אתה לכייל את השדות, כי זה באופן אוטומטי לזהות מה הוא חושב אתה רוצה להיות גירוד, ואז אתה פשוט ליצור API. אז אם היינו כדי להדגים את זה ב קרייגסליסט, זה באמת לא יעבוד. וזה מה שאני חוזר ל אומר עליו שלא היה חזק כפי ש. יש לו צרות יצירת API. אבל כהפגנה של מה שהיא תעשה, אם תתקין את התוסף של Chrome, כל שעליך לעשות הוא אתה לוחץ על זה. זה Kimonofies הדף, ואז אתה לחץ על הדבר שאתה רוצה תסריט. אז אם אני היה ללחוץ על זה, זה היה להדגיש מה הוא חושב שאני רוצה להיות מגרד את הדף. אז אולי אני קורא לזה רישומים. זה כמה פריטים יש לי שנבחר. ואני רק יכול לאשר או להכחיש כמה של הרישומים הציעו האחרים כדי לקבל את זה כדי להוסיף ל מה יהיה מגורד. אז עכשיו אנחנו יכולים לראות שיש מאה פריטים שנבחרו. אם אני רוצה להיות בתחום אחר שאני גם לגרד שקשורה לזה, אומר אני רוצה לגרד את המחיר כמו גם, אז אני יכול לעשות את אותו הדבר. אז הנה הדגמה של איך זה הרבה פחות חזק, כי עכשיו זה להרים את העיר במקום רק המחיר שאני רוצה. ועכשיו זה הרים 200 דברים. אתה יכול לחזור ולמחוק. אתה יכול לנסות שוב. אבל אין ערבויות. כך זה עובד לפעמים. כפי שאתם רואים כאן, עכשיו זה אומר 96 עד כאן. זה הרים את רוב הקישורים שאתה רוצה לגרד, אבל לא בהכרח כולם. עוד כלי שימושי של קימונו למרות הוא שאתה יכול ללכת לתכונות מתקדמות כאן, ללכת למתקדם, וזה ייראה לך התפלגות הייחודית דרך לגשת ל- HTML תגים שברצונך לגרד. אז לרישומים, אם אתה מסתכל על כאן, אם אתה ניגש לתוחלת עמ div span, למעשה אתה יכול פשוט להשתמש ב זה בקוד Nokogiri, שבו לפני שהיו span.txt כדי לגשת לכל אחד מהרישומים. אם אני רק רוצה את הטקסט בתוך הרישומים, אני יכול p חלל div קלט תוחלת מרחב חלל תוחלת החלל, וזה יהיה להשיג את אותו אפקט. ולאלה מכם שמעוניינים בשימוש בביטויים רגילים, זה קורה גם לתת לך רגיל סוג הביטוי של מחרוזת הקלט כדי למצוא את הדברים אתה מנסה למצוא. אז יש עוד תכונה מגניב של קימונו שבו אתה יכול לדפדף, וזה לא רק אני יכול לגרד התוצאות של דף זה, אני יכול ללחוץ על זה קצת כפתור כאן, עימוד, לציין את הכפתור ש קח אותי לדף הבא, ואז זה יהיה רק ​​יודע ש זה יכול לחזר לדף הבא, ואז לגרד את כל זמן כל-- כ כמו שזה אותו הפורמט של course-- scape כל קישורים אלה גם כן. אז בגלל הקימונו לא רוצה לעבוד עם קרייגסליסט, מה שעשינו הוא שKimonofied Crimson הרווארד. אני כבר הוצאתי חלק מהסוג של עליון בהשתתפות מאמרים, לאשר כאן. אומר את כל אלה. אני כבר נאסף API זה בשבילך מראש. אבל חוץ מזה מה שהיית עושה הוא היית פשוט לחץ על Done. הזן את פרטי ה- API שלך. להגדיר את זה גם זחילה אוטומטית או ידנית. אז אתה יכול לעדכן אותך נתוני כל 15 דקות, שבועי, יומי, מה שאתה רוצה. שם API שלך. צור API. לטובתך, אני כבר נוצר זהורית API העמוד הראשון כבר. אז אתה פשוט ליצור חשבון בקימונו, וזה יהיה לאחסן את כל ממשקי API עבורך. אז בעצם זה כל מה ששלך שריטות שונות נפרדות. אז אם אנחנו מסתכלים כאן, זה הוא קישורי דעות שאני כבר נאסף. אלה הם תכונות קישורים כי אני כבר נאסף. ואלה לקרוא ביותר קישורים שאספתי מscape API האחרון זה. אז אם אתם יכולים לראות כאן, אלה יהיו בהשתתפות, אלה יהיו הדעות, אשר בדוגמא זו, אני כבר בשילובם כל לאוסף אחד. אבל אם אתה רק לשחק עם זה קצת, אתה יכול לפצל אותו ולחלק אותו אולם אתה רוצה עוד כעיצוב שונה במקצת. רק כדי לשחק עם זה, זחילה להגדיר, אחד החסרונות הוא רק יכול לזחול עד 25 עמודים בכל פעם. זה אחד הגורמים המגבילים. אבל כאן, אם אתה מגדיר את זה לזחילה במדריך, זה איך אתה יכול להגיד את זה כדי לעדכן את הנתונים שלך. וכאן תוכל לראות את ההיסטוריה שלך לזחול כל מה שאתה כבר זחל. ואתם יכולים לחזור, להירשם, לשחק עם כל הדרכים השונות שאתה יכול לשנות ולהשתמש בנתונים שלך. ניתן להגדיר קימונו עד לגרד קישורים בתוך קישורים. והיית עושה זאת על ידי ראשון גירוד רשימה של קישורים, ולאחר מכן באמצעות API שכ לקפוץ מנקודה לAPI אחר שאתה יוצר את התסריט. אבל זה יותר מסובך מ מה שאנחנו הולכים להיכנס להיום. אז זה קימונו. נדבר על היתרונות ו חסרונות של Nokogiri וקימונו. Nokogiri, זה ממש מהר. קל לבדוק. אתה יכול פשוט מכניס לכל דבר קונסולה, קל להגדיר. אתה יכול להחליט בדיוק מה אתה רוצה לגרד וחנות. אין גבולות דף. אני באמת השתמשתי בו כדי לגרד כמו 1,800 אתרי בית ספר בדרום אפריקה למיילים להתמחות שעשיתי. אז זה אפשרי, אם כי בפועל הטוב ביותר יהיה לפצל את התסריט. כי אם זה לא מצליח, אז אתה לא מקבל שום דבר. אבל אם אתה עושה מאה, אולי 200 עמודים בכל פעם, אז יש לך סיכוי כלשהו של לפחות מקבל את זה טיפין טיפין, במיוחד אם יש לך אינטרנט רע. למרבה הצער זה רק יכול לגרד HTML. אז אם יש לך pages-- טעון באופן דינמי ואני אראה לך דוגמא כמו קיאק בהדבר-- למרבה הצער Nokogiri לא יכול לגרד את זה. אבל הקימונו הוא גם קל לשימוש. כפי שראית, זה בעצם הצבע ולחץ. זה יכול לגרד JavaScript. למרבה הצער, יש מקסימום לכמה דפים אתה יכול לגרד. לפעמים זה קצת קשה להגדיר. זה מתבלבל. אבל זה בהחלט משהו לשקול אם אתה לא מנסה להיות לגרד תחזוקת סופר חזק. אם אתה רק רוצה לקבל כל מה שמחוץ לדף במהירות, אז הקימונו הוא באמת כלי טוב לשימוש. וכפי שציינתי קודם, יש התכונה המתקדמת של קימונו זה מראה לך כיצד גישה הייחודית HTML אלמנט, שהוא סופר שימושי גם אם אתה עובד בNokogiri. אז אם אנחנו הולכים לאתר קיאק, ל למשל, אתה יכול לראות שיש הוא-- או אולי אתה לא יכול לראות. אבל אם אני אראה לך את כתובת האתר לקיאק, זה בעצם הוא רק את כתובת אתר המקור. זאת הכתובת לפני ש שונה על ידי כל תסריטי JavaScript שהם קורה. וזה הולך להיראות אחר מבדיקת האלמנט. אז אם אתה עובר ואתה להתאים את האלמנט בדוק קוד לקוד המקור, זה הולך בעצם להיות שונה. וזה בעצם למה Nokogiri לא יכול לגרד אתרים טעונים באופן דינמי. בגלל Nokogiri הוא מגרד את כתובת המקור, ואילו קימונו הוא למעשה גירוד מה אתה בעצם רואה בבחירת אלמנט. אז אם אני עובר ואני לנסות וKimonofy קיאק, אני ממש יכול לעבור ובחר את המחיר. זה קצת יותר קשה, ובמקרה הזה, זה למעשה לראות את המחיר הזה כשונה מאלה. אז אילו אתה יכול configure-- או אם זה לא היה טעון באופן דינמי, אתה יכול להגדיר Nokogiri כדי לקבל את כל אלה. בגלל העיצוב הוא מעט שונה עבור רשימה זו כפי שהוא בהשוואה לשאר שלהם, ואתה יכול לראות כאן וזה באמת נעלם נבחרו כל מחירי הטיסה. אולי אני רוצה לבחור זמן של טיסה, כמו גם. ואני יכול לעבור ו סוג של להגדיר את זה. אני לא רוצה את זה. אני רק רוצה זמן של הטיסה הבאה. ואז אחרי כמה אלה עובר, הוא מקבל את התמונה. אז די חכם הקימונו של. זה פשוט לא ממש חזק כמו. יש כמה אחרים חלופות שאתה יכול להשתמש. ואני אראה לך אותם לכאן. אם אתה יותר בנוח ב פייתון במקום רובי אולי, יש ספרייה נקרא מרק יפה. אתה יכול להשתמש בזה. זה דומה מאוד לNokogiri. יש לו עוד כמה תכונות. אתה יכול למצוא תג HTML ו לאחר מכן לנוע למעלה או להזיז הצידה. יש PyQt. זה באמת יכול לגרד דינמי אתרים, כי זה סוג של הוא WebKit המתיימר להיות דפדפן מבלי שלמעשה להיות דפדפן. אז זה הייתי מחכה לכל JavaScript כדי לטעון ראשון, ולאחר מכן להיכנס ולנסות ולגרד את האתר. אם אתה רוצה להישאר עם רובי, אתה יכול ללכת עד רמה אחת מNokogiri. אתה יכול להשתמש בקפיברה עם עטיפת פולטרגייסט. וזה באמת יכול בעצם לעשות את אותו הדבר כPyQt, שהוא זה WebKit. מחכה לזה JavaScript כדי לטעון ראשון. אם אתה להתעסק עם זה מספיק, גם אתה יכול לקבל את זה כדי ללחוץ על דברים. אז אם יש קישור ש לא href קלאסי שבו הדרך נגישה בקלות, ו זה משהו שמזהה JavaScript לחץ, למעשה אתה יכול לעשות את זה. הספרייה הפופולרית יותר כדי לדמות משתמש הוא בJavaScript, שהוא PhantomJS. זה יכול כמובן לגרד דינמי אתרים כי זה בעצם מתיימר להיות Chrome ללא ממשק המשתמש. ואז, כמובן ביותר אבל האפשרות חזקה, האיטית ביותר, היא אוטומציה דפדפן סלניום. ולמרבה הצער, אתה לא הולך להיות מסוגל לעשות את זה בתוך IDE CS50. כי למעשה מה ש עושה הוא זה מגפי Chrome שלך, פיירפוקס, מה דפדפן כי אתה רוצה להשתמש, וזה עוקב אולי העכבר תנועה, מה שאתה מקליד ב, וזה פשוט סוג של לאוטומטי את התהליך הזה. אז זה פותח כסוג של כלי בדיקות אוטומציה אתר. אבל הרבה אנשים משתמשים ב סלניום לגרד אתרים כי יש להם אחרת הרבה קושי גירוד עם כמה מכלים האחרים, מהירים יותר אלה. אז זה כל מה שיש לי לגירוד אינטרנט. תהנה. קהל: שאלה. רוברט KRABEK: כן. קהל: האם יש מנגנון חשיש האתר כך שבעצם יכול לעבור את זה בשלב מאוחר יותר. רוברט KRABEK: כן. אז אנחנו שמים, בנו דוגמא, לשניהם, אנחנו שמים את כל האתר לתוך doc. ואז אתה באמת יכול פשוט לקחת את דוק משתנה ולכתוב אותו לקובץ. אז אם אני רוצה, אני יכול לכתוב את זה כקובץ HTML, ואז בשימוש במקום OpenURI ובקשת תלתל, אז אני רק יכול לפתוח doc HTML ולאחר מכן לחפש את זה. קהל: אבל אתה יכול לשמור הסוג של חוויה מקוונת בזמן שאתה עושה במצב לא מקוון. לדוגמה. כשאתה טיסה לכמה שעות, אני רוצה בעצם ארכיון האתר כולו. [לא ברור] רוברט KRABEK: כן, זה exactly-- כך, פשוטו כמשמעו, מה זה עושה הוא זה לוקח כל דבר שיהיה בכתובת אתר זו. אז אם רצנו תלתל, זה לוקח את כל זה HTML, וזה אחסונו בתוך דוק משתנה. אז אתה יכול לעשות מה ש אתה רוצה לעשות עם דוק. אתה יכול פלט אותו לקובץ. קהל: אבל זה לא קשור למעלה. זה לא דינמי. זה לא רקורסיבית, נכון? אתה מבין למה אני מתכוון? אני מנסה בעצם סוג של חשיש האתר כולו על הכונן הקשיח שלי כדי שאני בעצם יכול לעשות את זה במשך כמה שעות בלי אינטרנט. רוברט KRABEK: ימין. אז אם אני had-- כך איפה התיק שלי I / O? אז זה קובץ הקלט / פלט. אז אומר במקום זה, אני קורא לזה craigslist.html. הייתי לפתוח כי עד. לא הייתי לי דוק מכניס אותו. אני סוגר את הקובץ. ולאחר מכן רק בגלל IDE CS50 הוא בענן, זה כל מה ש. אני יכול ללכת כאן. אני יכול להוריד את הקובץ. ואז זה יהיה בכונן הקשיח שלי. אז אתה יכול לעשות את זה ככה. או אם אתה בבית, לא באמצעות CS50 IDE, כמו נשגב או משהו, זה אפילו יותר קל, כי כל זה זמין באופן מקומי, לא קשור לאינטרנט. קהל: אני רואה. זה לבעיה מסוימת. האם אתה יכול לעשות את זה באופן רקורסיבי, כך שאתה ללכת כמה שכבות סוג עמוק של דבר? רוברט KRABEK: אני יכול להוריד תיקיות כמו גם, אם זה מה שאתה שואל. קהל: כן. רוברט KRABEK: מגניב.