Python este un limbaj frumos de codificat. Are un ecosistem de pachete excelent, există mult mai puțin zgomot decât veți găsi în alte limbi și este foarte ușor de utilizat.
Python este utilizat pentru mai multe lucruri, de la analiza datelor la programarea serverului. Și un caz de utilizare interesant al Python este Web Scraping.
În acest articol, vom prezenta cum să utilizați Python pentru răzuirea web. De asemenea, vom lucra printr-un ghid practic complet de clasă pe măsură ce vom continua.
Notă: vom scrapa o pagină web pe care o găzduiesc, astfel încât să putem învăța în siguranță scraping pe ea. Multe companii nu permit răzuirea pe site-urile lor web, deci acesta este un mod bun de a învăța. Asigurați-vă că verificați înainte de a răzuia.
Introducere în clasa Web Scraping

Dacă doriți să codificați, puteți utiliza această clasă gratuită codedamn care constă din mai multe laboratoare pentru a vă ajuta să învățați răzuirea web. Acesta va fi un exercițiu practic de învățare pe codedamn, similar cu modul în care înveți pe Routech.
În această sală de clasă, veți folosi această pagină pentru a testa răzuirea web: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
Această sală de clasă este formată din 7 laboratoare și veți rezolva un laborator în fiecare parte a acestei postări pe blog. Vom folosi Python 3.8 + BeautifulSoup 4 pentru web scraping.
Partea 1: Încărcarea paginilor web cu „cerere”
Acesta este link către acest laborator.
requests
modulul vă permite să trimiteți cereri HTTP folosind Python.
Solicitarea HTTP returnează un obiect de răspuns cu toate datele de răspuns (conținut, codificare, stare și așa mai departe). Un exemplu de obținere a codului HTML al unei pagini:
import requests
res = requests.get('https://codedamn.com')
print(res.text)
print(res.status_code)
Cerințe de promovare:
- Obțineți conținutul următoarei adrese URL folosind
requests
modul: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/ - Stocați răspunsul text (așa cum se arată mai sus) într-o variabilă numită
txt
- Stocați codul de stare (așa cum se arată mai sus) într-o variabilă numită
status
- Imprimare
txt
șistatus
folosindprint
funcţie
Odată ce ați înțeles ce se întâmplă în codul de mai sus, este destul de simplu să treceți de acest laborator. Iată soluția pentru acest laborator:
import requests
# Make a request to https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
# Store the result in 'res' variable
res = requests.get(
'https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/')
txt = res.text
status = res.status_code
print(txt, status)
# print the result
Să trecem la partea 2 acum, unde veți construi mai mult pe codul dvs. existent.
Partea 2: Extragerea titlului cu BeautifulSoup
Acesta este link către acest laborator.
În toată această sală de clasă, veți folosi o bibliotecă numită BeautifulSoup
în Python pentru a face web scraping. Unele caracteristici care fac din BeautifulSoup o soluție puternică sunt:
- Oferă o mulțime de metode simple și expresii pitonice pentru navigarea, căutarea și modificarea unui arbore DOM. Nu este nevoie de mult cod pentru a scrie o aplicație
- Supa frumoasă se află deasupra analizatorilor Python populari, cum ar fi lxml și html5lib, permițându-vă să încercați diferite strategii de analiză sau să schimbați viteza de flexibilitate.
Practic, BeautifulSoup poate analiza orice pe web pe care i-l oferiți.
Iată un exemplu simplu de BeautifulSoup:
from bs4 import BeautifulSoup
page = requests.get("https://codedamn.com")
soup = BeautifulSoup(page.content, 'html.parser')
title = soup.title.text # gets you the text of the <title>(...)</title>
Cerințe de promovare:
- Folosește
requests
pachet pentru a obține titlul adresei URL: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/ - Folosiți BeautifulSoup pentru a stoca titlul acestei pagini într-o variabilă numită
page_title
Privind exemplul de mai sus, puteți vedea odată ce hrănim page.content
în BeautifulSoup, puteți începe să lucrați cu arborele DOM analizat într-un mod foarte pitonic. Soluția pentru laborator ar fi:
import requests
from bs4 import BeautifulSoup
# Make a request to https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
page = requests.get(
"https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')
# Extract title of page
page_title = soup.title.text
# print the result
print(page_title)
Acesta a fost, de asemenea, un laborator simplu în care a trebuit să schimbăm adresa URL și să imprimăm titlul paginii. Acest cod ar trece de laborator.
Partea 3: Corpul și capul supate
Acesta este link către acest laborator.
În ultimul laborator, ați văzut cum puteți extrage fișierul title
din pagina. Este la fel de ușor să extrageți și anumite secțiuni.
Ai văzut și că trebuie să suni .text
pe acestea pentru a obține șirul, dar le puteți imprima fără a apela .text
și vă va oferi marjarea completă. Încercați să rulați exemplul de mai jos:
import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
"https://codedamn.com")
soup = BeautifulSoup(page.content, 'html.parser')
# Extract title of page
page_title = soup.title.text
# Extract body of page
page_body = soup.body
# Extract head of page
page_head = soup.head
# print the result
print(page_body, page_head)
Să aruncăm o privire la modul în care puteți extrage body
și head
secțiuni din paginile dvs.
Cerințe de promovare:
- Repetați experimentul cu adresa URL:
https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
- Stocați titlul paginii (fără a apela .text) al adresei URL în
page_title
- Stocați conținutul corpului (fără a apela .text) al adresei URL în
page_body
- Stocați conținutul principal (fără a apela .text) al adresei URL în
page_head
Când încercați să imprimați page_body
sau page_head
veți vedea că acestea sunt tipărite ca strings
. Dar, în realitate, când tu print(type page_body)
veți vedea că nu este un șir, dar funcționează bine.
Soluția acestui exemplu ar fi simplă, pe baza codului de mai sus:
import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
"https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')
# Extract title of page
page_title = soup.title
# Extract body of page
page_body = soup.body
# Extract head of page
page_head = soup.head
# print the result
print(page_title, page_head)
Partea 4: selectați cu BeautifulSoup
Acesta este link către acest laborator.
Acum că ați explorat câteva părți ale BeautifulSoup, să vedem cum puteți selecta elemente DOM cu metodele BeautifulSoup.
Odată ce ai soup
variabilă (la fel ca laboratoarele anterioare), cu care puteți lucra .select
pe acesta, care este un selector CSS în BeautifulSoup. Adică, puteți ajunge în jos în arborele DOM la fel cum veți selecta elemente cu CSS. Să vedem un exemplu:
import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
"https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')
# Extract first <h1>(...)</h1> text
first_h1 = soup.select('h1')[0].text
.select
returnează o listă Python cu toate elementele. Acesta este motivul pentru care ați selectat doar primul element aici cu [0]
index.
Cerințe de promovare:
- Creați o variabilă
all_h1_tags
. Setați-l pe lista goală. - Utilizare
.select
pentru a selecta toate<h1>
etichetează și stochează textul celor h1 în interiorall_h1_tags
listă. - Creați o variabilă
seventh_p_text
și stochează textul celui de-al 7-leap
element (index 6) în interior.
Soluția pentru acest laborator este:
import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
"https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')
# Create all_h1_tags as empty list
all_h1_tags = []
# Set all_h1_tags to all h1 tags of the soup
for element in soup.select('h1'):
all_h1_tags.append(element.text)
# Create seventh_p_text and set it to 7th p element text of the page
seventh_p_text = soup.select('p')[6].text
print(all_h1_tags, seventh_p_text)
Sa continuam.
Partea 5: Elementele de top care sunt răzuite chiar acum
Acesta este link către acest laborator.
Să mergem mai departe și să extragem elementele de top răzuite de pe adresa URL: https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/
Dacă deschideți această pagină într-o filă nouă, veți vedea câteva elemente de top. În acest laborator, sarcina dvs. este să le răsturnați numele și să le stocați într-o listă numită top_items
. De asemenea, veți extrage recenziile pentru aceste articole.
Pentru a trece peste această provocare, aveți grijă de următoarele lucruri:
- Utilizare
.select
pentru a extrage titlurile. (Sfat: un selector pentru titlurile produselor ar putea fia.title
) - Utilizare
.select
pentru a extrage eticheta numărului de recenzii pentru acele titluri de produse. (Sfat: un selector pentru recenzii ar putea fidiv.ratings
) Notă: aceasta este o etichetă completă (adică 2 recenzii) și nu doar un număr. - Creați un dicționar nou în format:
info = {
"title": 'Asus AsusPro Adv... '.strip(),
"review": '2 reviewsnnn'.strip()
}
- Rețineți că utilizați
strip
metodă pentru a elimina orice linii noi / spații albe suplimentare pe care le-ați putea avea în ieșire. Aceasta este important pentru a trece de acest laborator. - Adăugați acest dicționar într-o listă numită
top_items
- Imprimați această listă la sfârșit
Există destul de multe sarcini de făcut în această provocare. Să aruncăm o privire mai întâi asupra soluției și să înțelegem ce se întâmplă:
import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
"https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')
# Create top_items as empty list
top_items = []
# Extract and store in top_items according to instructions on the left
products = soup.select('div.thumbnail')
for elem in products:
title = elem.select('h4 > a.title')[0].text
review_label = elem.select('div.ratings')[0].text
info = {
"title": title.strip(),
"review": review_label.strip()
}
top_items.append(info)
print(top_items)
Rețineți că aceasta este doar una dintre soluții. Puteți încerca acest lucru și într-un mod diferit. În această soluție:
- În primul rând selectați toate
div.thumbnail
elemente care vă oferă o listă de produse individuale - Apoi iterați asupra lor
- pentru că
select
vă permite să vă înlănțuiți, puteți utiliza selectați din nou pentru a obține titlul. - Rețineți că pentru că rulați într-o buclă pentru
div.thumbnail
deja,h4 > a.title
selectorul vă va oferi un singur rezultat, într-o listă. Selectați al 0-lea element al listei și extrageți textul. - În cele din urmă, eliminați orice spațiu alb suplimentar și îl adăugați la lista dvs.
Chiar nu?
Partea 6: Extragerea linkurilor
Acesta este link către acest laborator.
Până acum ați văzut cum puteți extrage textul, sau mai degrabă textul interior al elementelor. Să vedem acum cum puteți extrage atribute prin extragerea linkurilor din pagină.
Iată un exemplu despre cum să extrageți toate informațiile despre imagine din pagină:
import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
"https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')
# Create top_items as empty list
image_data = []
# Extract and store in top_items according to instructions on the left
images = soup.select('img')
for image in images:
src = image.get('src')
alt = image.get('alt')
image_data.append({"src": src, "alt": alt})
print(image_data)
În acest laborator, sarcina dvs. este de a extrage fișierul href
atributul legăturilor cu text
de asemenea. Asigurați-vă de următoarele lucruri:
- Trebuie să creați o listă numită
all_links
- În această listă, stocați toate informațiile legate de dictare. Ar trebui să fie în următorul format:
info = {
"href": "<link here>",
"text": "<link text here>"
}
- Asigurați-vă că
text
este dezbrăcat de orice spațiu alb - Asigurați-vă că verificați dacă
.text
este Niciunul înainte de a apela.strip()
pe el. - Păstrați toate aceste fapte în
all_links
- Imprimați această listă la sfârșit
Extrageți valorile atributelor la fel cum extrageți valorile dintr-un dict, folosind get
funcţie. Să aruncăm o privire la soluția pentru acest laborator:
import requests
from bs4 import BeautifulSoup
# Make a request
page = requests.get(
"https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')
# Create top_items as empty list
all_links = []
# Extract and store in top_items according to instructions on the left
links = soup.select('a')
for ahref in links:
text = ahref.text
text = text.strip() if text is not None else ''
href = ahref.get('href')
href = href.strip() if href is not None else ''
all_links.append({"href": href, "text": text})
print(all_links)
Aici, extrageți fișierul href
atribut așa cum ați făcut în cazul imaginii. Singurul lucru pe care îl faceți este, de asemenea, să verificați dacă este Nici unul. Vrem să-l setăm la șir gol, altfel vrem să dezbrăcăm spațiul alb.
Partea 7: Generarea CSV din date
Acesta este link către acest laborator.
În cele din urmă, să înțelegem cum puteți genera CSV dintr-un set de date. Veți crea un CSV cu următoarele titluri:
- numele produsului
- Preț
- Descriere
- Recenzii
- imaginea produsului
Aceste produse sunt situate în div.thumbnail
. Placa centrală CSV este prezentată mai jos:
import requests
from bs4 import BeautifulSoup
import csv
# Make a request
page = requests.get(
"https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')
all_products = []
products = soup.select('div.thumbnail')
for product in products:
# TODO: Work
print("Work on product here")
keys = all_products[0].keys()
with open('products.csv', 'w', newline="") as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(all_products)
Trebuie să extrageți date de pe site și să generați acest CSV pentru cele trei produse.
Cerințe de promovare:
- Nume produs este versiunea tăiată în spațiul alb al numelui articolului (exemplu – Asus AsusPro Adv ..)
- Prețul este spațiul alb, dar eticheta completă a prețului produsului (exemplu – 1101,83 USD)
- Descrierea este versiunea decupată a spațiului alb (exemplu – Asus AsusPro Advanced BU401LA-FA271G Grey închis, 14 “, Core i5-4210U, 4 GB, 128 GB SSD, Win7 Pro)
- Recenziile sunt versiunea redusă a produsului în spațiul alb (exemplu – 7 recenzii)
- Imaginea produsului este adresa URL (atributul src) a imaginii pentru un produs (exemplu – /webscraper-python-codedamn-classroom-website/cart2.png)
- Numele fișierului CSV ar trebui să fie produse.csv și ar trebui să fie stocate în același director ca script.py fişier
Să vedem soluția acestui laborator:
import requests
from bs4 import BeautifulSoup
import csv
# Make a request
page = requests.get(
"https://codedamn-classrooms.github.io/webscraper-python-codedamn-classroom-website/")
soup = BeautifulSoup(page.content, 'html.parser')
# Create top_items as empty list
all_products = []
# Extract and store in top_items according to instructions on the left
products = soup.select('div.thumbnail')
for product in products:
name = product.select('h4 > a')[0].text.strip()
description = product.select('p.description')[0].text.strip()
price = product.select('h4.price')[0].text.strip()
reviews = product.select('div.ratings')[0].text.strip()
image = product.select('img')[0].get('src')
all_products.append({
"name": name,
"description": description,
"price": price,
"reviews": reviews,
"image": image
})
keys = all_products[0].keys()
with open('products.csv', 'w', newline="") as output_file:
dict_writer = csv.DictWriter(output_file, keys)
dict_writer.writeheader()
dict_writer.writerows(all_products)
for
blocul este cel mai interesant aici. Extrageți toate elementele și atributele din ceea ce ați învățat până acum în toate laboratoarele.
Când rulați acest cod, veți avea un fișier CSV frumos. Și este vorba despre toate elementele de bază ale răzuirii web cu BeautifulSoup!
Concluzie
Sper că această clasă interactivă de la codedamn v-a ajutat să înțelegeți elementele de bază ale răzuirii web cu Python.
Dacă ți-a plăcut această sală de clasă și acest blog, spune-mi despre asta pe pagina mea stare de nervozitate și Instagram. Mi-ar plăcea să aud feedback!