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

Tutorial Web Scraping Python Cum sa scrapati datele de
Previzualizare a clasei codedamn

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 și status folosind print 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:

  1. 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
  2. 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 interior all_h1_tags listă.
  • Creați o variabilă seventh_p_text și stochează textul celui de-al 7-lea p 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 fi a.title)
  • Utilizare .select pentru a extrage eticheta numărului de recenzii pentru acele titluri de produse. (Sfat: un selector pentru recenzii ar putea fi div.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:

  1. În primul rând selectați toate div.thumbnail elemente care vă oferă o listă de produse individuale
  2. Apoi iterați asupra lor
  3. pentru că select vă permite să vă înlănțuiți, puteți utiliza selectați din nou pentru a obține titlul.
  4. 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.
  5. În cele din urmă, eliminați orice spațiu alb suplimentar și îl adăugați la lista dvs.

Chiar nu?

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:

  1. numele produsului
  2. Preț
  3. Descriere
  4. Recenzii
  5. 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!