写爬虫最烦的就是被反爬。你辛辛苦苦写了几百行代码,运行五分钟就返回空白数据,这种挫败感真的不好受。我不是什么大神,但摸爬滚打这么多年,也攒了点实用的绕过方法。今天聊四个最管用的,你照着试试,大概率能解决问题。
第一个方法,搞一套像真人的请求头。很多反爬只看User-Agent。你去网上随便找一个Chrome的User-Agent,填进代码里。别用Python默认的那个,太显眼了。你可以在请求头里加上Accept-Language、Accept-Encoding这些字段,凑成一副完整的浏览器模样。要是还不行,试试把Referer也带上,假装你是从谷歌点过来的。这套组合拳能挡住大部分基础反爬。
第二个方法,控制好爬取速度。别像个疯子一样一秒发一百次请求。正常人看网页哪会这么快。把你的代码里加上time.sleep,在两次请求之间等两秒。要是目标网站比较敏感,你可以等五秒甚至十秒。用随机数控制等待时间,比如2到5秒之间随机。爬取一万条数据,最多多花几分钟,但数据能稳定拿到。这个代价很划算。
第三个方法,用代理IP换着来。同一个IP地址频繁访问同一个网站,很容易被记上黑名单。你可以弄一批代理IP,每次请求换个IP。免费的代理池质量一般,容易失灵。付费的代理池虽然要花钱,但稳定很多。你要是只爬几千条数据,免费代理也够用了。每次请求前从池子里随机抽一个IP,成功率能提升不少。
第四个方法,模拟浏览器的官方无头模式。很多网站会检测你是不是用Selenium或者Playwright这种工具。你可以给这些工具加参数,让它们运行时看起来像正常的浏览器。比如给Chrome加上--disable-blink-features=AutomationControlled这个参数。有些网站还要你模拟鼠标移动和滚动,不然不给你数据。写几行代码自动滑动一下页面,成本很低但效果很好。
这四个方法你一个一个试,通常卡在第一关就解开了。真正复杂的反爬要组合着用,但绝大多数网站用这一套就能应付。尽量别去碰那些大厂的网站,他们的反爬策略要专业得多。数据拿得到是本事,拿不到就换条路,别硬刚。写代码比跟网站置气有意思多了。