ΕΠΕΞΗΓΗΣΗ

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 10

import re #Εισαγωγή της βιβλιοθήκης για regular expressions

import string #Εισαγωγή της βιβλιοθήκης που περιέχει σταθερές σχετικές με συμβολοσειρές.

import requests #Εισαγωγή της βιβλιοθήκης για την εκτέλεση HTTP αιτημάτων.

import pandas as pd #Εισαγωγή της βιβλιοθήκης pandas για διαχείριση δεδομένων και αναφέρεται ως pd.

from bs4 import BeautifulSoup #Εισαγωγή του BeautifulSoup από την βιβλιοθήκη bs4 για την ανάλυση HTML.

# Συνάρτηση για την ανάκτηση πληροφοριών ενός επιστήμονα (SCIENTIST) από συγκεκριμένο URL

def get_scientist_info(url):

response = requests.get(url) #Στέλνει ένα HTTP αίτημα GET στο συγκεκριμένο URL και αποθηκεύει την απόκριση.

soup = BeautifulSoup(response.text, 'html.parser') #Αναλύει το HTML της απόκρισης με τη χρήση του BeautifulSoup.

name = re.sub(r'\([^)]*\)', '', soup.find('span', class_='mw-page-title-main').text.strip())

1. soup.find('span', class_='mw-page-title-main'): Αυτή η εντολή χρησιμοποιεί την βιβλιοθήκη BeautifulSoup για να βρει το
πρώτο HTML span στοιχείο με κλάση mw-page-title-main μέσα στο HTML που αναλύθηκε και αποθηκεύτηκε στην μεταβλητή
soup. Η κλάση mw-page-title-main συνήθως χρησιμοποιείται για να δηλώσει τον κύριο τίτλο μιας σελίδας στα άρθρα της
Wikipedia.
2. .text: Παίρνει το κείμενο που περιέχεται μέσα στο span στοιχείο, δηλαδή τον τίτλο της σελίδας.
3. .strip(): Αφαιρεί τα περιττά κενά από την αρχή και το τέλος του κειμένου. Αυτό βοηθά στην αφαίρεση τυχόν ανεπιθύμητων κενών
που μπορεί να υπάρχουν γύρω από τον τίτλο.
4. re.sub(r'\([^)]*\)', '', ...): Χρησιμοποιεί την βιβλιοθήκη re για να εφαρμόσει μια κανονική έκφραση (regular expression) που
αναζητά και αφαιρεί κείμενο μέσα σε παρενθέσεις. Η κανονική έκφραση r'\([^)]*\)' αναλύεται ως εξής:
o \( ... \): Αναζητά κείμενο μέσα σε παρενθέσεις. Οι παρενθέσεις πρέπει να βρίσκονται μπροστά από ανάστροφη κάθετο (\)
επειδή έχουν ειδική σημασία στις κανονικές εκφράσεις και θέλουμε να χρησιμοποιούνται χωρίς την ειδική τους σημασία
o [^)]*: Αντιστοιχεί σε οποιοδήποτε χαρακτήρα εκτός από την δεξιά παρένθεση, επαναλαμβανόμενο 0 ή περισσότερες
φορές. Αυτό σημαίνει ότι μπορεί να αναγνωρίσει οποιοδήποτε κείμενο μέσα στις παρενθέσεις.

Η συνάρτηση re.sub αντικαθιστά όλες τις περιπτώσεις κειμένου που ταιριάζουν με την τακτική έκφραση με ένα κενό string (''), δηλαδή
αφαιρεί το κείμενο μέσα στις παρενθέσεις από τον τίτλο. Συνοπτικά, η εντολή αυτή αναζητά και αφαιρεί οποιοδήποτε κείμενο
βρίσκεται μέσα σε παρενθέσεις από τον τίτλο της σελίδας που εξήχθη από το HTML, επιστρέφοντας τον καθαρισμένο τίτλο χωρίς
περιττές πληροφορίες που θα μπορούσαν να περιπλέξουν την επεξεργασία του κειμένου ή την αναγνώριση του ονόματος

