
實時航班追蹤背后的技術:在線飛機追蹤器的工作原理
from bs4 import BeautifulSoup
import pandas as pd
# 目標URL
url = "https://www.bbc.com/news"
# 發送HTTP請求,獲取網頁內容
response = requests.get(url)
response.encoding = 'utf-8' # 設置編碼
html_content = response.text
# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(html_content, 'lxml')
# 查找所有新聞標題和鏈接
news_items = soup.find_all('a', class_='gs-c-promo-heading')
# 提取新聞標題和鏈接
news_list = []
for item in news_items:
title = item.get_text(strip=True)
link = "https://www.bbc.com" + item['href']
news_list.append({'title': title, 'link': link})
# 將數據存儲到DataFrame中
df = pd.DataFrame(news_list)
# 保存到CSV文件
df.to_csv('bbc_news.csv', index=False, encoding='utf-8')
print("新聞數據已保存到bbc_news.csv")
requests.get(url)
:發送HTTP GET請求,獲取網頁內容。BeautifulSoup(html_content, 'lxml')
:使用lxml
解析器解析HTML文檔。soup.find_all('a', class_='gs-c-promo-heading')
:查找所有<a>
標簽,且class
為gs-c-promo-heading
。item.get_text(strip=True)
:提取標簽內的文本內容,并去除空白字符。item['href']
:提取<a>
標簽的href
屬性,即新聞鏈接。pd.DataFrame(news_list)
:將提取的數據存儲到Pandas的DataFrame中。df.to_csv('bbc_news.csv', index=False, encoding='utf-8')
:將DataFrame保存為CSV文件。運行上述代碼后,你將在當前目錄下看到一個名為bbc_news.csv
的文件,其中包含了BBC新聞網站首頁的新聞標題和鏈接。
有些新聞網站采用動態加載技術(如AJAX),頁面內容在初始加載時并不包含所有數據,而是通過JavaScript動態加載。對于這類網站,我們需要使用更高級的爬蟲技術,如Selenium
或requests-html
。
我們以CNN新聞網站(4.2 環境準備
首先,我們需要安裝 然后,下載與你的Chrome瀏覽器版本匹配的ChromeDriver,并將其路徑添加到系統環境變量中。 以下是使用 運行上述代碼后,你將在當前目錄下看到一個名為 許多新聞網站會通過檢查請求頭來識別爬蟲。為了繞過這一限制,我們可以設置請求頭,模擬瀏覽器行為。以下是一個示例: 為了防止IP被封禁,我們可以使用代理IP來發送請求。以下是一個示例: 有些網站會通過驗證碼來阻止爬蟲。對于這種情況,我們可以使用OCR技術(如 本文詳細介紹了如何爬取全球新聞網站的數據,包括靜態頁面和動態加載頁面的爬取方法,并提供了實操性強的代碼示例。通過本文的學習,你應該能夠掌握基本的新聞網站爬取技術,并能夠處理常見的反爬機制。 當然,爬取新聞網站數據時,務必遵守相關法律法規和網站的使用條款,避免對目標網站造成不必要的負擔。希望本文對你有所幫助,祝你在數據爬取的道路上越走越遠!Selenium
庫,并下載對應的瀏覽器驅動(如ChromeDriver)。你可以通過以下命令安裝Selenium
:pip install selenium
4.3 編寫爬蟲代碼
Selenium
爬取CNN新聞網站首頁新聞標題和鏈接的代碼示例:from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd
import time
# 初始化Chrome瀏覽器驅動
driver = webdriver.Chrome()
# 目標URL
url = "https://edition.cnn.com/"
# 打開目標網頁
driver.get(url)
# 等待頁面加載完成
time.sleep(5)
# 查找所有新聞標題和鏈接
news_items = driver.find_elements(By.CSS_SELECTOR, 'a.container__link')
# 提取新聞標題和鏈接
news_list = []
for item in news_items:
title = item.text
link = item.get_attribute('href')
if title and link: # 過濾空標題和空鏈接
news_list.append({'title': title, 'link': link})
# 將數據存儲到DataFrame中
df = pd.DataFrame(news_list)
# 保存到CSV文件
df.to_csv('cnn_news.csv', index=False, encoding='utf-8')
# 關閉瀏覽器
driver.quit()
print("新聞數據已保存到cnn_news.csv")4.4 代碼解析
webdriver.Chrome()
:初始化Chrome瀏覽器驅動。driver.get(url)
:打開目標網頁。time.sleep(5)
:等待頁面加載完成(可以根據實際情況調整等待時間)。driver.find_elements(By.CSS_SELECTOR, 'a.container__link')
:使用CSS選擇器查找所有<a>
標簽,且class
為container__link
。item.text
:提取標簽內的文本內容。item.get_attribute('href')
:提取<a>
標簽的href
屬性,即新聞鏈接。driver.quit()
:關閉瀏覽器。4.5 運行結果
cnn_news.csv
的文件,其中包含了CNN新聞網站首頁的新聞標題和鏈接。5. 處理反爬機制
5.1 設置請求頭
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
response = requests.get(url, headers=headers)5.2 使用代理IP
proxies = {
'http': 'http://your_proxy_ip:port',
'https': 'https://your_proxy_ip:port'
}
response = requests.get(url, proxies=proxies)5.3 處理驗證碼
pytesseract
)來自動識別驗證碼,或者手動輸入驗證碼。6. 總結
熱門場景實測,選對API