Python数据采集与处理核心技术解析
HTTP通信机制与请求配置
在数据抓取过程中,正确构造HTTP请求是获取目标内容的基础。客户端通过请求头传递自身信息,影响服务器响应行为。
request_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Referer': 'https://example.com',
'Connection': 'keep-alive',
'Upgrade-Insecure-Requests': '1'
}
高效请求管理与异常处理
使用会话对象可复用连接并自动管理状态,结合重试策略提升网络稳定性。
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
session = requests.Session()
retry_policy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry_policy)
session.mount('http://', adapter)
session.mount('https://', adapter)
response = session.get(url, headers=request_headers, timeout=10)
response.raise_for_status() # 自动抛出非2xx状态码异常
HTML结构解析技术对比
根据需求选择合适的解析工具:BeautifulSoup适合简单场景,lxml支持XPath表达式进行精准定位。
from bs4 import BeautifulSoup
from lxml import etree
# BeautifulSoup 解析
soup = BeautifulSoup(html_content, 'xml') # 支持XPath
# lxml 解析
html_doc = etree.HTML(html_content)
元素定位与数据提取方法
灵活运用多种选择器组合实现复杂页面结构的精准提取。
# BeautifulSoup 基础操作
title = soup.find('h1').get_text(strip=True)
links = soup.find_all('a', href=True)
# CSS选择器高级用法
results = soup.select('section.result > .job-title')
filtered_items = soup.select('div[data-status="active"]')
# 正则匹配标签
import re
headers = soup.find_all(re.compile(r'^h[1-6]'))
XPath表达式实战应用
利用XPath语法实现多层级节点筛选和属性匹配。
# 节点选择与属性提取
elements = html_doc.xpath('//div[@class="item"]/span[@class="price"]/text()')
urls = html_doc.xpath('//a[contains(@href, "job")]/@href')
# 条件过滤与文本处理
first_item = html_doc.xpath('//li[position()=1]/text()')
last_element = html_doc.xpath('//div[last()]//text()')
Excel文件自动化处理
通过openpyxl实现数据写入、样式设置与格式化输出。
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment
workbook = Workbook()
sheet = workbook.active
sheet.title = '采集结果'
# 写入表头
headers = ['职位名称', '公司', '薪资范围']
sheet.append(headers)
# 设置标题行样式
for cell in sheet[1]:
cell.font = Font(bold=True, color='FFFFFF')
cell.fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
cell.alignment = Alignment(horizontal="center")
# 批量插入数据
data_rows = [
['Python工程师', '科技有限公司', '15K-25K'],
['数据分析员', '创新企业', '10K-18K']
]
for row in data_rows:
sheet.append(row)
# 调整列宽与合并单元格
sheet.column_dimensions['A'].width = 25
sheet.merge_cells('A1:C1')
workbook.save('output_data.xlsx')
多格式数据持久化方案
根据数据类型选择合适存储方式,确保信息完整性和可读性。
# 文本存储
with open('raw_data.txt', 'w', encoding='utf-8') as f:
f.write(content)
# JSON存储(保留中文字符)
import json
with open('structured_data.json', 'w', encoding='utf-8') as f:
json.dump(data_list, f, ensure_ascii=False, indent=2)
# SQLite数据库存储
import sqlite3
conn = sqlite3.connect('collected_data.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS job_records (
title TEXT, company TEXT, salary TEXT, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)''')
cursor.executemany('INSERT INTO job_records VALUES (?, ?, ?, ?)', records)
conn.commit()
conn.close()
