爬虫项目(一)爬虫+jsoup轻松爬知乎
来源:互联网 发布:多特网软件下载 编辑:程序博客网 时间:2024/06/10 19:12
爬虫+jsoup轻松爬知乎
爬知乎是为了测试调试爬虫,而且知乎很好爬,也建议新手爬一爬知乎和百度知道之类的网站入门。
最近对大数据很感兴趣,趁着写爬虫的劲把java也学了。本人之前很少接触面相对象的编程语言,只有少量的VB基础。了解java之后才发现面向对象语言之美。(对我这样只是把编程当爱好的fish而言)java最美妙的地方即是有丰富的jar包可以调用,还有大神更新源源不断的jar包,比起以前写C语言,每一行代码都自己敲,现在写java,敲一个点,n多功能函数直接调用,而且代码质量都很高,简直就是搬砖屌丝到摸腿高富帅的升级!
我最开始写的爬虫没用jsoup包,直接用java自带的httpconnect获取,用parttern,matcher加正则语法筛选标签和元素。正则语法看的晕,parttern定义的模板通用性很差。做出来的爬虫整体代码冗长,完全没有代码的美感。
本次写的爬虫调用了jsoup jar包,jsoup是优秀的HTML解析器,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据,而且封装了get方法,可以直接调用获取页面。结合谷歌浏览器抓取页面元素快感不断。下面简单介绍一下用法顺便贴个知乎爬知乎的代码。
jsoup包的import就不说了,jsoup最主要用到的就是的elements类和select()方法。elements类相当于网页元素中的标签,而select()方法用于按一定条件选取符合条件的标签,组成符合条件的标签数组。element支持转成字符串或者文本等。总之功能很强大。只需要了解一下select()方法的过滤规则即可上手用了。但是有了谷歌浏览器!过滤规则都不用管了,直接上手用!
来个示例:
1.打开谷歌浏览器,右键单机想要抓取的元素,比如我右击了“Spring的JavaConfig注解这篇文章”选择检查,自动跳出源码框,并且定位到右键的元素的位置。
2.右键点击代码行,copy–>copy selector
3.这时候我们可以贴出来看看copy到的东西:
#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编辑器不支持自动换行,所以文本都堆在一行,可以用file类把抓取到的数据储存到本地txt文件或doc之类的文件里。
写爬虫的第一个目标是抓携程之类的机票数据,当然不是为了做大数据分析,就是给自己用。大家都知道携程途牛之类,机票最便宜的时候不是起飞前一天,也不是起飞前一个月,大概是起飞前十天十几天,这时候机票价格有个波谷。因此想写个机票爬虫部署到服务器上,顺手再写个安卓app传递爬取目标到服务器,让爬虫爬。爬的次数也不多,一天爬两三次就够了,也省的研究反爬虫了,机票进入期望价格或者波谷的时候,发个消息通知我即可,手动买票。
是的,如果顺利的话还会有3-4篇后续的文章,直到完成这个项目。为了可以多坐几次飞机见小女友,祝自己成功!
- 爬虫项目(一)爬虫+jsoup轻松爬知乎
- 爬虫爬虫爬虫(一)
- jsoup 爬虫
- Android利用jsoup爬虫爬网页数据(一)
- 用 jsoup做爬虫采集站点(一)
- Android网络爬虫程序(基于Jsoup)
- java爬虫(Jsoup)爬取某站点评论
- Jsoup类(较新好用的爬虫工具)
- java 爬虫 网页解析(Jsoup)
- Jsoup网页爬虫案例
- 用Jsoup做“爬虫”
- jsoup做爬虫
- 爬虫Jsoup小结
- Jsoup网络爬虫
- java jsoup 网络爬虫
- 爬虫-jsoup 数据解析
- htmluinit+jsoup 网络爬虫
- 非常简单Jsoup爬虫
- Java web的URL地址参数传递中文乱码的解决方案
- NetScaler各种IP解释
- c# 多线程-异步-WaitHandle-AutoResetEvent
- fastjson混淆规则
- 产品经理职责
- 爬虫项目(一)爬虫+jsoup轻松爬知乎
- 与其被生活逼,不如被自己逼
- C++如何设计一个含指针的类(Boolan笔记第二周)
- 二叉树的前序、中序、后序遍历
- IAP与APP互相跳转的实现
- 设计模式六大原则(2):里氏替换原则
- git命令使用-patch
- Initializing a Callout Driver
- 在xcode8中使用真机调试错误解决办法