המילים שנוני מוזס הכי אוהב
שימוש אחד של Web Scraping הוא לביצוע פעולות או שליפת מידע בצורה אוטומטית. לדוגמא אנחנו יכולים לכתוב סקריפט שבאופן אוטומטי יבדוק מחיר של מוצר באמזון כל בוקר ואם המחיר נמוך במיוחד ישלח לנו אימייל.
שימוש אחר של Web Scraping, עליו ארצה לדבר היום, הוא היכולת להסתכל במכה אחת על המון מידע ברשת ולהגיע למסקנות שבצורה ידנית היה קשה מאוד להגיע אליהן. בתחום של Machine Learning אתם תפגשו אנשים שלוקחים את המידע מהרשת ונותנים למחשב להבין מתוך מידע זה מה הולך לקרות מחר. וגם בלי Machine Learning אפשר לעשות דברים מעניינים עם מידע כשמסתכלים עליו אחרת ממה שמי שכתב אותו התכוון.
כך בשביל למצוא את המילים שנוני מוזס הכי אוהב אפשר להסתכל בכל המבזקים ב ynet ולספור כמה פעמים מופיעה כל מילה במבזקים.
כשאנחנו רוצים לקחת את כל המילים באתר בכל הדפים שלו עדיף לשלוח מספר בקשות במקביל (באזור ה 8-10 במקביל נותן תוצאה טובה). 8 בקשות במקביל עובר מתחת לרדאר של רוב האתרים, בוודאי הגדולים. לפני כמה ימים פרסמתי כאן דוגמת קוד שמביאה את כל המבזקים מ ynet:
import requests
from bs4 import BeautifulSoup
url = 'https://www.ynet.co.il/home/0,7340,L-184,00.html'
r = requests.get(url)
soup = BeautifulSoup(r.text)
for link in soup.select('a.smallheader'):
print(link.text)
עכשיו אנחנו רוצים להמשיך את התוכנית הזאת צעד נוסף - עבור כל מבזק נרצה לקחת הכתבה עצמה ולספור את המילים שבה. בשביל לפתוח מספר בקשות רשת במקביל אני משתמש בספריה שנקראת requests_futures
. הספריה מאוד פשוטה ועובדת בממשק שנראה כמו requests, רק שהיא שולחת את הבקשות במקביל ומאפשרת לכם להוסיף קוד טיפול בכל תשובה.
בהנחה שיש לכם רשימה של URL-ים תוכלו להשתמש בקוד שנראה בערך כך כדי להביא את כולם מהרשת במקביל ולראות את סטטוס התשובה של כל אחד:
q = [session.get(url) for url in urls]
results = [f.result() for f in q]
ובתוך תוכנית מלאה הסיפור נראה כך:
import requests
from bs4 import BeautifulSoup
from requests_futures.sessions import FuturesSession
import collections
url = 'https://www.ynet.co.il/home/0,7340,L-184,00.html'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html5lib')
urls = [f'https://www.ynet.co.il{item.get("href")}' for item in soup.select('a.smallheader')]
word_counter = collections.Counter()
def parse_ynet_article(resp, *args, **kwargs):
page = BeautifulSoup(resp.text, 'html5lib')
text = page.select('.art_body span')[0].text
word_counter.update(text.split())
session = FuturesSession()
session.hooks['response'] = parse_ynet_article
q = [session.get(url) for url in urls]
results = [f.result() for f in q]
print(word_counter)
הפונקציה parse_ynet_article
תקרא באופן אוטומטי בכל פעם שהסקריפט סיים להוריד כתבה מ ynet. היא מפענחת את ה HTML, סופרת את המילים בתוכן הכתבה ומוסיפה אותן ל Counter. כל זה קורה מ-8 תהליכונים במקביל ומנוהל באופן אוטומטי על ידי requests_futures
. בצורה דומה יכולתם לשמור את כל ה HTML-ים של האתר אליכם או לעשות כל עיבוד אחר על התוכן.