surname = name.split()[-1]
Η εντολή surname = name.split()[-1] αναλύει το πλήρες όνομα (name) που έχει αποκτηθεί προηγουμένως, ώστε να εξάγει το επίθετο
του ατόμου. Ας δούμε αναλυτικά τι κάνει κάθε μέρος της εντολής:
1. name.split(): Η μέθοδος split() χρησιμοποιείται σε συμβολοσειρές (strings) για να τις διαχωρίσει σε μια λίστα από
υποσυμβολοσειρές βάσει ενός διαχωριστικού. Εάν δεν οριστεί διαχωριστικό (όπως σε αυτή την περίπτωση), τότε η split()
χρησιμοποιεί κάθε λευκό χαρακτήρα (όπως κενά, νέες γραμμές, tabs) ως διαχωριστικό. Αυτό σημαίνει ότι το name θα
διαχωριστεί σε λέξεις βάσει των κενών που τις χωρίζουν, και θα επιστραφεί μια λίστα που περιέχει αυτές τις λέξεις.
2. [-1]: Αυτό το μέρος της εντολής αναφέρεται στο τελευταίο στοιχείο της λίστας που επέστρεψε η split(). Στις Python λίστες, ο
δείκτης -1 χρησιμοποιείται για να αναφερθούμε στο τελευταίο στοιχείο, -2 για το προτελευταίο, κ.ο.κ.
Συνεπώς, η εντολή surname = name.split()[-1] λαμβάνει το πλήρες όνομα του ατόμου, το διαχωρίζει σε λέξεις βάσει των κενών, και
αποθηκεύει την τελευταία λέξη από αυτές στη μεταβλητή surname, υποθέτοντας ότι αυτή είναι το επίθετο του ατόμου. Αυτή η υπόθεση
βασίζεται στη συμβατική διάταξη των ονομάτων σε πολλές κουλτούρες, όπου το επίθετο τοποθετείται μετά το ή τα προσωπικά
ονόματα.

Η εντολή infobox = soup.find('table', class_='infobox biography vcard') χρησιμοποιείται για να αναζητήσει και να εξάγει ένα
συγκεκριμένο HTML table στοιχείο από μια ιστοσελίδα, βασιζόμενη στην κλάση CSS του πίνακα. Ας αναλύσουμε τι κάνει ακριβώς
κάθε τμήμα της εντολής:
1. soup: Αναφέρεται σε ένα αντικείμενο της βιβλιοθήκης BeautifulSoup, το οποίο έχει δημιουργηθεί προηγουμένως από την
ανάλυση (parsing) του HTML κώδικα μιας ιστοσελίδας. Το soup περιέχει τη δομή της ιστοσελίδας σε μια μορφή που
επιτρέπει την εύκολη ερώτηση και εξαγωγή συγκεκριμένων στοιχείων του HTML.
2. find('table', class_='infobox biography vcard'): Η μέθοδος find() χρησιμοποιείται για να βρει το πρώτο στοιχείο στο HTML
που ταιριάζει με τα κριτήρια αναζήτησης που δίνονται. Σε αυτή την περίπτωση, αναζητά ένα table στοιχείο ('table') που έχει
την κλάση CSS 'infobox biography vcard'.
o table: Το είδος του στοιχείου που αναζητάτε, δηλαδή ένας HTML πίνακας.
o class_='infobox biography vcard': Ορίζει την κλάση CSS του πίνακα που αναζητείται. Η χρήση της παραμέτρου
class_ (με κάτω παύλα) αντί για class (χωρίς κάτω παύλα) είναι απαραίτητη επειδή η class είναι δεσμευμένη λέξη
στην Python.

