logo

Implementera webbskrapning i Python med BeautifulSoup

Det finns huvudsakligen två sätt att extrahera data från en webbplats:

  • Använd webbplatsens API (om det finns). Till exempel har Facebook Facebook Graph API som tillåter hämtning av data som lagts upp på Facebook.
  • Få åtkomst till webbsidans HTML och extrahera användbar information/data från den. Denna teknik kallas webbskrapning eller webbskörd eller webbdataextraktion.

Den här artikeln diskuterar stegen som är involverade i webbskrapning med hjälp av implementeringen av ett Web Scraping-ramverk av Python som heter Beautiful Soup. Steg involverade i webbskrapning:



  1. Skicka en HTTP-förfrågan till webbadressen till webbsidan du vill komma åt. Servern svarar på begäran genom att returnera HTML-innehållet på webbsidan. För denna uppgift kommer vi att använda ett tredjeparts HTTP-bibliotek för python-förfrågningar.
  2. När vi väl har kommit åt HTML-innehållet har vi uppgiften att analysera data. Eftersom de flesta HTML-data är kapslade kan vi inte extrahera data helt enkelt genom strängbearbetning. Man behöver en parser som kan skapa en kapslad/trädstruktur av HTML-data. Det finns många HTML-parserbibliotek tillgängliga men det mest avancerade är html5lib.
  3. Allt vi behöver göra nu är att navigera och söka i analysträdet som vi skapade, dvs. För denna uppgift kommer vi att använda ett annat tredjeparts python-bibliotek, Vacker soppa . Det är ett Python-bibliotek för att dra ut data från HTML- och XML-filer.

Steg 1: Installera de nödvändiga tredjepartsbiblioteken

myflixer
  • Det enklaste sättet att installera externa bibliotek i python är att använda pip. pip är ett pakethanteringssystem som används för att installera och hantera mjukvarupaket skrivna i Python. Allt du behöver göra är:
pip install requests pip install html5lib pip install bs4>

Steg 2: Få åtkomst till HTML-innehållet från webbsidan

Pytonorm








import> requests> URL>=> 'https:>/>/>www.techcodeview.com>/>data>->structures>/>'> r>=> requests.get(URL)> print>(r.content)>

>

>

Låt oss försöka förstå denna kodbit.

  • Importera först och främst förfrågningsbiblioteket.
  • Ange sedan webbadressen till webbsidan du vill skrapa.
  • Skicka en HTTP-förfrågan till den angivna URL:en och spara svaret från servern i ett svarsobjekt som heter r.
  • Nu, som print r.content för att få rå HTML-innehåll av webbsidan. Det är av typen 'sträng'.

Obs! Ibland kan du få felet Inte accepterat så försök lägga till en webbläsaranvändaragent som nedan. Hitta din användaragent baserat på enhet och webbläsare härifrån https://deviceatlas.com/blog/list-of-user-agent-strings

Python3


vba



headers>=> {>'User-Agent'>:>'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246'>}> # Here the user agent is for Edge browser on windows 10. You can find your browser user agent from the above given link.> r>=> requests.get(url>=>URL, headers>=>headers)> print>(r.content)>

>

>

Steg 3: Analysera HTML-innehållet

Pytonorm




#This will not run on online IDE> import> requests> from> bs4>import> BeautifulSoup> > URL>=> 'http:>/>/>www.values.com>/>inspirational>->quotes'> r>=> requests.get(URL)> > soup>=> BeautifulSoup(r.content,>'html5lib'>)># If this line causes an error, run 'pip install html5lib' or install html5lib> print>(soup.prettify())>

>

>

En riktigt trevlig sak med BeautifulSoup-biblioteket är att det är byggt på toppen av HTML-tolkningsbiblioteken som html5lib, lxml, html.parser, etc. Så BeautifulSoup-objektet och specificerar parserbiblioteket kan skapas samtidigt. I exemplet ovan,

soup = BeautifulSoup(r.content, 'html5lib')>

Vi skapar ett BeautifulSoup-objekt genom att skicka två argument:

    r.content : Det är det råa HTML-innehållet. html5lib : Specificerar HTML-parsern vi vill använda.

Nu soup.prettify() är tryckt, det ger den visuella representationen av analysträdet som skapats från det råa HTML-innehållet. Steg 4: Söka och navigera genom analysträdet Nu skulle vi vilja extrahera lite användbar data från HTML-innehållet. Soppobjektet innehåller all data i den kapslade strukturen som kan extraheras programmatiskt. I vårt exempel skrapar vi en webbsida som består av några citat. Så vi skulle vilja skapa ett program för att spara dessa citat (och all relevant information om dem).

