כיצד לבנות סורק כתובות אתרים למפות אתר באמצעות Python

פרויקט פשוט ללימוד יסודות הגרידה ברשת

לפני שנתחיל, בואו נוודא שאנחנו מבינים מה זה גירוד באינטרנט:

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

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

התוכנית שלנו תעבוד כך:

  1. בקר בדף אינטרנט
  2. גרד את כל כתובות האתר הייחודיות שנמצאו בדף האינטרנט והוסף אותן לתור
  3. עיבוד רקורטיבי של כתובות אתרים אחת אחת עד שנמצה את התור
  4. הדפס תוצאות

קודם כל

הדבר הראשון שעלינו לעשות הוא לייבא את כל הספריות הדרושות. אנו נשתמש ב- BeautifulSoup, בקשות ו- urllib לגרידה באינטרנט.

from bs4 import BeautifulSoupimport requestsimport requests.exceptionsfrom urllib.parse import urlsplitfrom urllib.parse import urlparsefrom collections import deque

לאחר מכן, עלינו לבחור כתובת URL שתתחיל לסרוק ממנה. בזמן שאתה יכול לבחור בכל דף אינטרנט עם קישורי HTML, אני ממליץ להשתמש ב- ScrapeThisSite. זהו ארגז חול בטוח שתוכל לזחול מבלי להסתבך.

url = “//scrapethissite.com”

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

# a queue of urls to be crawled nextnew_urls = deque([url])

לאחר מכן נוכל להשתמש בערכה לאחסון כתובות אתרים ייחודיות לאחר עיבודן:

# a set of urls that we have already processed processed_urls = set()

אנו רוצים לעקוב אחר כתובות אתרים מקומיות (אותו תחום כמו היעד), זרה (דומיין שונה כיעד) וכתובות אתרים שבורות:

# a set of domains inside the target websitelocal_urls = set()
# a set of domains outside the target websiteforeign_urls = set()
# a set of broken urlsbroken_urls = set()

זמן לזחול

עם כל זה במקום, כעת אנו יכולים להתחיל לכתוב את הקוד בפועל לסריקת האתר.

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

# process urls one by one until we exhaust the queuewhile len(new_urls): # move url from the queue to processed url set url = new_urls.popleft() processed_urls.add(url) # print the current url print(“Processing %s” % url)

לאחר מכן, הוסף חריג כדי לתפוס דפי אינטרנט שבורים והוסף אותם broken_urlsלסט לשימוש מאוחר יותר:

try: response = requests.get(url)
except(requests.exceptions.MissingSchema, requests.exceptions.ConnectionError, requests.exceptions.InvalidURL, requests.exceptions.InvalidSchema): # add broken urls to it’s own set, then continue broken_urls.add(url) continue

לאחר מכן עלינו לקבל את כתובת ה- URL הבסיסית של דף האינטרנט כדי שנוכל להבדיל בין כתובות מקומיות וזרות:

# extract base url to resolve relative linksparts = urlsplit(url)base = “{0.netloc}”.format(parts)strip_base = base.replace(“www.”, “”)base_url = “{0.scheme}://{0.netloc}”.format(parts)path = url[:url.rfind(‘/’)+1] if ‘/’ in parts.path else url

אתחל את BeautifulSoup כדי לעבד את מסמך ה- HTML:

soup = BeautifulSoup(response.text, “lxml”)

עכשיו גרד את דף האינטרנט עבור כל הקישורים ובצע מיון והוסף אותם לערכה המתאימה להם:

for link in soup.find_all(‘a’): # extract link url from the anchor anchor = link.attrs[“href”] if “href” in link.attrs else ‘’
if anchor.startswith(‘/’): local_link = base_url + anchor local_urls.add(local_link) elif strip_base in anchor: local_urls.add(anchor) elif not anchor.startswith(‘http’): local_link = path + anchor local_urls.add(local_link) else: foreign_urls.add(anchor)

מכיוון שאני רוצה להגביל את הסורק שלי לכתובות מקומיות בלבד, אני מוסיף את הדברים הבאים כדי להוסיף כתובות URL חדשות לתור שלנו:

for i in local_urls: if not i in new_urls and not i in processed_urls: new_urls.append(i)

אם אתה רוצה לסרוק את כל כתובות האתרים השתמש:

if not link in new_urls and not link in processed_urls: new_urls.append(link)

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

הנה כל הקוד שלי:

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

לסיכום

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

אם יש לך המלצות, טיפים או משאבים נוספים, אנא שתף ​​בתגובות!

תודה שקראת! אם אהבתם את המדריך הזה ואתם רוצים עוד תוכן כזה, הקפידו לנפץ את כפתור ההמשך. ❤️

הקפד גם לבדוק את האתר שלי, טוויטר, לינקדאין וגיתוב.