Ο συνδυασμός των τάξεων 'infobox biography vcard' συνήθως αναφέρεται σε πίνακες που περιέχουν συνοπτικές πληροφορίες για
πρόσωπα στις σελίδες της Wikipedia, όπως βιογραφικά στοιχεία, εκπαίδευση, βραβεία και άλλες πληροφορίες.
# Εξαγωγή του αριθμού των βραβείων

awards = 0

awards_section = soup.find('span', string=lambda text: text and 'awards' in text.lower())

if infobox and infobox.find('th', string='Awards'):

awards_header = infobox.find('th', string='Awards')

awards_row = awards_header.find_parent('tr')

awards_cell = awards_row.find('td')

if awards_cell.find_all('li'):

awards = len(awards_cell.find_all('li'))

else:

awards = len(awards_cell.find_all('a', attrs={'title': True}))

elif awards_section:

awards_list = awards_section.find_next('ul').find_all('li')

awards += len(awards_list)

1. awards = 0: Αρχικοποιεί τη μεταβλητή awards με τιμή 0. Αυτή η μεταβλητή θα χρησιμοποιηθεί για την καταμέτρηση του συνολικού
αριθμού των βραβείων.
2. awards_section = soup.find('span', string=lambda text: text and 'awards' in text.lower()): Αναζητά στο HTML ένα <span> στοιχείο το οποίο
περιέχει το κείμενο "awards". Χρησιμοποιείται μια λάμβδα συνάρτηση για να ελέγξει αν το κείμενο υπάρχει και αν περιέχει τη λέξη
"awards" σε πεζά γράμματα. Η μεταβλητή soup υποθέτουμε ότι περιέχει το αναλυμένο HTML.
3. if infobox and infobox.find('th', string='Awards'):: Ελέγχει αν υπάρχει ένα στοιχείο infobox και αν μέσα σε αυτό υπάρχει ένα <th> στοιχείο
με κείμενο "Awards". Η infobox υποθέτουμε ότι είναι μια μεταβλητή που αναπαριστά ένα τμήμα της σελίδας HTML που περιέχει
πληροφορίες σε μορφή πίνακα ή κάτι παρόμοιο.
4. awards_header = infobox.find('th', string='Awards'): Αναθέτει στη μεταβλητή awards_header το <th> στοιχείο με κείμενο "Awards".
5. awards_row = awards_header.find_parent('tr'): Βρίσκει τη γονική σειρά <tr> του awards_header, δηλαδή τη σειρά του πίνακα στην οποία
ανήκει το <th> στοιχείο.
6. awards_cell = awards_row.find('td'): Βρίσκει το <td> στοιχείο μέσα στη σειρά awards_row, το οποίο υποθέτουμε ότι περιέχει τις
πληροφορίες για τα βραβεία.
7. if awards_cell.find_all('li'):: Ελέγχει αν μέσα στο awards_cell υπάρχουν στοιχεία <li>, δηλαδή αν οι πληροφορίες για τα βραβεία είναι
διατυπωμένες σε μορφή λίστας.
8. awards = len(awards_cell.find_all('li')): Αν υπάρχουν στοιχεία <li>, αναθέτει στη μεταβλητή awards τον αριθμό τους, δηλαδή τον αριθμό
των βραβείων.
9. else: awards = len(awards_cell.find_all('a', attrs={'title': True})): Αν δεν υπάρχουν στοιχεία <li>, αναζητά συνδέσμους (<a>) με το
χαρακτηριστικό title και αναθέτει τον αριθμό τους στη μεταβλητή awards.
10. elif awards_section:: Αν δεν βρέθηκε infobox με τα στοιχεία για τα βραβεία, αλλά υπάρχει το awards_section που βρέθηκε νωρίτερα,
11. awards_list = awards_section.find_next('ul').find_all('li'): Βρίσκει την επόμενη λίστα <ul> μετά το awards_section και από αυτήν λαμβάνει
όλα τα <li> στοιχεία, δηλαδή τα βραβεία.
12. awards += len(awards_list): Προσθέτει τον αριθμό των βραβείων που βρέθηκαν στο awards_list στην αρχική τιμή της μεταβλητής awards.
Αυτή η διαδικασία επιτρέπει την εύρεση και καταμέτρηση των βραβείων με διάφορους τρόπους ανάλογα με τη δομή της σελίδας HTML, είτε μέσω
της αναζήτησης σε πίνακες (infobox) είτε μέσω ενοτήτων κειμένου (awards_section).
# Εξαγωγή κειμένου σχετικά με την εκπαίδευση

