您现在的位置是:探索 >>正文

批量抓取网页链接

探索93318人已围观

简介写个爬虫批量抓链接,最怕的就是跑了一半发现全是重复的,或者漏掉了动态加载的内容。上个月帮朋友抓一个本地论坛的商家信息,他想要所有店铺的主页链接。我打开页面一看,列表页只有二十条,翻页按钮点一下才加载新 ...

写个爬虫批量抓链接,批量最怕的网页就是跑了一半发现全是重复的,或者漏掉了动态加载的链接内容。上个月帮朋友抓一个本地论坛的批量商家信息,他想要所有店铺的网页主页链接。我打开页面一看,链接列表页只有二十条,批量翻页按钮点一下才加载新数据。网页直接用 requests 加 BeautifulSoup 拿到的链接 HTML 里,压根没有后面那些链接。批量这就是网页典型的静态抓取撞上动态渲染。

解决思路不复杂:要么找到背后那个 XHR 接口,链接要么用浏览器自动化工具硬等。批量我选了前者。网页打开开发者工具的链接 Network 面板,筛选 Fetch/XHR,刷新页面,果然看到一个返回 JSON 的请求。请求地址里有个 page=1 的参数,改一下就能翻页。返回的数据里,每个商家对象都带 url 字段。写个循环,从 page=1 跑到 page=50,每跑一次把 url 塞进一个 set 里。用 set 而不是 list,是因为论坛里同一个商家可能出现在不同分类下,重复链接特别多。最后 set 里剩下 437 个唯一链接,而原始请求返回了 600 多条记录——重复率接近三成。

不是所有网站都这么老实。有些站点把链接藏在 JavaScript 变量里,或者用 base64 编码过。这时候正则表达式比 HTML 解析器更管用。比如 href="javascript:openUrl('aHR0cHM6Ly...')",你得先把那串 base64 解出来。我习惯先抓整个页面的 HTML 源码,然后用 re.findall(r'https?://[^\s"\'<>]+', html) 粗筛一遍。这个正则不完美,会抓到图片链接、CSS 文件、甚至注释里的示例 URL。但作为第一轮过滤足够快。之后再用域名白名单或者路径模式筛掉噪音。

批量抓取真正麻烦的地方在于控制频率。有次我写了个循环,每秒钟请求二十次,跑了三十秒就被封 IP 了。后来改成每次请求后 time.sleep(random.uniform(1.5, 3.5)),再配合一个轮换的 User-Agent 列表。速度慢下来,但稳定跑完几千页没问题。另一个坑是相对链接。抓到的 /shop/123 这种,得用 urljoin(base_url, link) 拼成绝对地址。否则存到数据库里全是半截路径,后期清理起来头疼。

如果你只是偶尔抓几个页面,浏览器控制台里一行代码就能搞定:Array.from(document.querySelectorAll('a')).map(a => a.href)。但要是目标有几百上千页,还是老老实实写脚本。Python 的 concurrent.futures 可以开线程池,把请求并发数控制在 5 到 10 之间。别贪心,开太多反而容易触发验证码。我一般会加个简单的重试逻辑:某个链接请求失败,等两秒再试一次,连续失败三次就跳过并记到日志里。最后去日志里看哪些漏了,手动补一下。抓链接这件事,快不是目的,完整和不被封才是。

Tags:

相关文章

  • 幸运快三技巧

    探索

    彩票店老板老周跟我说过一句话:“玩快三的人,十个里有九个是来送钱的,剩下那个是来送更多钱的。”话糙理不糙。我蹲了三天彩票站,看了上百把开奖,发现那些真正能活着走出门的人,靠的压根不是什么玄学,而是三件 ...

    【探索】

    阅读更多
  • 免费素材下载网站

    探索

    免费素材下载网站,听起来像是设计师的福音,但用多了你会发现,它们更像是一个巨大的、充满惊喜和惊吓的盲盒。 我最早接触这类网站,是为了找一张高清的星空图做PPT背景。百度搜出来的图片,放大全是马赛克。后 ...

    【探索】

    阅读更多
  • fnaf安全漏洞汉化补丁

    探索

    《fnaf安全漏洞汉化补丁》这个标题看着像玩笑,但Steam社区里真有人这么干。有个ID叫“Pizza_Time”的老哥,去年十二月发了个帖子,标题就是这七个字。点进去一看,他所谓的“安全漏洞”,指的 ...

    【探索】

    阅读更多


友情链接