Extrahera data med Beautiful Soup och Scrapy

Web scraping handlar om att samla data från webbsidor automatiskt. I det här kapitlet utforskar vi två populära Python-bibliotek för detta: Beautiful Soup och Scrapy. Om du har läst om Beautiful Soup tidigare, kompletterar vi med fler exempel och introducerar Scrapy för mer avancerad scraping.
Vad är web scraping?
Web scraping innebär att programatiskt hämta och analysera innehåll från webbsidor. Vanliga användningsområden inkluderar:
- Datainsamling: Extrahera priser, recensioner eller produktinformation.
- Textanalys: Hämta blogginlägg eller artiklar.
- Datauppdatering: Automatiskt samla och uppdatera datasets från webben.
Steg 1: Beautiful Soup – Grunderna
Beautiful Soup används för att analysera HTML och XML. Här börjar vi med ett grundläggande exempel där vi hämtar och analyserar en enkel webbsida.
Exempel: Extrahera rubriker från en webbsida
from bs4 import BeautifulSoupimport requests# Fetch the webpageurl = "https://example.com"response = requests.get(url)# Parse the HTMLsoup = BeautifulSoup(response.text, "html.parser")# Extract all headings (h1, h2, h3, etc.)headings = soup.find_all(['h1', 'h2', 'h3'])for heading in headings: print(heading.text.strip())Code language: PHP (php) Output:
Example Domain
| Metod | Beskrivning |
|---|---|
find_all | Hittar alla taggar som matchar listan |
strip | Tar bort extra mellanrum i texten |
Steg 2: Beautiful Soup – Navigera mer avancerat
Exempel: Extrahera länkar från en webbsida
# Extract all hyperlinkslinks = soup.find_all('a', href=True) # Find all <a> tags with an href attributefor link in links: print(link['href'])Code language: PHP (php) Output:
https://www.iana.org/domains/example
Du kan även filtrera länkar baserat på specifika kriterier, t.ex. om de innehåller en viss text eller börjar med ett visst prefix.
Steg 3: Scrapy – Introduktion
Scrapy är en kraftfull web scraping-ram för större projekt. Här skapar vi en enkel spindel (crawler) för att samla rubriker från en webbsida.
Installation
Installera Scrapy:
pip install scrapy Skapa ett projekt
Skapa ett nytt Scrapy-projekt:
scrapy startproject my_scraper Strukturen ser ut så här:
my_scraper/
spiders/
__init__.py
example_spider.py
scrapy.cfg
…
Exempel: Skapa en enkel Scrapy-spindel
Skapa en fil example_spider.py i mappen spiders:
import scrapyclass ExampleSpider(scrapy.Spider): name = "example" start_urls = ["https://example.com"] def parse(self, response): # Extract headings from the page for heading in response.xpath('//h1 | //h2 | //h3'): yield {"heading": heading.get()} Kör spindeln:
scrapy crawl example -o output.jsonCode language: CSS (css) | Scrapy-komponent | Beskrivning |
|---|---|
start_urls | Lista över sidor att börja crawla från |
response.xpath | XPath-sökväg för att välja element |
Sammanfattande kod: Beautiful Soup och Scrapy
Beautiful Soup: Samla länkar och rubriker
from bs4 import BeautifulSoupimport requestsurl = "https://example.com"response = requests.get(url)soup = BeautifulSoup(response.text, "html.parser")# Extract headingsheadings = [heading.text.strip() for heading in soup.find_all(['h1', 'h2', 'h3'])]print("Headings:", headings)# Extract linkslinks = [link['href'] for link in soup.find_all('a', href=True)]print("Links:", links)Code language: PHP (php) Scrapy: Samla rubriker
import scrapyclass MultiPageSpider(scrapy.Spider): name = "multipage" start_urls = ["https://example.com"] def parse(self, response): # Extract headings for heading in response.xpath('//h1 | //h2 | //h3'): yield {"heading": heading.get()} # Follow links to other pages for next_page in response.css('a::attr(href)').getall(): if next_page: yield response.follow(next_page, self.parse) Tips och vanliga fallgropar
Tips
- Robotar och etikett: Kontrollera alltid en webbsidas
robots.txtinnan du börjar scrapea. - Delay: Använd en fördröjning (t.ex. med Scrapy’s
DOWNLOAD_DELAY) för att undvika att överbelasta en server. - API istället för scraping: Om möjligt, använd API:er som oftast erbjuder samma data på ett mer strukturerat sätt.
Vanliga fallgropar
- Dynamiska sidor: Beautiful Soup kan inte hantera JavaScript-genererat innehåll. Använd verktyg som Selenium om det behövs.
- Felaktiga XPath/CSS-väljare: Dubbelkolla att dina sökvägar matchar HTML-strukturen.
- Blockeringar: Webbplatser kan blockera din IP om du skickar för många förfrågningar snabbt.
Sammanfattning
Beautiful Soup är perfekt för enkla scrapingprojekt och manuell HTML-analys, medan Scrapy passar bättre för större projekt med flera sidor och dynamiska krav. Kombinationen av dessa verktyg ger dig kraften att hantera både små och stora web scraping-utmaningar. Lycka till!