education = ''

education_section = soup.find('span', string=lambda text: text and 'education' in text.lower(), attrs={'id': True})

if education_section:

education_list = []

sibling = education_section.find_next()

while sibling and sibling.name not in ['h2', 'h3']:

if sibling.name == 'p':

education_list.append(sibling.text.strip())

sibling = sibling.find_next()

education = ' '.join(education_list)

return name, surname, awards, education

# Επιστρέφει το όνομα, το επίθετο, τον αριθμό των βραβείων και την εκπαίδευση.

education = ''
Αρχικοποιεί μια μεταβλητή education με κενό string. Αυτή η μεταβλητή θα χρησιμοποιηθεί για να αποθηκεύσει τις πληροφορίες
εκπαίδευσης που θα εξαχθούν.
education_section = soup.find('span', string=lambda text: text and 'education' in text.lower(), attrs={'id': True})
Αναζητά στο HTML για ένα στοιχείο span το οποίο περιέχει τη λέξη "education" στο κείμενό του (αγνοώντας τα κεφαλαία και τα
μικρά γράμματα), και πρέπει επίσης να έχει ένα id. Η μεταβλητή education_section θα περιέχει αυτό το στοιχείο εάν βρεθεί.
if education_section:
Ελέγχει αν βρέθηκε το στοιχείο education_section. Αν ναι, συνεχίζει με την εξαγωγή των σχετικών πληροφοριών.
education_list = []
Δημιουργεί μια κενή λίστα education_list που θα χρησιμοποιηθεί για να αποθηκευτούν τα κείμενα που αφορούν την εκπαίδευση.
sibling = education_section.find_next()
Βρίσκει το επόμενο στοιχείο στην ιεραρχία του HTML που βρίσκεται μετά το education_section. Αυτό το στοιχείο θα εξεταστεί για να
διαπιστωθεί αν περιέχει πληροφορίες εκπαίδευσης.
while sibling and sibling.name not in ['h2', 'h3']:
Ξεκινάει έναν βρόχο που θα συνεχιστεί όσο υπάρχουν "αδερφά" στοιχεία για εξέταση, και αυτά τα στοιχεία δεν είναι επικεφαλίδες ( h2
ή h3), υπονοώντας ότι ανήκουν στην ενότητα εκπαίδευσης.
if sibling.name == 'p':
Ελέγχει αν το τρέχον "αδερφό" στοιχείο είναι ένα παράγραφο (p). Αν ναι, σημαίνει ότι περιέχει κείμενο που ενδεχομένως αφορά την
εκπαίδευση.
education_list.append(sibling.text.strip())
Προσθέτει το κείμενο του παραγράφου στη λίστα education_list, αφού αφαιρέσει τυχόν περιττά κενά στην αρχή και στο τέλος.
sibling = sibling.find_next()
Μετακινείται στο επόμενο "αδερφό" στοιχείο για να συνεχίσει την εξέταση.
education = ' '.join(education_list)
Μετατρέπει τη λίστα με τα κείμενα της εκπαίδευσης σε ένα μοναδικό string, χρησιμοποιώντας ένα κενό ως διαχωριστικό.
return name, surname, awards, education
Επιστρέφει το όνομα, το επίθετο, τον αριθμό των βραβείων και τις πληροφορίες εκπαίδευσης που εξήχθησαν.
Ο κώδικας αυτός δείχνει πώς μπορεί να γίνει αποδοτικά η εξαγωγή και η επεξεργασία ειδικών τμημάτων πληροφοριών από ένα μεγάλο
HTML έγγραφο, επικεντρώνοντας σε συγκεκριμένες ενότητες κειμένου.
# Συνάρτηση για τον υπολογισμό των δημοσιεύσεων στο DBLP

