by Ahad Sheriff
a simple project for learning the fundamentals of web scraping
ennen kuin aloitamme, varmistakaamme, että ymmärrämme, mitä tietojen kaavinta on:
tietojen kaavinta on prosessi, jossa tietoja kerätään verkkosivustoilta, jotta ne voidaan esittää muodossa, josta käyttäjät voivat helposti saada tolkkua.
tässä opetusohjelmassa haluan osoittaa, kuinka helppoa on rakentaa Python-kielelle yksinkertainen URL-telaketjulaite, jota voi käyttää verkkosivujen kartoittamiseen. Vaikka tämä ohjelma on suhteellisen yksinkertainen, se voi tarjota hyvä johdatus perusteet tietojen kaavinta ja automaatio. Keskitymme rekursiivisesti poimimaan linkkejä verkkosivuilta, mutta samoja ideoita voidaan soveltaa lukemattomiin muihin ratkaisuihin.
ohjelmamme toimii näin:
- käy verkkosivulla
- Kaavi Kaikki verkkosivulta löytyneet yksilölliset URL-osoitteet ja lisää ne jonoon
- prosessoi URL-osoitteita rekursiivisesti yksi kerrallaan, kunnes poistamme jonon
- Tulostustulokset
First Things First
ensimmäinen asia, joka meidän pitäisi tehdä, on tuoda kaikki tarvittavat kirjastot. Käytämme BeautifulSoup, pyynnöt, ja urlib tietojen kaavinta verkosta.
from bs4 import BeautifulSoupimport requestsimport requests.exceptionsfrom urllib.parse import urlsplitfrom urllib.parse import urlparsefrom collections import deque
seuraavaksi pitää valita URL, josta alkaa ryömiä. Vaikka voit valita minkä tahansa verkkosivun HTML-linkkejä, suosittelen ScrapeThisSite. Se on turvallinen hiekkalaatikko, jota voi ryömiä joutumatta vaikeuksiin.
url = "https://scrapethissite.com"
seuraavaksi meidän on luotava uusi deque-objekti, jotta voimme helposti lisätä juuri löydettyjä linkkejä ja poistaa ne, kun olemme käsitelleet niitä. Esipopuloi deque kanssa url
muuttuja:
# a queue of urls to be crawled nextnew_urls = deque()
voimme sitten käyttää joukko tallentaa ainutlaatuinen URL: n, kun ne on käsitelty:
# a set of urls that we have already processed processed_urls = set()
haluamme myös seurata paikallisia (sama verkkotunnus kuin kohde), ulkomaisia (eri verkkotunnus kuin kohde), ja rikki URL:
# 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()
Aika Ryömiä
kaikki, että paikka, nyt voimme alkaa kirjoittaa varsinaista koodia indeksoida verkkosivuilla.
haluamme tarkastella kunkin URL jonossa, nähdä, jos on olemassa muita URL: n sisällä että sivun ja lisää kunkin yksi vuoden jono, kunnes niitä ei ole jäljellä. Heti kaavinta URL, me poistaa sen jonosta ja lisää se processed_urls
aseta myöhempää käyttöä varten.
# 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)
lisää seuraavaksi poikkeuslupa rikkinäisten verkkosivujen nappaamiseen ja lisää ne broken_urls
– sarjaan myöhempää käyttöä varten:
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
sitten meidän täytyy saada pohja URL verkkosivun, jotta voimme helposti erottaa paikallisia ja ulkomaisia osoitteita:
# 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 if '/' in parts.path else url
alustaa BeautifulSoup HTML-asiakirjan käsittelemiseksi:
soup = BeautifulSoup(response.text, "lxml")
nyt Kaavi web-sivun kaikki linkit ja lajitella lisätä ne niiden vastaava joukko:
for link in soup.find_all('a'): # extract link url from the anchor anchor = link.attrs 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)
koska haluan rajoittaa telaketjuni vain paikallisiin osoitteisiin, lisään seuraavat lisätäkseni uusia URL-osoitteita jonoomme:
for i in local_urls: if not i in new_urls and not i in processed_urls: new_urls.append(i)
jos haluat indeksoida kaikki URL-osoitteet:
if not link in new_urls and not link in processed_urls: new_urls.append(link)
Varoitus: Miten ohjelma tällä hetkellä toimii, indeksointi ulkomaisten URL: n kestää hyvin kauan. Voisit mahdollisesti joutua vaikeuksiin kaavinta sivustoja ilman lupaa. Käytä omalla vastuullasi!
tässä on kaikki minun koodini:
ja niin sen pitääkin olla. Olet juuri luonut yksinkertaisen työkalun ryömiä verkkosivuilla ja kartta kaikki URL löytyy!
johtopäätöksenä
voitte vapaasti kehittää ja parantaa tätä koodia. Ohjelmaa voisi esimerkiksi muokata niin, että se etsii verkkosivuilta sähköpostiosoitteita tai puhelinnumeroita niitä ryömiessä. Voit jopa laajentaa toimintoja lisäämällä komentorivi argumentteja tarjota mahdollisuuden määritellä lähtötiedostot, rajoittaa haut syvyys, ja paljon muuta. Lisätietoja komentorivirajapintojen luomisesta argumenttien hyväksymiseksi täällä.