logo

Tīmekļa skrāpēšanas ieviešana Python, izmantojot BeautifulSoup

Galvenokārt ir divi veidi, kā iegūt datus no vietnes:

  • Izmantojiet vietnes API (ja tāda pastāv). Piemēram, Facebook ir Facebook Graph API, kas ļauj izgūt Facebook publicētos datus.
  • Piekļūstiet tīmekļa lapas HTML un iegūstiet no tā noderīgu informāciju/datus. Šo paņēmienu sauc par tīmekļa nokasīšanu vai tīmekļa ievākšanu vai tīmekļa datu ieguvi.

Šajā rakstā ir apskatītas tīmekļa nokasīšanas darbības, izmantojot Python Web Scraping ietvara ieviešanu, ko sauc par Beautiful Soup. Tīmekļa nokasīšanas soļi:



  1. Nosūtiet HTTP pieprasījumu uz tās tīmekļa lapas URL, kurai vēlaties piekļūt. Serveris atbild uz pieprasījumu, atgriežot tīmekļa lapas HTML saturu. Šim uzdevumam mēs izmantosim trešās puses HTTP bibliotēku python pieprasījumiem.
  2. Kad esam piekļuvuši HTML saturam, mums atliek parsēt datus. Tā kā lielākā daļa HTML datu ir ligzdoti, mēs nevaram iegūt datus, vienkārši apstrādājot virkni. Ir nepieciešams parsētājs, kas var izveidot ligzdotu/koka struktūru HTML datiem. Ir pieejamas daudzas HTML parsētāju bibliotēkas, taču vismodernākā ir html5lib.
  3. Tagad viss, kas mums jādara, ir jāpārvietojas un jāmeklē mūsu izveidotajā parsēšanas kokā, t.i., koka šķērsošana. Šim uzdevumam mēs izmantosim citu trešās puses python bibliotēku, Skaista zupa . Tā ir Python bibliotēka datu izņemšanai no HTML un XML failiem.

1. darbība. Nepieciešamo trešo pušu bibliotēku instalēšana

  • Vienkāršākais veids, kā python instalēt ārējās bibliotēkas, ir izmantot pip. pip ir pakotņu pārvaldības sistēma, ko izmanto, lai instalētu un pārvaldītu Python rakstītas programmatūras pakotnes. Viss, kas jums jādara, ir:
pip install requests pip install html5lib pip install bs4>

2. darbība. Piekļuve HTML saturam no tīmekļa lapas

Python






nosauciet pilsētu ASV



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

>

>

Mēģināsim izprast šo koda daļu.

  • Vispirms importējiet pieprasījumu bibliotēku.
  • Pēc tam norādiet tās tīmekļa lapas URL, kuru vēlaties nokasīt.
  • Nosūtiet HTTP pieprasījumu uz norādīto URL un saglabājiet atbildi no servera atbildes objektā ar nosaukumu r.
  • Tagad, kā drukāt r.content, lai iegūtu neapstrādāts HTML saturs no tīmekļa lapas. Tas ir 'stīgas' tipa.

Piezīme. Dažreiz var parādīties kļūda Nav pieņemts, tāpēc mēģiniet pievienot pārlūkprogrammas lietotāja aģentu, kā norādīts tālāk. Šeit atrodiet savu lietotāja aģentu, pamatojoties uz ierīci un pārlūkprogrammu https://deviceatlas.com/blog/list-of-user-agent-strings

Python3




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)>

>

>

3. darbība: HTML satura parsēšana

sonu nigam

Python




#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())>

>

>

Patiešām jauka iezīme BeautifulSoup bibliotēkā ir tā, ka tā ir veidota uz HTML parsēšanas bibliotēkām, piemēram, html5lib, lxml, html.parser utt., Tātad BeautifulSoup objektu un norādiet parsēšanas bibliotēku var izveidot vienlaikus. Iepriekš minētajā piemērā

atrast virknē c++
soup = BeautifulSoup(r.content, 'html5lib')>