def count_dblp_publications(name):

search_name = '+'.join(name.split()) # Μετατρέπει τα κενά σε '+' για την αναζήτηση URL.

search_url = f'https://dblp.org/search/author?q={search_name}' # Δημιουργία του URL αναζήτησης.

response = requests.get(search_url) # Αίτημα GET στο DBLP.

if response.status_code != 200:

return 0 # Εάν η απόκριση δεν είναι επιτυχής, επιστρέφει 0.

soup = BeautifulSoup(response.content, 'html.parser') # Ανάλυση της απάντησης.

publ_section = soup.find('div', id='publ-section') # Εύρεση της ενότητας δημοσιεύσεων.

if not publ_section:

return 0 # Εάν δεν βρεθεί η ενότητα, επιστρέφει 0.

entries = publ_section.find_all('li', class_='entry') # Εύρεση όλων των στοιχείων δημοσίευσης.

return len(entries) # Επιστρέφει τον αριθμό των δημοσιεύσεων.

Αυτός ο κώδικας προορίζεται για την αναζήτηση και την καταμέτρηση των δημοσιεύσεων ενός συγκεκριμένου συγγραφέα στη βάση δεδομένων
DBLP, η οποία είναι μια εκτενής βάση δεδομένων για βιβλιογραφικές πληροφορίες σχετικά με επιστημονικές δημοσιεύσεις στον τομέα της
πληροφορικής. Παρακάτω ακολουθεί μια γραμμή προς γραμμή επεξήγηση του κώδικα στα Ελληνικά:
def count_dblp_publications(name):
Ορίζει μια συνάρτηση με όνομα count_dblp_publications η οποία δέχεται ως παράμετρο το name, το όνομα του συγγραφέα για τον οποίο θέλουμε να
βρούμε τις δημοσιεύσεις.
search_name = '+'.join(name.split())
Μετατρέπει το όνομα του συγγραφέα σε μια μορφή κατάλληλη για URL, αντικαθιστώντας τα κενά μεταξύ των λέξεων με το σύμβολο +. Αυτό είναι
χρήσιμο για τη δημιουργία της διεύθυνσης URL της αναζήτησης.
search_url = f'https://dblp.org/search/author?q={search_name}'
Δημιουργεί τη διεύθυνση URL για την αναζήτηση του συγγραφέα στην DBLP, χρησιμοποιώντας το μορφοποιημένο όνομα.
print("Searching DBLP records for", name, "...")
Εκτυπώνει ένα μήνυμα που ενημερώνει τον χρήστη για την αναζήτηση στα αρχεία της DBLP για το συγκεκριμένο όνομα.
response = requests.get(search_url)
Στέλνει ένα HTTP GET αίτημα στη διεύθυνση URL που δημιουργήθηκε και αποθηκεύει την απόκριση.
if response.status_code != 200:
print("Failed to retrieve search results for", name)
return 0
Ελέγχει αν η απόκριση από την ιστοσελίδα είναι επιτυχής (κωδικός κατάστασης 200). Αν δεν είναι, εκτυπώνει ένα μήνυμα λάθους και επιστρέφει 0,
υποδηλώνοντας ότι δεν βρέθηκαν δημοσιεύσεις.
soup = BeautifulSoup(response.content, 'html.parser')
Δημιουργεί ένα αντικείμενο BeautifulSoup από το περιεχόμενο της απόκρισης, το οποίο διευκολύνει την ανάλυση και την εξαγωγή δεδομένων από
HTML.
publ_section = soup.find('div', id='publ-section')
Αναζητά στο HTML το στοιχείο div με το id publ-section, το οποίο περιέχει τις δημοσιεύσεις του συγγραφέα.
if not publ_section:
print("Publication section not found for", name)
return 0
Ελέγχει αν βρέθηκε η ενότητα με τις δημοσιεύσεις. Αν όχι, εκτυπώνει μήνυμα λάθους και επιστρέφει 0.
entries = publ_section.find_all('li', class_='entry')
Αναζητά όλα τα στοιχεία li με την κλάση entry μέσα στην ενότητα των δημοσιεύσεων, τα οποία αντιπροσωπεύουν τις δημοσιεύσεις.
print(len(entries), "publications found for", name, "!")
Εκτυπώνει τον αριθμό των βρεθέντων δημοσιεύσεων για τον συγκεκριμένο συγγραφέα.
return len(entries)
Επιστρέφει τον αριθμό των δημοσιεύσεων.
Αυτός ο κώδικας αποτελεί μια απλή, αλλά ισχυρή εφαρμογή για την αυτοματοποιημένη αναζήτηση και καταμέτρηση των επιστημονικών
δημοσιεύσεων ενός συγγραφέα στην DBLP.
# Συνάρτηση για την ανάκτηση URL επιστημόνων από τη Wikipedia

