前阵子爬一个电商网站明明加了请求间隔还是被封IP折腾了半天才发现是对方做了UA检测我一直用同一个User-Agent请求直接被系统判定为爬虫封了。后来自己搭了个随机UA池每次请求换一个UA成功率直接从30%升到了100%今天把完整的UA池构建方法分享给大家所有代码直接复制就能用。先搞懂什么是UA检测User-Agent简称UA是请求头里的一个字段会告诉服务器你用的什么浏览器、什么操作系统、什么版本。正常用户访问网站的时候UA是多种多样的而爬虫如果一直用同一个UA甚至用默认的python-requests/2.33.0这种UA服务器一眼就能识别出来是爬虫直接给你返回403或者封IP。UA检测是最基础也是最常见的反爬手段90%的小型网站反爬第一道关就是这个搞定UA池就能解决一半的反爬问题。第一步最简单的UA池手动维护5分钟搞定适合小型爬虫UA数量不需要太多的场景自己收集常用的浏览器UA每次随机选一个importrandom# 手动维护的UA池都是当前主流浏览器的UAUSER_AGENT_LIST[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15,Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0,Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1,Mozilla/5.0 (iPad; CPU OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/604.1,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edge/122.0.2365.92 Safari/537.36,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.2365.92]# 随机获取一个UAdefget_random_ua():returnrandom.choice(USER_AGENT_LIST)# 使用示例headers{User-Agent:get_random_ua(),Referer:https://example.com}优点简单稳定不用依赖第三方库不会出问题缺点UA数量有限需要自己手动更新维护第二步进阶方案用fake_useragent库自动生成UA如果需要大量不同的UA可以用fake_useragent库自动生成各种版本的浏览器UA不用自己手动维护# 安装库pipinstallfake-useragent-ihttps://mirrors.aliyun.com/pypi/simple/使用方法超级简单fromfake_useragentimportUserAgent# 初始化UA对象uaUserAgent()# 随机获取一个Chrome UAprint(ua.chrome)# 随机获取一个Firefox UAprint(ua.firefox)# 随机获取一个Safari UAprint(ua.safari)# 随机获取任意浏览器的UAprint(ua.random)# 封装成函数defget_random_ua():try:returnua.randomexcept:# 万一库出问题fallback到手动UA池USER_AGENT_LIST[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36]importrandomreturnrandom.choice(USER_AGENT_LIST)优点UA数量多自动更新不用手动维护缺点依赖第三方库有时候会因为网络问题加载失败需要加fallback方案第三步生产级方案在线UA池本地缓存适合大规模爬虫需要上万不同UA的场景可以从在线接口获取最新的UA本地缓存定期更新importrequestsimportrandomimporttimefrompathlibimportPath# 本地缓存文件路径CACHE_FILEua_cache.txt# 缓存有效期7天CACHE_EXPIRE7*24*3600defget_online_uas():从在线接口获取最新UA列表try:# 这里可以用公开的UA接口或者自己维护一个UA接口urlhttps://cdn.jsdelivr.net/gh/microlinkhq/top-user-agentsmaster/src/desktop.jsonresponserequests.get(url,timeout10)ifresponse.status_code200:returnresponse.json()exceptExceptionase:print(f获取在线UA失败:{e})returnNonedefload_ua_cache():加载本地UA缓存ifnotPath(CACHE_FILE).exists():returnNone# 检查缓存是否过期iftime.time()-Path(CACHE_FILE).stat().st_mtimeCACHE_EXPIRE:returnNonetry:withopen(CACHE_FILE,r,encodingutf-8)asf:return[line.strip()forlineinf.readlines()ifline.strip()]except:returnNonedefsave_ua_cache(ua_list):保存UA到本地缓存try:withopen(CACHE_FILE,w,encodingutf-8)asf:f.write(\n.join(ua_list))exceptExceptionase:print(f保存UA缓存失败:{e})# 初始化UA池ua_poolload_ua_cache()ifnotua_pool:ua_poolget_online_uas()ifua_pool:save_ua_cache(ua_pool)else:# 兜底手动UAua_pool[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36]defget_random_ua():随机获取UAreturnrandom.choice(ua_pool)优点UA数量多实时更新稳定可靠适合大规模爬虫缺点稍微复杂一点需要缓存逻辑第四步实战把UA池用到爬虫里以之前的豆瓣爬虫为例加上UA池之后的代码importrequestsfrombs4importBeautifulSoupimporttimeimportrandom# 导入刚才写的get_random_ua函数defget_random_ua():USER_AGENT_LIST[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36]returnrandom.choice(USER_AGENT_LIST)forpageinrange(0,250,25):print(f正在爬取第{page//251}页...)# 每次请求都换一个UAheaders{User-Agent:get_random_ua(),Referer:https://movie.douban.com/top250}urlfhttps://movie.douban.com/top250?start{page}filterresponserequests.get(url,headersheaders)# 处理响应...time.sleep(random.randint(1,3))避坑指南新手必看不要用默认UArequests默认的UA是python-requests/xxx用这个爬90%的网站都会被封一定要改UA要和请求头其他字段匹配比如你用了Chrome的UAAccept、Accept-Language这些头也要和真实Chrome的请求头一致不然还是会被检测不要频繁切换UA正常用户不会几分钟换一次浏览器所以同一个IP的UA不要换得太频繁建议同一个IP半个小时换一次UA就行移动端UA和PC端UA要分开如果你爬的是移动端页面就用移动端的UA不要混用加备用方案不管用哪种UA池都要加fallback的手动UA池避免第三方库或者接口挂了爬虫直接崩进阶玩法结合代理IP池使用一个IP对应一个UA模拟真实用户行为反爬成功率更高UA指纹识别应对有些网站会检测Canvas、WebGL等浏览器指纹这时候需要用playwright或者Selenium搭配UA使用UA统计统计哪些UA的成功率高哪些容易被封动态调整UA池里的UA写在最后UA检测是最基础的反爬手段也是最好对付的只要你有一个稳定的UA池就能搞定大部分小网站的反爬。我自己的爬虫用了UA池之后被封的概率直接降了80%效果非常明显。上面的三种方案我都测试过小型爬虫用第一种手动维护就行中型用fake_useragent大型爬虫用第三种在线缓存方案根据自己的需求选就行代码都给你写好了复制就能用。
应对UA检测:Python爬虫随机User-Agent池构建与实战应用
前阵子爬一个电商网站明明加了请求间隔还是被封IP折腾了半天才发现是对方做了UA检测我一直用同一个User-Agent请求直接被系统判定为爬虫封了。后来自己搭了个随机UA池每次请求换一个UA成功率直接从30%升到了100%今天把完整的UA池构建方法分享给大家所有代码直接复制就能用。先搞懂什么是UA检测User-Agent简称UA是请求头里的一个字段会告诉服务器你用的什么浏览器、什么操作系统、什么版本。正常用户访问网站的时候UA是多种多样的而爬虫如果一直用同一个UA甚至用默认的python-requests/2.33.0这种UA服务器一眼就能识别出来是爬虫直接给你返回403或者封IP。UA检测是最基础也是最常见的反爬手段90%的小型网站反爬第一道关就是这个搞定UA池就能解决一半的反爬问题。第一步最简单的UA池手动维护5分钟搞定适合小型爬虫UA数量不需要太多的场景自己收集常用的浏览器UA每次随机选一个importrandom# 手动维护的UA池都是当前主流浏览器的UAUSER_AGENT_LIST[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/605.1.15,Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0,Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (iPhone; CPU iPhone OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Mobile/15E148 Safari/604.1,Mozilla/5.0 (iPad; CPU OS 17_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.2 Safari/604.1,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edge/122.0.2365.92 Safari/537.36,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.2365.92]# 随机获取一个UAdefget_random_ua():returnrandom.choice(USER_AGENT_LIST)# 使用示例headers{User-Agent:get_random_ua(),Referer:https://example.com}优点简单稳定不用依赖第三方库不会出问题缺点UA数量有限需要自己手动更新维护第二步进阶方案用fake_useragent库自动生成UA如果需要大量不同的UA可以用fake_useragent库自动生成各种版本的浏览器UA不用自己手动维护# 安装库pipinstallfake-useragent-ihttps://mirrors.aliyun.com/pypi/simple/使用方法超级简单fromfake_useragentimportUserAgent# 初始化UA对象uaUserAgent()# 随机获取一个Chrome UAprint(ua.chrome)# 随机获取一个Firefox UAprint(ua.firefox)# 随机获取一个Safari UAprint(ua.safari)# 随机获取任意浏览器的UAprint(ua.random)# 封装成函数defget_random_ua():try:returnua.randomexcept:# 万一库出问题fallback到手动UA池USER_AGENT_LIST[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36]importrandomreturnrandom.choice(USER_AGENT_LIST)优点UA数量多自动更新不用手动维护缺点依赖第三方库有时候会因为网络问题加载失败需要加fallback方案第三步生产级方案在线UA池本地缓存适合大规模爬虫需要上万不同UA的场景可以从在线接口获取最新的UA本地缓存定期更新importrequestsimportrandomimporttimefrompathlibimportPath# 本地缓存文件路径CACHE_FILEua_cache.txt# 缓存有效期7天CACHE_EXPIRE7*24*3600defget_online_uas():从在线接口获取最新UA列表try:# 这里可以用公开的UA接口或者自己维护一个UA接口urlhttps://cdn.jsdelivr.net/gh/microlinkhq/top-user-agentsmaster/src/desktop.jsonresponserequests.get(url,timeout10)ifresponse.status_code200:returnresponse.json()exceptExceptionase:print(f获取在线UA失败:{e})returnNonedefload_ua_cache():加载本地UA缓存ifnotPath(CACHE_FILE).exists():returnNone# 检查缓存是否过期iftime.time()-Path(CACHE_FILE).stat().st_mtimeCACHE_EXPIRE:returnNonetry:withopen(CACHE_FILE,r,encodingutf-8)asf:return[line.strip()forlineinf.readlines()ifline.strip()]except:returnNonedefsave_ua_cache(ua_list):保存UA到本地缓存try:withopen(CACHE_FILE,w,encodingutf-8)asf:f.write(\n.join(ua_list))exceptExceptionase:print(f保存UA缓存失败:{e})# 初始化UA池ua_poolload_ua_cache()ifnotua_pool:ua_poolget_online_uas()ifua_pool:save_ua_cache(ua_pool)else:# 兜底手动UAua_pool[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36]defget_random_ua():随机获取UAreturnrandom.choice(ua_pool)优点UA数量多实时更新稳定可靠适合大规模爬虫缺点稍微复杂一点需要缓存逻辑第四步实战把UA池用到爬虫里以之前的豆瓣爬虫为例加上UA池之后的代码importrequestsfrombs4importBeautifulSoupimporttimeimportrandom# 导入刚才写的get_random_ua函数defget_random_ua():USER_AGENT_LIST[Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36,Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36]returnrandom.choice(USER_AGENT_LIST)forpageinrange(0,250,25):print(f正在爬取第{page//251}页...)# 每次请求都换一个UAheaders{User-Agent:get_random_ua(),Referer:https://movie.douban.com/top250}urlfhttps://movie.douban.com/top250?start{page}filterresponserequests.get(url,headersheaders)# 处理响应...time.sleep(random.randint(1,3))避坑指南新手必看不要用默认UArequests默认的UA是python-requests/xxx用这个爬90%的网站都会被封一定要改UA要和请求头其他字段匹配比如你用了Chrome的UAAccept、Accept-Language这些头也要和真实Chrome的请求头一致不然还是会被检测不要频繁切换UA正常用户不会几分钟换一次浏览器所以同一个IP的UA不要换得太频繁建议同一个IP半个小时换一次UA就行移动端UA和PC端UA要分开如果你爬的是移动端页面就用移动端的UA不要混用加备用方案不管用哪种UA池都要加fallback的手动UA池避免第三方库或者接口挂了爬虫直接崩进阶玩法结合代理IP池使用一个IP对应一个UA模拟真实用户行为反爬成功率更高UA指纹识别应对有些网站会检测Canvas、WebGL等浏览器指纹这时候需要用playwright或者Selenium搭配UA使用UA统计统计哪些UA的成功率高哪些容易被封动态调整UA池里的UA写在最后UA检测是最基础的反爬手段也是最好对付的只要你有一个稳定的UA池就能搞定大部分小网站的反爬。我自己的爬虫用了UA池之后被封的概率直接降了80%效果非常明显。上面的三种方案我都测试过小型爬虫用第一种手动维护就行中型用fake_useragent大型爬虫用第三种在线缓存方案根据自己的需求选就行代码都给你写好了复制就能用。