您现在的位置是:时尚 >>正文

java爬虫爬取网页内容

时尚68人已围观

简介Java爬虫爬取网页内容 用Java写爬虫,最省事的组合是HttpClient加Jsoup。别一上来就想着上框架,很多时候你只是想抓几个页面的标题和链接,搞得太重反而浪费时间。我上周帮朋友抓一个本地论 ...

Java爬虫爬取网页内容

用Java写爬虫,爬虫爬最省事的网页组合是HttpClient加Jsoup。别一上来就想着上框架,内容很多时候你只是爬虫爬想抓几个页面的标题和链接,搞得太重反而浪费时间。网页我上周帮朋友抓一个本地论坛的内容帖子列表,总共不到三十行代码就跑通了。爬虫爬

先看依赖。网页Maven里加两个就够了:

<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.14</version> </dependency> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.17.2</version> </dependency> 

HttpClient负责发请求拿HTML,内容Jsoup负责解析。爬虫爬分工明确,网页各干各的内容。

发一个GET请求大概长这样:

CloseableHttpClient client = HttpClients.createDefault(); HttpGet request = new HttpGet("https://example.com/list"); request.setHeader("User-Agent",爬虫爬 "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); CloseableHttpResponse response = client.execute(request); String html = EntityUtils.toString(response.getEntity(), "UTF-8"); 

User-Agent这行别省。很多站点默认拒绝没有UA的网页请求,返回403。内容我吃过这个亏,调试了半天以为是代码问题,结果加个UA就通了。另外字符编码要显式指定,不然中文页面大概率乱码。

拿到HTML之后交给Jsoup:

Document doc = Jsoup.parse(html); Elements items = doc.select("div.post-item"); for (Element item : items) {  String title = item.select("h3.title").text(); String link = item.select("a").attr("href"); System.out.println(title + " -> " + link); } 

Jsoup的选择器语法跟CSS基本一致,用过jQuery的话上手很快。select返回的是元素集合,text()取纯文本,attr()取属性值。这几个方法覆盖了大部分日常需求。

实际抓取时经常碰到的一个问题是相对路径。比如href="/post/123",你直接存下来没法用,得拼上域名。Jsoup提供了absUrl()方法,前提是解析时传了baseUri:

Document doc = Jsoup.parse(html, "https://example.com"); String fullUrl = item.select("a").attr("abs:href"); 

这样拿到的就是完整地址,省得自己拼字符串。

翻页逻辑也不复杂。观察一下URL规律,通常是?page=1、?page=2这种。写个循环改参数就行。但要注意加延迟,别请求太猛。我一般设Thread.sleep(1000),一秒一次,对服务器友好,也不容易触发反爬。

说到反爬,有几个常见的坑。一是IP被封,频繁请求同一站点会被限流,简单做法是换代理,但免费代理质量参差不齐,用之前先测。二是页面内容是JS动态渲染的,HttpClient拿到的HTML里根本没有你要的数据。这种情况要么分析XHR请求直接调接口,要么上Selenium。前者效率高但需要抓包分析,后者简单粗暴但慢。

还有一点,抓下来的数据最好立刻处理或存储,别攒在内存里。我见过有人抓几万条全塞ArrayList,最后OOM了。写文件或者入库,边抓边存。

代码写完之后跑一遍,看看控制台输出对不对。如果选择器写错了,select返回空集合,不会报错,只是啥也不输出。所以调试阶段多打印中间结果,确认每一步拿到的数据符合预期。

整个流程就这么回事:发请求、拿HTML、解析、提取、存储。核心代码加起来不超过五十行。剩下的都是处理边界情况和异常。别想太复杂,先跑通再说。

Tags:

相关文章

  • 逆向工程网

    时尚

    凌晨三点,我盯着屏幕上一段被混淆过的汇编代码。鼠标指针悬在`sub_401000`上,函数名早被剥离,只剩下孤零零的地址。这已经是第三包烟了。 逆向工程的本质不是破解,是考古。你对着一个二进制文件,像 ...

    【时尚】

    阅读更多
  • 漏洞嗅探

    时尚

    凌晨三点,我盯着屏幕上那行跳动的十六进制字符,咖啡杯沿凝着褐色的渍迹。这已经是本周第三次在自家测试服务器上模拟攻击了——不是闲得发慌,而是三天前生产环境那次数据泄露,让我彻底明白了一个道理:漏洞从来不 ...

    【时尚】

    阅读更多
  • 泉州水头哪里有做全套

    时尚

    水头镇上的石材厂一家挨着一家,机器锯石的尖叫声从早响到晚。就在这种灰蒙蒙的工业氛围里,有个问题被问得特别多——不是问哪家石材质量好,而是“哪里能做全套”。这问题在本地司机、跑业务的、甚至偶尔来出差的工 ...

    【时尚】

    阅读更多


友情链接