def get_urls():

url = "https://en.wikipedia.org/wiki/List_of_computer_scientists" # URL της λίστας επιστημόνων.

response = requests.get(url) # Αίτημα GET στην Wikipedia.

soup = BeautifulSoup(response.content, "html.parser") # Ανάλυση της απάντησης.

# Εύρεση όλων των span που περιέχουν κείμενο αντιστοιχούμενο στα γράμματα της αλφαβήτου

span_tags = soup.find_all("span", string=lambda text: text and text in list(string.ascii_uppercase))

href_list = [] # Λίστα για την αποθήκευση των URLs.

for span in span_tags:

ul_parent = span.find_next("ul") # Εύρεση της λίστας που ακολουθεί κάθε span.

if ul_parent:

list_items = ul_parent.find_all("li") # Εύρεση όλων των στοιχείων της λίστας.

for item in list_items:

anchor = item.find_next("a") # Εύρεση του συνδέσμου σε κάθε στοιχείο της λίστας.

if anchor:

href = 'https://en.wikipedia.org' + anchor.get("href") # Κατασκευή του πλήρους URL.

href_list.append(href) # Προσθήκη του URL στη λίστα.

return href_list # Επιστρέφει τη λίστα με τα URLs.

def get_urls():
Ορίζει μια συνάρτηση με το όνομα get_urls, η οποία δεν δέχεται καμία παράμετρο.
url = "https://en.wikipedia.org/wiki/List_of_computer_scientists"
Αποθηκεύει τη διεύθυνση URL της σελίδας της Wikipedia που περιέχει τη λίστα των επιστημόνων πληροφορικής σε μια μεταβλητή
url.
response = requests.get(url)
Στέλνει ένα HTTP GET αίτημα στη διεύθυνση URL και αποθηκεύει την απάντηση στη μεταβλητή response.
soup = BeautifulSoup(response.content, "html.parser")
Δημιουργεί ένα αντικείμενο BeautifulSoup για την ανάλυση του HTML περιεχομένου της απάντησης, χρησιμοποιώντας τον parser
html.parser.
span_tags = soup.find_all("span", string=lambda text: text and text in list(string.ascii_uppercase))
Αναζητά όλα τα span στοιχεία στο HTML τα οποία περιέχουν κείμενο αντιστοιχούμενο στα γράμματα του αλφαβήτου (A-Z),
χρησιμοποιώντας μια λογική συνάρτηση για τον έλεγχο του κειμένου.
href_list = []
Δημιουργεί μια κενή λίστα href_list για την αποθήκευση των URLs των σελίδων των επιστημόνων.
for span in span_tags:
Εκτελεί έναν βρόχο για κάθε span στοιχείο που βρέθηκε, το οποίο αντιστοιχεί σε κάθε γράμμα του αλφαβήτου.
ul_parent = span.find_next("ul")
Για κάθε span, βρίσκει την πρώτη λίστα ul που ακολουθεί, η οποία περιέχει τα ονόματα των επιστημόνων.
if ul_parent:
Ελέγχει αν βρέθηκε μια λίστα ul.
list_items = ul_parent.find_all("li")
Αναζητά όλα τα στοιχεία li μέσα στη λίστα, τα οποία περιέχουν τα ονόματα και τους συνδέσμους των επιστημόνων.
for item in list_items:
Εκτελεί έναν βρόχο για κάθε στοιχείο της λίστας.
anchor = item.find_next("a")
Αναζητά τον πρώτο σύνδεσμο a μέσα σε κάθε στοιχείο της λίστας, ο οποίος περιέχει το URL της σελίδας του επιστήμονα.
if anchor:
Ελέγχει αν βρέθηκε ένας σύνδεσμος a.
href = 'https://en.wikipedia.org' + anchor.get("href")
Δημιουργεί το πλήρες URL της σελίδας του επιστήμονα, προσθέτοντας το πρόθεμα της διεύθυνσης της Wikipedia στο path που
ανακτάται από τον σύνδεσμο.
href_list.append(href)
Προσθέτει το πλήρες URL στη λίστα href_list.
return href_list
Επιστρέφει τη λίστα με τα URLs των σελίδων των επιστημόνων πληροφορικής από τη Wikipedia.
Με αυτόν τον τρόπο, η συνάρτηση get_urls ανακτά και επιστρέφει μια λίστα με τα URLs των επιστημονικών σελίδων πληροφορικής
από μια συγκεκριμένη λίστα στη Wikipedia, παρέχοντας μια χρήσιμη πηγή πληροφοριών για περαιτέρω έρευνα ή αναφορά.
if __name__ == '__main__':