Mēs izveidojam BeautifulSoup objektu, nododot divus argumentus:

    r.content: tas ir neapstrādāts HTML saturs. html5lib : HTML parsētāja norādīšana, kuru vēlamies izmantot.

Tagad soup.prettify() ir drukāts, tas sniedz vizuālu parsēšanas koka attēlojumu, kas izveidots no neapstrādāta HTML satura. 4. darbība. Meklēšana un navigācija parsēšanas kokā Tagad mēs vēlamies iegūt dažus noderīgus datus no HTML satura. Zupas objekts satur visus ligzdotās struktūras datus, kurus var programmatiski izvilkt. Mūsu piemērā mēs nokopējam tīmekļa lapu, kas sastāv no dažiem citātiem. Tātad, mēs vēlētos izveidot programmu, lai saglabātu šos citātus (un visu attiecīgo informāciju par tiem).

Python


k tuvākā kaimiņa algoritms



#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)>

>

>

Pirms turpināt, iesakām pārlūkot tās tīmekļa lapas HTML saturu, kuru izdrukājām, izmantojot metodi soup.prettify() un mēģināt atrast modeli vai veidu, kā pārvietoties uz pēdiņām.

  • Ir pamanīts, ka visas pēdiņas atrodas div konteinerā, kura ID ir “all_quotes”. Tātad mēs atklājam, ka div elements (saukts par tabulu iepriekš minētajā kodā), izmantojot atrast () metode:
table = soup.find('div', attrs = {'id':'all_quotes'})>
  • Pirmais arguments ir HTML tags, kurā vēlaties meklēt, un otrais arguments ir vārdnīcas tipa elements, lai norādītu ar šo tagu saistītos papildu atribūtus. atrast () metode atgriež pirmo atbilstošo elementu. Varat mēģināt izdrukāt table.prettify() lai gūtu priekšstatu par to, ko dara šī koda daļa.
  • Tagad tabulas elementā var pamanīt, ka katrs citāts atrodas div konteinerā, kura klase ir citāts. Tātad, mēs atkārtojam katru div konteineru, kura klase ir citāts. Šeit mēs izmantojam metodi findAll (), kas argumentu ziņā ir līdzīga meklēšanas metodei, taču tā atgriež visu atbilstošo elementu sarakstu. Katrs citāts tagad tiek atkārtots, izmantojot mainīgo, ko sauc rinda. Šeit ir viens rindu HTML satura paraugs labākai izpratnei: Tagad apsveriet šo koda daļu:
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)>
  • Mēs izveidojam vārdnīcu, lai saglabātu visu informāciju par citātu. Ligzdotajai struktūrai var piekļūt, izmantojot punktu apzīmējumu. Lai piekļūtu tekstam HTML elementā, mēs izmantojam .text :
quote['theme'] = row.h5.text>
  • Mēs varam pievienot, noņemt, modificēt un piekļūt taga atribūtiem. Tas tiek darīts, apstrādājot tagu kā vārdnīcu:
quote['url'] = row.a['href']>
  • Visbeidzot, visas pēdiņas tiek pievienotas izsauktajam sarakstam citāti.
  • Visbeidzot, mēs vēlētos saglabāt visus savus datus kādā CSV failā.
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)>
  • Šeit mēs izveidojam CSV failu ar nosaukumu inspirational_quotes.csv un saglabājam visus citātus turpmākai izmantošanai.

Tātad, šis bija vienkāršs piemērs, kā Python izveidot tīmekļa skrāpi. No šejienes varat mēģināt izņemt jebkuru citu vietni pēc savas izvēles. Ja jums ir kādi jautājumi, ievietojiet tos zemāk komentāru sadaļā.

Piezīme : Tīmekļa nokasīšana daudzos gadījumos tiek uzskatīta par nelikumīgu. Tas var arī izraisīt jūsu IP neatgriezenisku bloķēšanu vietnē. Šī emuāra autors ir Nikhils Kumars .