提取网站所有链接
浏览器地址栏里敲下任意一个网址,网站回车,链接页面加载完成的网站那一瞬间,你看到的链接只是表象。真正藏在HTML源码里的网站,是链接几十条甚至上百条指向其他页面的标签。写爬虫的网站人管这叫"出链",做SEO的链接管这叫"外链资源",而普通用户根本不会右键查看源代码——他们只关心点下去能不能打开。网站
我前阵子接了个活儿,链接帮一个电商客户梳理他们竞争对手的网站站内链接结构。对方是链接个中型B2B平台,产品分类有七层嵌套。网站用Python的链接requests库拉首页HTML,再拿正则匹配href属性?网站太天真了。现代网站早就不这么玩了——JavaScript动态渲染的内容,你直接抓源码只能拿到一个空壳。得用Selenium模拟浏览器,或者干脆上Playwright,等页面里的异步请求全部跑完,再执行一段document.querySelectorAll('a'),把href属性挨个抠出来。
提取链接这事儿,技术难点从来不在"提取"本身。难点在于过滤。一个电商页面里,导航栏、面包屑、底部友情链接、广告位、用户头像跳转、购物车图标——这些全是链接,但你要的是产品详情页。写规则的时候,得先观察URL的规律。比如对方产品页的路径都带/product/这个关键词,那么正则就写成href="([^"]*product[^"]*)"。但总有例外,有的链接是相对路径,有的带着utm_source参数,有的指向PDF文件。你得在代码里加一堆条件判断,把.css和.js的链接剔掉,把javascript:void(0)这种伪链接忽略掉。
我见过最坑的情况是,某个网站把所有外部链接都做了跳转加密,href属性里存的是/redirect?url=encoded_string。你要是直接抓,抓出来的全是中转页,根本拿不到真实域名。这时候就得先decode一次,再提取参数里的url字段。还有的网站为了防止爬虫,故意在HTML里塞一堆display:none的隐藏链接,用来迷惑新手采集器。这种反爬手段不算高明,但确实能筛掉一批偷懒的程序员。
等你把链接列表拿到手,另一个问题来了——去重。同一个产品页,可能同时存在于"热门推荐"板块和"同类产品"板块,href一模一样。用set去重是基本操作,但要注意URL末尾的斜杠和锚点#section这类细节。我习惯把每个链接都做一次规范化处理:去掉协议头(http/https)、去掉www前缀、去掉尾部斜杠、去掉所有query参数。这样处理完,两千条原始链接能压缩到八百条有效URL。
真正让我觉得有意思的,是提取完链接之后的分析。你把所有链接按域名分组,能看出这个网站的内容分发策略——哪些页面被频繁引用,哪些页面孤零零地挂在角落。之前分析过一个行业资讯站,发现他们首页的链接有40%指向自己站内的旧文章,而那些旧文章的发布时间大多是三年前。这说明什么?要么是编辑懒得更新,要么是SEO策略故意让老页面继续获得权重。你光看页面是看不出这些门道的,但链接提取把底层结构暴露出来了。
工具方面,我平时用命令行工具更顺手。比如用curl加grep先粗略扫一遍,再用Python写个脚本做精细处理。但有一次客户非要我用Excel给他交付结果,说他们运营团队不会写代码。行吧,我就在Python里用openpyxl库把链接列表导出成表格,分列排好:URL、锚文本、是否内部链接、是否带nofollow属性。他拿到手之后,用Excel的筛选功能自己按域名排序,照样能干活。工具是死的,人是活的。
最后提个醒——提取别人的网站链接之前,先看一眼robots.txt。虽然技术上你能抓,但有些站长明确禁止爬虫访问特定路径。我一般只抓首页和一级分类页,不深入抓取用户个人主页或者后台管理页面。这不是道德绑架,纯粹是怕惹麻烦。真要大规模采集,用代理IP轮换是基础操作,不然IP被封了,连正常浏览都受影响。
链接提取这活儿,干久了会形成一种条件反射——看到任何一个网页,第一反应是Ctrl+U查看源代码,然后下意识找href。我上次陪朋友逛淘宝,盯着页面看了半天,脱口而出:"这个店铺的友情链接指向了三个不同的导购站。"朋友瞪了我一眼,说你有病吧。我笑了笑没解释。这大概就是技术人员的职业病,代码看多了,世界在眼里就是一层层的标签和属性。

喜欢
讨厌