print("Extracting URLs...", end=' ') # Εκτύπωση μηνύματος προόδου.

scientists = get_urls() # Ανάκτηση URLs των επιστημόνων.

print("[done]") # Εκτύπωση μηνύματος ολοκλήρωσης.

data_for_df = [] # Λίστα για τα δεδομένα που θα περιληφθούν στο DataFrame.

print("Extracting scientists' info...", end=' ') # Εκτύπωση μηνύματος προόδου.

for scientist_url in scientists:

name, surname, awards, education = get_scientist_info(scientist_url) # Ανάκτηση πληροφοριών για κάθε επιστήμονα.

publications = count_dblp_publications(name) # Υπολογισμός των δημοσιεύσεων.

if education:

data_for_df.append([surname, awards, education, publications]) # Προσθήκη των δεδομένων στη λίστα.

print(surname, awards, education, publications) # Εκτύπωση των πληροφοριών.

print("[done]") # Εκτύπωση μηνύματος ολοκλήρωσης.

# Δημιουργία DataFrame και αποθήκευση σε CSV.

df = pd.DataFrame(data_for_df, columns=['surname', 'awards', 'education', 'publications'])

df[['surname', 'awards', 'education', 'publications']].to_csv('scientists_data.csv', index=False)

print("CSV file created successfully!") # Εκτύπωση μηνύματος επιτυχούς δημιουργίας αρχείου CSV.

