Mengikis web ialah kaedah yang digunakan untuk mengekstrak maklumat daripada tapak web. Ia boleh menjadi alat yang tidak ternilai untuk analisis data, penyelidikan dan automasi. Python, dengan ekosistem perpustakaan yang kaya, menawarkan beberapa pilihan untuk mengikis web. Dalam artikel ini, kami akan meneroka empat perpustakaan popular: Permintaan, BeautifulSoup, Selenium dan Scrapy. Kami akan membandingkan ciri mereka, memberikan contoh kod terperinci dan membincangkan amalan terbaik.
Pengikisan web melibatkan pengambilan halaman web dan mengekstrak data berguna daripadanya. Ia boleh digunakan untuk pelbagai tujuan, antaranya:
Sebelum mengikis mana-mana tapak web, adalah penting untuk menyemak fail robots.txt tapak dan syarat perkhidmatan untuk memastikan pematuhan dengan dasar mengikisnya.
Pustaka Permintaan ialah cara yang mudah dan mesra pengguna untuk menghantar permintaan HTTP dalam Python. Ia mengabstrakkan banyak kerumitan HTTP, menjadikannya mudah untuk mengambil halaman web.
Anda boleh memasang Permintaan menggunakan pip:
pip install requests
Berikut ialah cara menggunakan Permintaan untuk mengambil halaman web:
import requests url = 'https://example.com' response = requests.get(url) if response.status_code == 200: print("Page fetched successfully!") print(response.text) # Prints the HTML content of the page else: print(f"Failed to retrieve the webpage: {response.status_code}")
Anda boleh menghantar parameter dan pengepala dengan mudah dengan Permintaan:
params = {'q': 'web scraping', 'page': 1} headers = {'User-Agent': 'Mozilla/5.0'} response = requests.get(url, params=params, headers=headers) print(response.url) # Displays the full URL with parameters
Permintaan juga menyokong pengurusan sesi, yang berguna untuk mengekalkan kuki:
session = requests.Session() session.get('https://example.com/login', headers=headers) response = session.get('https://example.com/dashboard') print(response.text)
BeautifulSoup ialah perpustakaan yang berkuasa untuk menghuraikan dokumen HTML dan XML. Ia berfungsi dengan baik dengan Permintaan untuk mengekstrak data daripada halaman web.
Anda boleh memasang BeautifulSoup menggunakan pip:
pip install beautifulsoup4
Berikut ialah cara menghuraikan HTML dengan BeautifulSoup:
from bs4 import BeautifulSoup html_content = response.text soup = BeautifulSoup(html_content, 'html.parser') # Extracting the title of the page title = soup.title.string print(f"Page Title: {title}")
BeautifulSoup membolehkan anda menavigasi pokok parse dengan mudah:
# Find all <h1> tags h1_tags = soup.find_all('h1') for tag in h1_tags: print(tag.text) # Find the first <a> tag first_link = soup.find('a') print(first_link['href']) # Prints the URL of the first link
Anda juga boleh menggunakan pemilih CSS untuk mencari elemen:
# Find elements with a specific class items = soup.select('.item-class') for item in items: print(item.text)
Selenium digunakan terutamanya untuk mengautomasikan aplikasi web untuk tujuan ujian tetapi juga berkesan untuk mengikis kandungan dinamik yang diberikan oleh JavaScript.
Anda boleh memasang Selenium menggunakan pip:
pip install selenium
Selenium memerlukan pemacu web untuk penyemak imbas yang ingin anda automasi (cth., ChromeDriver untuk Chrome). Pastikan anda memasang pemacu dan tersedia dalam PATH anda.
Berikut ialah cara menggunakan Selenium untuk mengambil halaman web:
from selenium import webdriver # Set up the Chrome WebDriver driver = webdriver.Chrome() # Open a webpage driver.get('https://example.com') # Extract the page title print(driver.title) # Close the browser driver.quit()
Selenium membolehkan anda berinteraksi dengan elemen web, seperti mengisi borang dan mengklik butang:
# Find an input field and enter text search_box = driver.find_element_by_name('q') search_box.send_keys('web scraping') # Submit the form search_box.submit() # Wait for results to load and extract them results = driver.find_elements_by_css_selector('.result-class') for result in results: print(result.text)
Selenium boleh menunggu elemen dimuatkan secara dinamik:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # Wait for an element to become visible try: element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, 'dynamic-element-id')) ) print(element.text) finally: driver.quit()
Scrapy ialah rangka kerja mengikis web yang teguh dan fleksibel yang direka untuk projek mengikis berskala besar. Ia menyediakan sokongan terbina dalam untuk mengendalikan permintaan, menghurai dan menyimpan data.
Anda boleh memasang Scrapy menggunakan pip:
pip install scrapy
Untuk mencipta projek Scrapy baharu, jalankan arahan berikut dalam terminal anda:
scrapy startproject myproject cd myproject scrapy genspider example example.com
Berikut ialah labah-labah mudah yang mengikis data daripada tapak web:
# In myproject/spiders/example.py import scrapy class ExampleSpider(scrapy.Spider): name = 'example' start_urls = ['https://example.com'] def parse(self, response): # Extract data using CSS selectors titles = response.css('h1::text').getall() for title in titles: yield {'title': title} # Follow pagination links next_page = response.css('a.next::attr(href)').get() if next_page: yield response.follow(next_page, self.parse)
Anda boleh menjalankan labah-labah anda dari baris arahan:
scrapy crawl example -o output.json
Arahan ini akan menyimpan data yang dikikis ke output.json.
Scrapy membolehkan anda memproses data yang dikikis menggunakan saluran paip item. Anda boleh membersihkan dan menyimpan data dengan cekap:
# In myproject/pipelines.py class MyPipeline: def process_item(self, item, spider): item['title'] = item['title'].strip() # Clean the title return item
Anda boleh mengkonfigurasi tetapan dalam settings.py untuk menyesuaikan projek Scrapy anda:
# Enable item pipelines ITEM_PIPELINES = { 'myproject.pipelines.MyPipeline': 300, }
Feature | Requests + BeautifulSoup | Selenium | Scrapy |
---|---|---|---|
Ease of Use | High | Moderate | Moderate |
Dynamic Content | No | Yes | Yes (with middleware) |
Speed | Fast | Slow | Fast |
Asynchronous | No | No | Yes |
Built-in Parsing | No | No | Yes |
Session Handling | Yes | Yes | Yes |
Community Support | Strong | Strong | Very Strong |
Respect Robots.txt: Always check the robots.txt file of the website to see what is allowed to be scraped.
Rate Limiting: Implement delays between requests to avoid overwhelming the server. Use time.sleep() or Scrapy's built-in settings.
User-Agent Rotation: Use different User-Agent strings to mimic different browsers and avoid being blocked.
Handle Errors Gracefully: Implement error handling to manage HTTP errors and exceptions during scraping.
Data Cleaning: Clean and validate the scraped data before using it for analysis.
Monitor Your Scrapers: Keep an eye on your scrapers to ensure they are running smoothly and efficiently.
Web scraping is a powerful tool for gathering data from the web. Choosing the right library or framework depends on your specific needs:
By following best practices and understanding the strengths of each tool, you can effectively scrape data while respecting the web ecosystem. Happy scraping!
Atas ialah kandungan terperinci Mengikis Web dengan Python: Panduan Mendalam untuk Permintaan, BeautifulSoup, Selenium dan Scrapy. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!