Pytonorm


lista metoder java



#Python program to scrape website> #and save quotes from website> import> requests> from> bs4>import> BeautifulSoup> import> csv> > URL>=> 'http:>/>/>www.values.com>/>inspirational>->quotes'> r>=> requests.get(URL)> > soup>=> BeautifulSoup(r.content,>'html5lib'>)> > quotes>=>[]># a list to store quotes> > table>=> soup.find(>'div'>, attrs>=> {>'id'>:>'all_quotes'>})> > for> row>in> table.findAll(>'div'>,> >attrs>=> {>'class'>:>'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'>}):> >quote>=> {}> >quote[>'theme'>]>=> row.h5.text> >quote[>'url'>]>=> row.a[>'href'>]> >quote[>'img'>]>=> row.img[>'src'>]> >quote[>'lines'>]>=> row.img[>'alt'>].split('>#')[0]> >quote[>'author'>]>=> row.img[>'alt'>].split('>#')[1]> >quotes.append(quote)> > filename>=> 'inspirational_quotes.csv'> with>open>(filename,>'w'>, newline>=>'') as f:> >w>=> csv.DictWriter(f,[>'theme'>,>'url'>,>'img'>,>'lines'>,>'author'>])> >w.writeheader()> >for> quote>in> quotes:> >w.writerow(quote)>

>

>

Innan du går vidare rekommenderar vi att du går igenom HTML-innehållet på webbsidan som vi skrev ut med metoden soup.prettify() och försöker hitta ett mönster eller ett sätt att navigera till citaten.

  • Det märks att alla citat är inuti en div-behållare vars id är 'all_quotes'. Så vi finner att div-elementet (benämnt som tabell i ovanstående kod) med hjälp av hitta() metod:
table = soup.find('div', attrs = {'id':'all_quotes'})>
  • Det första argumentet är HTML-taggen du vill söka i och det andra argumentet är ett element av ordbokstyp för att specificera de ytterligare attribut som är associerade med taggen. hitta() metod returnerar det första matchande elementet. Du kan försöka skriva ut table.prettify() för att få en känsla av vad den här koden gör.
  • Nu, i tabellelementet, kan man märka att varje citat är inuti en div-behållare vars klass är citat. Så vi itererar genom varje div-behållare vars klass är citat. Här använder vi metoden findAll() som liknar hittametoden vad gäller argument men den returnerar en lista över alla matchande element. Varje citat upprepas nu med en variabel som kallas rad. Här är en exempelrad HTML-innehåll för bättre förståelse: Tänk nu på denna kodbit:
for row in table.find_all_next('div', attrs = {'class': 'col-6 col-lg-3 text-center margin-30px-bottom sm-margin-30px-top'}): quote = {} quote['theme'] = row.h5.text quote['url'] = row.a['href'] quote['img'] = row.img['src'] quote['lines'] = row.img['alt'].split(' #')[0] quote['author'] = row.img['alt'].split(' #')[1] quotes.append(quote)>
  • Vi skapar en ordbok för att spara all information om en offert. Den kapslade strukturen kan nås med hjälp av punktnotation. För att komma åt texten i ett HTML-element använder vi .text:
quote['theme'] = row.h5.text>
  • Vi kan lägga till, ta bort, ändra och komma åt en taggs attribut. Detta görs genom att behandla taggen som en ordbok:
quote['url'] = row.a['href']>
  • Till sist läggs alla citat till listan som kallas citat.
  • Slutligen vill vi spara all vår data i någon CSV-fil.
filename = 'inspirational_quotes.csv' with open(filename, 'w', newline='') as f: w = csv.DictWriter(f,['theme','url','img','lines','author']) w.writeheader() for quote in quotes: w.writerow(quote)>
  • Här skapar vi en CSV-fil som heter inspirational_quotes.csv och sparar alla citat i den för vidare användning.

Så det här var ett enkelt exempel på hur man skapar en webbskrapa i Python. Härifrån kan du försöka skrota vilken annan webbplats som helst. Om du har några frågor, posta dem nedan i kommentarsfältet.

Notera : Webbskrapning anses vara olagligt i många fall. Det kan också göra att din IP blockeras permanent av en webbplats. Den här bloggen är bidragit av Nikhil Kumar .