电商数据爬取项目邪修面试
声明,该项目只适合中小公司,适用岗位为初级爬虫/数据采集/电商流程自动化/RPA。结合我过往面试中遇到的问题总结
主要平台:淘宝、京东的数据爬取
技术栈:request、redis、Selenium/playwright、Pandas
可视化:PBI/飞书表格
面试中可能遇到的问题
1,面试时项目介绍
主要采集两个平台的商品基础信息(商品名称、规格、价格书、商家、用户评论),用Selenium去提取Cookie值保持登录,然后用request请求页面数据,将爬取到的数存入Excel/Mysql中然后用Pandas清洗数据,数据量介绍在8000-12000之间都行,也可不介绍
2,selenium和pandas具体有哪些方法?对应的作用
1.Selenium 核心方法:
"""初始化Selenium Chrome驱动(反检测配置)"""
chrome_options = Options()# 反检测核心配置
chrome_options.add_experimental_option("excludeSwitches",["enable-automation"])
chrome_options.add_experimental_option("useAutomationExtension",False)
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--no-sandbox")
# 初始化驱动
service = Service(ChromeDriverManager().install()) # 记住Service、options、driver就行
driver = webdriver.Chrome(service=service, options=chrome_options)
# 禁用webdriver标识(关键反爬)
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
driver.maximize_window()
- webdriver.Chrome()/webdriver.Edge():启动对应浏览器驱动,项目中用 Chrome,配合options配置无痕模式、禁用弹窗 / 图片(提升爬取速度)。
- options.add_argument():配置浏览器参数,比如--headless=new(无头模式,后台运行不显示界面,部署 Linux 服务器必用)、--disable-images(禁用图片加载)
- driver.get(url):打开目标 URL,项目中用于打开电商登录页、商品页。
- driver.refresh():刷新页面,解决页面加载异常、Cookie 过期后重新加载。
- driver.implicitly_wait(n):隐式等待 n 秒,全局等待页面元素加载,避免因元素未渲染导致报错(项目中设 10 秒)。
- WebDriverWait(driver, n).until(EC.presence_of_element_located((定位方式, 定位值))):显式等待,精准等待指定元素加载(比隐式灵活,项目中爬取动态渲染的商品价格时必用)。
- driver.find_element(By.XPATH, 'xpath表达式'):单个元素定位,项目中用于定位登录框、商品名称 / 价格标签(XPath 是最常用的,适配电商复杂页面)。
- driver.find_elements(By.XPATH, 'xpath表达式'):多个元素定位,爬取商品列表、评论列表时用,返回元素列表可循环提取。
- driver.get_cookies():提取浏览器所有 Cookie,返回字典列表(含 name/value 等)
- driver.quit():关闭浏览器驱动 + 所有标签页
- driver.close():关闭当前标签页,爬取多商品时关闭无用标签页
2.Pandas 核心方法
- pd.DataFrame(数据, columns=列名):创建 DataFrame,项目中把爬虫提取的商品数据(列表 / 字典)转成结构化表格,方便后续处理。
- pd.read_excel('/csv')/pd.to_excel('/csv'):读取 / 保存 Excel/CSV 文件,项目中用于读取代理 IP 列表、保存爬取后的商品数据
- df.drop_duplicates(subset=['列名']):删除重复行,项目中按「商品 ID」去重,避免重复爬取的数据冗余。
- df.dropna(subset=['列名'], how='any'):删除指定列的空值行,项目中删除商品价格 / 名称为空的无效数据。
- df.fillna(值, inplace=True):填充空值,项目中用「0」填充库存空值、用「未知」填充规格空值。
- df.astype({'列名': 类型}):修改列数据类型,项目中将爬取的「价格」从字符串转成 float(方便后续统计)。
- df.rename(columns={'原列名': '新列名'}, inplace=True):重命名列,统一爬虫数据的列名格式(比如把「售价」改成「日常价」)。
- df[df['列名'] 条件]:按条件筛选行,项目中筛选「价格 <100」「销量> 1000」的竞品商品,支撑运营分析。
- df.loc[行条件, 列名]:精准定位行 + 列,项目中批量修改指定商品的字段值(比如修正爬取错误的价格)。
3,怎么提取的Cookie值
仅用 Selenium 配反爬参数启动浏览器,扫码登录淘宝后提取并格式化 Cookie,缓存到 Redis(设 1.5 小时过期),立即关闭浏览器,全程不渲染商品页,避免资源占用和反爬检测
# 方法1
cookies = driver.get_cookies()
cookie_str = "; ".join([f"{c['name']}={c['value']}" for c in cookies])
# 方法2
登录后直接在浏览器控制台找到cookie值复制
步骤:F12后切换到Application()应用标签,左侧找到Cookies展开https://www.taobao.com右侧就是所有的Cookie,name为键,value为值。_tb_token_:登录令牌、un、nick:用户名/昵称
4,在爬取过程中遇到过哪些问题?
遇到的问题 | 具体场景 | 解决方法 |
Cookie 失效导致爬取中断 | 淘宝 Cookie 时效约 2 小时,失效后无法获取商品详情 | 1.设计 Cookie 定时刷新机制:用 Selenium 每 1.5 小时自动重新登录,更新 Redis 中的 Cookie; 2.爬取时加入 Cookie 有效性校验(请求返回 401 时,触发重新登录) |
IP 被封禁 | 爬取到 2000 条时,所有请求返回 403,IP 无法访问淘宝 | 1.搭建付费高匿代理池(80 个有效 IP),实现 “每爬取 10 条商品切换 1 个 IP”; 2.加入 IP 有效性检测(每 10 分钟检测 1 次,剔除失效 IP); 3.限制单 IP 访问频率(每秒 1 次) |
爬取效率低 | 单线程爬取,每条商品平均耗时 5.4 秒 | 1.用 Python 的 asyncio+aiohttp构建异步爬取,结合asyncio.Semaphore控制并发 2.优化数据写入逻辑(每 1000 条批量提交 1 次,而非单条插入) |
商品 URL 重复爬取 | Redis 队列中存在重复 URL,导致数据冗余 | 1.爬取前用 Redis 的 set 数据结构去重(URL 作为 key,避免重复入队); 2.写入 MySQL 时,用 “商品 ID” 作为唯一索引,避免重复数据 |
{api:mtop.relationrecommend.wirelessrecommend.recommend,v:2.0,ret:[RGV587_error::SM:哎呦喂,被挤爆了,请稍后重试],data:{url:https://bix.alicdn.com} | 在爬取一定数量后,显示。并且后续无数据。 原因:触发了临时限流或人机验证拦截(验证码) | 1,立即停止请求,冷却 IP 2,优化请求频率,模拟真人访问节奏 3,最后方案是改用 playwright爬取剩下的数据,playwright比Selenium更好处理验证码。也可以Selenium,哪个熟悉选哪个 |
5,你提到 “搭建简易代理池实现 IP 自动轮换”,这个代理池的 IP 来源是什么?是免费代理还是付费代理?怎么筛选有效 IP、剔除失效 IP?
代理池用的是付费高匿代理(稳定性比免费代理高),通过 Python 脚本定时(每 20 分钟)检测代理可用性,剔除响应时间超过 3 秒或返回状态码非 200 的 IP
6,你是否了解布隆过滤器
这里如实回答,了解就了解。不会就不会,应为大概率会接着往下问
BLOOMFILTER用于判断一个元素是否存在于一个集合
空间效率高:无需存储实际元素,占用空间小于传统数据结构
时间复杂度低:插入和查询操作的时间复杂度均为O(k)
应用场景:
缓存穿透防护,防止大量不存在的请求穿透缓存访问数据库,减轻数据库压力
垃圾邮件过滤:快速判断一封邮件是否为垃圾邮件,提高过滤效率
分布式系统中的数据同步:在多个节点之间同步数据状态,减少数据传输量
7,动态请求头生成模块里,除了 User-Agent、Referer,还会有哪些字段?
Accept、Accept-Encoding、Cache-Control
8,淘宝和京东的加密参数有哪些?怎么处理的?
淘宝 | 参数 | 作用 | 生成逻辑 | 处理方案 |
sign | 接口请求签名 | md5 (token&t&appKey&data) 或 HMAC-SHA256 (动态盐值 + 参数集) | 需逆向 JS 获取 token 和加密逻辑,公式为 在Selenium中禁用浏览器自动化标识 chrome_options.add_argument("--disable-blink-features=AutomationControlled") | |
t/timestamp | 时间戳 | 毫秒级时间戳 | ||
京东 | ||||
sign | 接口签名 | 参数 ASCII 升序 + AppSecret 后 MD5 加密 | ||
h5st | 核心签名参数 | 多重加密:HMAC-MD5 (密钥 + 参数)+AES (动态向量) | Selenium渲染中避开 H5ST 逆向,通过浏览器自动化获取数据chrome_options.add_experimental_option("excludeSwitches",["enable-automation"]) chrome_options.add_experimental_option("useAutomationExtension",False) driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") |
9,能举一个具体的正则表达式案例吗?比如如何提取 “物流太慢”“质量不好” 这类负面反馈?
比如,text ="某院:123456789023546,时间:2026-02-20" pattern =r'某院:(\b\d{15}\b)'
re的常用核心函数
函数 | 作用 | 示例 |
re.findall(pattern, text) | 提取所有匹配的结果(列表) | re.findall(r'\d{15}', text) |
re.search(pattern, text) | 找到第一个匹配的结果(对象) | re.search(r'(\d{15})', text).group(1) |
re.match(pattern, text) | 从字符串开头匹配(仅匹配开头) | re.match(r'100','1002356') → 匹配成功 |
re.sub(pattern, repl, text) | 替换匹配的内容 | re.sub(r'优惠', '折扣', text) |
10,xpath方法,举例子
- /:表示从根节点开始定位,表示一个层级 - //:表示多个层级,可以从任意位置开始定位 - 属性定位://div[@class='song'] - 索引定位://div[@class='song']/p[2] - 取文本:/text() 获取标签中直系文本的内容 //text() 标签中非直系文本内容 - 取属性://@属性名 例如 //@src 取得src的值
基本情况
这个项目基本就只问这些了,然后就是python的话就一些基础语法之类。将面试官一步步引导,比如一开始用的request库,问你遇到爬取中遇到的问题并怎么解决的,你就说,爬到一定数据时会出现人机交互,无法爬取后续内容,以目前能力,只能以Selenium/playwright/影刀继续爬取接下来的数据。面试中不要说自己不会的技术,如果说了想办法绕回自己熟悉的技术。另外基础一定要认真打牢,现在ai很方便可能导致我们很少再去手动一个个敲代码,基本是tab键一路按下去。建议有时间自己去试试,记录自己爬取中遇到的问题,在面试中也好讲
#面试常问题系列##面试##面试记录#