הדלס מי?

08/02/2019

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

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

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

$ pip install selenium

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

http://chromedriver.chromium.org/downloads

עכשיו אפשר לעבור לתוכניות הדוגמא - ראינו כאן לפני כמה ימים איך להדפיס את כל הכותרות מאתר ynet דרך שורת הפקודה. הנה אותן הכותרות הפעם עם סלניום וכרום נטול ראש:

import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

CHROMEDRIVER_PATH = '/Users/ynonperek/bin/chromedriver'

options = Options()
options.headless = True
driver = webdriver.Chrome(CHROMEDRIVER_PATH, chrome_options=options)

# Start Here
driver.get("https://www.ynet.co.il/home/0,7340,L-184,00.html")
news = driver.find_elements_by_css_selector('a.smallheader')
for item in news:
    print(item.text)

driver.close()

החלק הראשון שמופיע לפני ה Start Here הוא הגדרת הכלים. אנחנו צריכים להגיד לסלניום איפה הוא יכול למצוא את הדרייבר שהורדנו ושאנחנו רוצים לרוץ ללא ראש. מכאן ממשיכים כמו בתוכנית סלניום רגילה רק במקום לבדוק שדברים נמצאים במקום אנחנו משתמשים בהם כדי להדפיס את המידע.

באותו האופן נוכל להדפיס את הכותרות מאתר רוטר:

import os  
from selenium import webdriver  
from selenium.webdriver.chrome.options import Options  

CHROMEDRIVER_PATH = '/Users/ynonperek/bin/chromedriver'

options = Options()
options.headless = True
driver = webdriver.Chrome(CHROMEDRIVER_PATH, chrome_options=options)

# Start Here
driver.get("http://rotter.net/")
news = driver.find_elements_by_css_selector('a[target="news"] span')
for item in news:
    print(item.text)

driver.close()

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

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

אוהבים Web Scraping? שבוע הבא ביום חמישי בבוקר אני מתכנן להעביר וובינר בנושא שם אראה את כל הדוגמאות מכל הפוסטים האלה ועוד ויהיה גם מקום לשאלות. אם אתם פנויים מוזמנים להצטרף דרך הקישור:

https://www.tocode.co.il/workshops/64