java爬虫抓取动态网页(爬虫+jsoup轻松爬知乎(一):爬虫语言之美)
优采云 发布时间: 2022-02-07 00:07java爬虫抓取动态网页(爬虫+jsoup轻松爬知乎(一):爬虫语言之美)
爬虫+jsoup轻松爬取知乎
爬知乎是用来测试和调试爬虫的,知乎非常容易爬。也建议初学者爬百度知道的知乎和网站。
最近对大数据很感兴趣,在写爬虫的同时也学习了Java。之前很少接触面向对象的编程语言,只有少量的VB基础。在了解了java之后,我发现了面向对象语言的美妙之处。(对于我这种只把编程当成爱好的鱼儿来说)java最美妙的地方就是有丰富的jar包可以调用,还有大神不断更新的jar包。和以前写C语言相比,每一行代码都是自己敲,现在写java,敲一个点,直接调用n个*敏*感*词*函数,代码质量很高,简直是搬砖升级到摸腿又富又帅!
我一开始写的爬虫没有使用jsoup包。直接用java自带的httpconnect获取,使用parttern、matcher和正则语法过滤标签和元素。正则语法看起来很晕,parttern定义的模板通用性很差。做的爬虫整体代码比较冗长,完全没有代码的美感。
这次写的爬虫调用的是jsoup jar包。jsoup是一个优秀的HTML解析器,可以通过DOM、CSS以及类似jQuery的操作方法来检索和操作数据,并且封装了get方法,可以直接调用获取页面。结合谷歌浏览器抓取页面元素,快感不断。下面简单介绍一下用法。顺便说一句,我将发布 知乎climbing知乎 的代码。
jsoup包的导入就不说了。jsoup 使用的最重要的东西是元素类和 select() 方法。元素类相当于网页元素中的标签,通过select()方法根据一定的条件选择符合条件的标签,形成符合条件的标签数组。element 支持转换成字符串或文本等。总而言之,它非常强大。您只需要了解 select() 方法的过滤规则即可开始使用。但是使用谷歌浏览器!无需担心过滤规则,开始吧!
这是一个例子:
1.打开谷歌浏览器,在单机上右击要抓取的元素,比如我右击“Spring的JavaConfig Annotation文章”并选中勾选,自动跳出源码代码框,并定位到右击元素的位置。
2.右击代码行,复制-->复制选择器
3.这个时候,我们可以贴一下,看看我们复制了什么:
#div_JK > div.item_list > div:nth-child(1) > div.dTit.tracking-ad > a
表示目标在网页代码中的位置,前后每个>代表一个检索条件。然后我们要获取这个标签,只要写:
//下载网页
String URL="输入网址";
Document document=Jsoup.cnnect("URL");
//在下载的document里进行检索的语句
elements test=document.select("#div_JK")
.select("div.item_list").select("div:nth-child(1)").select("div.dTit.tracking-ad").select("a");
//这样test标签就是我们最开始右键单击检查的标签
String Str=test.toString();//将标签转化成字符串
String text=test.text();//将标签里的文本提取出来
//其他转换方法省略,检索到目标标签,提取标签里的特定元素so easy
贴出下面写的爬知乎的代码,网站比如知乎和贴吧都很适合爬。
目标是打印出 知乎 编辑建议的所有热门问题的 URL、问题名称、问题描述和答案。
代码块
简单的java爬虫代码:
package jsouptest;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupTest {
public static void main(String[] args) throws IOException {
//获取编辑推荐页
Document document=Jsoup.connect("https://www.zhihu.com/explore/recommendations")
//模拟火狐浏览器
.userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)")
.get();
Element main=document.getElementById("zh-recommend-list-full");
Elements url=main.select("div").select("div:nth-child(2)")
.select("h2").select("a[class=question_link]");
for(Element question:url){
//输出href后的值,即主页上每个关注问题的链接
String URL=question.attr("abs:href");
//下载问题链接指向的页面
Document document2=Jsoup.connect(URL)
.userAgent("Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)")
.get();
//问题
Elements title=document2.select("#zh-question-title").select("h2").select("a");
//问题描述
Elements detail=document2.select("#zh-question-detail");
//回答
Elements answer=document2.select("#zh-question-answer-wrap")
.select("div.zm-item-rich-text.expandable.js-collapse-body")
.select("div.zm-editable-content.clearfix");
System.out.println("\n"+"链接:"+URL
+"\n"+"标题:"+title.text()
+"\n"+"问题描述:"+detail.text()
+"\n"+"回答:"+answer.text());
}
}
}
获取效果图:
eclipse编辑器不支持自动换行,所以文字堆积在一行。您可以使用文件类将捕获的数据存储在本地 txt 文件或 doc 文件中。
写爬虫的首要目标是抓取携程等机票数据。当然,不是为了大数据分析,而是为了我自己。大家都知道,机票最便宜的时间不是出发前一天,也不是出发前一个月,而是出发前十天或十天左右。此时,机票价格有一个低谷。因此,我想写一个机票爬虫并部署在服务器上,然后编写一个Android app将爬取目标传递给服务器,让爬虫爬取。爬的次数也不多,一天两三次就够了,也省了对反爬虫的研究。当车票进入预期价格或低谷时,只需发送消息通知我并手动购买车票。
是的,如果进展顺利,将有 3-4 次跟进文章,直到该项目完成。为了能多坐几趟航班见见我的小女朋友,祝你成功!