游客发表
公司楼下奶茶店搞了个积分商城,爬虫我盯上那台蓝牙音箱好久了。网页每天手动点进去看库存,数据烦得要死。爬虫干脆写了个Java爬虫,网页每天早上八点自动抓一次那个网页,数据有货就发邮件提醒我。爬虫三天后音箱到手,网页同事还以为我天天蹲点抢的数据。
Java做爬虫,爬虫核心就三件事:拿到HTML、网页解析数据、数据存下来。爬虫别想得太玄乎,网页HttpClient发个GET请求,数据几十行代码的事。我用的Apache HttpClient,版本4.5.13,稳定得很。
CloseableHttpClient client = HttpClients.createDefault(); HttpGet request = new HttpGet("https://example.com/products"); CloseableHttpResponse response = client.execute(request); String html = EntityUtils.toString(response.getEntity()); 这段代码跑完,整个网页源码就躺在html变量里了。但别高兴太早,大部分网站返回的HTML垃圾得要命,满屏的script标签和样式代码,你要的数据可能藏在第500行。这时候得用Jsoup,Java世界里最顺手的HTML解析库。
Document doc = Jsoup.parse(html); Elements items = doc.select(".product-item"); for (Element item : items) { String name = item.select(".product-name").text(); String price = item.select(".price").text(); String stock = item.select(".stock-status").text(); } Jsoup的select方法用的是CSS选择器语法,懂前端的人上手零成本。我那个奶茶店项目,直接选中id为"stock-info"的div,判断里面有没有"补货中"三个字,有就触发邮件通知。整个爬虫加上异常处理,不到两百行。
但光会抓静态页面不够。现在很多网站数据是Ajax动态加载的,你看浏览器里显示得好好的,用HttpClient抓回来却什么都没有。这种情况得分析XHR请求,找到真正返回JSON数据的那个接口。打开浏览器开发者工具,切到Network面板,刷新页面,看哪个请求返回的是数据而非HTML。奶茶店那个网站比较老,还是服务端渲染,省了我不少事。
还有反爬这关。有些网站看到Java默认的User-Agent直接拒绝访问,你得伪装成浏览器。把User-Agent设成Chrome的,再加个Referer头,基本能骗过大部分基础防护。要是遇到更狠的验证码、IP封禁,那就得上代理池、OCR识别,这些属于进阶玩法,普通场景用不上。
数据抓下来之后,存哪?小项目直接扔MySQL,三张表搞定。我习惯把原始HTML存一份,解析后的结构化字段存一份,这样万一解析规则出错还能重新跑。存储别搞太复杂,用JDBC或者MyBatis都行,看你自己顺手。
最后提醒一句:别拿爬虫去搞人家有登录验证、robots.txt明确禁止的网站。我那个奶茶店项目,人家页面底部写着"©2024 某某科技",但公开商品信息本来就可以看,爬下来自己用不涉及任何侵权。爬虫是工具,用得好是效率神器,用歪了就是给自己找麻烦。现在那个爬虫还在我服务器上跑着,每天早上八点准时打卡,比我自己记得抢音箱靠谱多了。
友情链接