请求协助:基于Python实现英国车辆查询网站数据爬取与存储
使用Python爬取英国车辆查询网站并存储数据到数据库
核心思路
该网站涉及多步交互(输入车牌→确认车辆归属),且存在JS渲染逻辑,优先用Selenium处理页面交互,配合BeautifulSoup提取目标内容,最后用SQLite(轻量易实现)存储数据。
所需依赖
先安装必要包:
pip install selenium beautifulsoup4
注意:需下载对应浏览器的Driver(如ChromeDriver),确保版本与浏览器匹配。
步骤1:模拟页面交互
实现输入车牌、提交表单及确认车辆归属的流程:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化Chrome浏览器 driver = webdriver.Chrome() driver.get("https://vehicleenquiry.service.gov.uk/") # 等待车牌号输入框加载并输入车牌 plate_input = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "Vrm")) ) plate_input.send_keys("AB12CDE") # 替换为目标车牌号 # 提交表单 submit_btn = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]') submit_btn.click() # 等待确认按钮加载并点击(元素选择器需根据页面实际调整) confirm_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[data-testid="confirm-vehicle"]')) ) confirm_btn.click() # 等待目标页面加载完成 time.sleep(2) page_source = driver.page_source driver.quit()
步骤2:提取指定颜色的文本
用BeautifulSoup解析页面,筛选红色、黄色、绿色文本:
from bs4 import BeautifulSoup soup = BeautifulSoup(page_source, 'html.parser') # 目标颜色对应的十六进制值(需对照页面实际样式调整) target_colors = { "red": "#dc3545", "yellow": "#ffc107", "green": "#28a745" } color_texts = {} for color_name, rgb in target_colors.items(): # 筛选所有style属性包含对应颜色的元素 elements = soup.find_all(style=lambda val: val and f"color:{rgb}" in val.lower()) color_texts[color_name] = [elem.get_text(strip=True) for elem in elements if elem.get_text(strip=True)] print("红色文本:", color_texts["red"]) print("黄色文本:", color_texts["yellow"]) print("绿色文本:", color_texts["green"])
注:若页面用RGB或颜色名称定义文本颜色,需同步修改target_colors中的值。
步骤3:存储到数据库
以SQLite为例,创建表并插入提取的数据:
import sqlite3 import json # 连接数据库(不存在则自动创建) conn = sqlite3.connect("vehicle_data.db") cursor = conn.cursor() # 创建车辆信息表 cursor.execute(''' CREATE TABLE IF NOT EXISTS vehicle_info ( id INTEGER PRIMARY KEY AUTOINCREMENT, plate_number TEXT NOT NULL, red_text TEXT, yellow_text TEXT, green_text TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ''') # 插入数据(用JSON格式存储多段文本) cursor.execute(''' INSERT INTO vehicle_info (plate_number, red_text, yellow_text, green_text) VALUES (?, ?, ?, ?) ''', ( "AB12CDE", json.dumps(color_texts["red"]), json.dumps(color_texts["yellow"]), json.dumps(color_texts["green"]) )) conn.commit() conn.close()
注意事项
- 反爬规避:添加随机等待时间、更换User-Agent,避免短时间内频繁请求触发风控。
- 元素更新:页面元素的ID、选择器可能变动,需定期检查调整代码定位逻辑。
- 合法性:确保爬取行为符合网站
robots.txt及当地数据保护法规,禁止未经授权的批量爬取。
内容的提问来源于stack exchange,提问作者Satyam Singh
相关产品推荐
相关产品推荐