Αυτός ο κώδικας σε Python είναι σχεδιασμένος για να εκτελείται ως κύριο πρόγραμμα, να ανακτά πληροφορίες για επιστήμονες από
διαδίκτυο, να τις επεξεργάζεται και στη συνέχεια να δημιουργεί ένα αρχείο CSV με τα συγκεντρωμένα δεδομένα. Ας εξηγήσουμε
λεπτομερώς κάθε γραμμή του κώδικα:
1. if __name__ == '__main__':: Αυτός ο έλεγχος διασφαλίζει ότι ο κώδικας που ακολουθεί θα εκτελεστεί μόνο αν το σκριπτ
τρέχει ως κύριο πρόγραμμα, και όχι όταν εισάγεται ως μονάδα λογισμικού (module) σε άλλο σκριπτ.
2. print("Extracting URLs...", end=' '): Εκτυπώνει ένα μήνυμα στην οθόνη που ενημερώνει τον χρήστη ότι ξεκινά η διαδικασία
εξαγωγής των URL. Η παράμετρος end=' ' σημαίνει ότι δεν θα γίνει νέα γραμμή μετά το μήνυμα.
3. scientists = get_urls(): Καλεί τη συνάρτηση get_urls(), η οποία υποθέτουμε ότι επιστρέφει μια λίστα URL σχετικών με
επιστήμονες. Τα URL αυτά αποθηκεύονται στη μεταβλητή scientists.
4. print("[done]"): Εκτυπώνει το μήνυμα [done] για να ενημερώσει τον χρήστη ότι η διαδικασία εξαγωγής των URL
ολοκληρώθηκε.
5. data_for_df = []: Δημιουργεί μια κενή λίστα που θα χρησιμοποιηθεί αργότερα για να αποθηκευτούν τα δεδομένα των
επιστημόνων προς εισαγωγή σε ένα DataFrame.
6. print("Extracting scientists' info...", end=' '): Εκτυπώνει ένα μήνυμα που ενημερώνει τον χρήστη για την έναρξη της
διαδικασίας εξαγωγής πληροφοριών των επιστημόνων.
7. for scientist_url in scientists:: Έναρξη ενός βρόχου που επαναλαμβάνεται για κάθε URL επιστήμονα στη λίστα scientists.
8. name, surname, awards, education = get_scientist_info(scientist_url): Καλεί τη συνάρτηση get_scientist_info() για κάθε URL
επιστήμονα, επιστρέφοντας το όνομα, το επίθετο, τα βραβεία και τα εκπαιδευτικά στοιχεία.
9. publications = count_dblp_publications(name): Υπολογίζει τον αριθμό των δημοσιεύσεων για κάθε επιστήμονα με βάση το
όνομα, καλώντας τη συνάρτηση count_dblp_publications().
10. if education:: Ελέγχει αν υπάρχουν διαθέσιμα στοιχεία για την εκπαίδευση του επιστήμονα.
11. data_for_df.append([surname, awards, education, publications]): Αν υπάρχουν στοιχεία εκπαίδευσης, προσθέτει τις
πληροφορίες του επιστήμονα στη λίστα data_for_df.
12. print(surname, awards, education, publications): Εκτυπώνει τις πληροφορίες για κάθε επιστήμονα.
13. print("[done]"): Εκτυπώνει το μήνυμα [done] για να ενημερώσει τον χρήστη ότι η διαδικασία εξαγωγής πληροφοριών των
επιστημόνων ολοκληρώθηκε.
14. df = pd.DataFrame(data_for_df, columns=['surname', 'awards', 'education', 'publications']): Δημιουργεί ένα DataFrame από τη
λίστα data_for_df με τις στήλες που ορίζονται.
15. df[['surname', 'awards', 'education', 'publications']].to_csv('scientists_data.csv', index=False): Αποθηκεύει το DataFrame σε ένα
αρχείο CSV με όνομα scientists_data.csv, χωρίς να περιλαμβάνει τον δείκτη των γραμμών.
16. print("CSV file created successfully!"): Εκτυπώνει ένα μήνυμα που ενημερώνει τον χρήστη για την επιτυχή δημιουργία του
αρχείου CSV.
Συνολικά, αυτός ο κώδικας αποτελεί ένα πλήρες παράδειγμα εξαγωγής, επεξεργασίας και αποθήκευσης δεδομένων σε αρχείο CSV,
χρησιμοποιώντας τη γλώσσα προγραμματισμού Python.

You might also like