电商数据爬取项目邪修面试

声明,该项目只适合中小公司,适用岗位为初级爬虫/数据采集/电商流程自动化/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 和加密逻辑,公式为 sign = token + "&" + str(u) + "&" + s + "&" + n_data。(参可能有所变化,具体在控制台搜sign加密地方)

在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键一路按下去。建议有时间自己去试试,记录自己爬取中遇到的问题,在面试中也好讲

#面试常问题系列##面试##面试记录#
全部评论

相关推荐

26想校招上岸的菜鸟:但是不可否认的是 leader想要3个 结果投了1000个 领导筛了100个面试 当leader找到了满意的3个 让他们继续二面 但是同时 其他的97个也会让你一面 因为已经约面了总不能毁面吧 因为leader也不确定那3个能不能过后面的面试,以及来不来 因此 这97个有一部分作为那3个的后续 剩下的 就是走个过场 面完就挂 这就是我个人认为的kpi面
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务