一、動態與靜態網頁的區別
在了解Python動態爬蟲之前,我們需要先理解動態與靜態網頁的區別。簡單來說,靜態網頁是固定的HTML代碼,展示給用戶的頁面內容是由服務器直接返回給瀏覽器的,而動態網頁在客戶端交互的過程中才生成HTML代碼。這種動態生成HTML代碼的網頁我們也稱之為AJAX網頁,它們通常使用JavaScript完成。
靜態網頁的抓取比較簡單,只需要抓取整個HTML文件就好。但是對於動態網頁,由於它們是在客戶端生成HTML代碼,所以只需要請求網頁源代碼時無法獲取完整數據,需要使用Selenium或者PhantomJS之類的工具進行模擬點擊和JavaScript解析。
二、使用Selenium進行動態網頁抓取
Selenium是一種自動化測試工具,可以用於模擬用戶在瀏覽器中的操作。我們可以通過Selenium來操作瀏覽器模擬點擊、填寫表單等操作,從而得到完整的網頁數據。
首先,我們需要安裝Selenium庫和相應的瀏覽器驅動,比如Chrome瀏覽器驅動:
pip install selenium
然後,我們需要啟動瀏覽器並打開頁面:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://example.com')
最後,我們可以通過Selenium模擬用戶的操作,比如點擊按鈕或者滾動頁面。例如,下面的例子中,我們模擬點擊了一個按鈕,並等待頁面加載完畢:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver.find_element(By.ID, 'button').click()
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'result')))
三、使用BeautifulSoup解析網頁內容
在獲取到網頁源代碼之後,我們需要使用解析器來提取需要的數據。這裡我們可以使用Python中最流行的解析庫之一:BeautifulSoup。
我們可以使用BeautifulSoup來提取HTML標籤和屬性、內容等信息。例如,下面的例子中,我們通過BeautifulSoup提取了一個列表中所有鏈接的URL:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
links = soup.select('ul > li > a')
for link in links:
print(link['href'])
四、一個完整的動態網頁爬蟲實例
下面是一個完整的動態網頁爬蟲實例,它使用Selenium模擬用戶登錄GitHub並抓取用戶倉庫的名稱和URL。需要注意的是,由於GitHub網站的反爬蟲機制,我們還需要設置Selenium的代理IP。完整代碼如下:
from selenium import webdriver
from bs4 import BeautifulSoup
proxy = 'http://127.0.0.1:8080'
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s' % proxy)
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://github.com/login')
# Fill in username and password
driver.find_element_by_id('login_field').send_keys('your_username')
driver.find_element_by_id('password').send_keys('your_password')
driver.find_element_by_name('commit').click()
# Wait for page to load
driver.implicitly_wait(10)
# Navigate to user's repositories page
driver.get('https://github.com/your_username?tab=repositories')
# Get page content
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
# Extract repository names and URLs
repositories = soup.find_all('a', itemprop='name codeRepository')
names = [r.text.strip() for r in repositories]
urls = [r['href'] for r in repositories]
# Print results
for name, url in zip(names, urls):
print(name + ': ' + url)
# Quit browser
driver.quit()
原創文章,作者:AVRW,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/143599.html