Webmagic 获取数据初探访1
来源:互联网 发布:java程序员个人简历 编辑:程序博客网 时间:2024/05/17 00:00
主要内容 webmagic
- 前言
- 正文
- 尝试
- 再尝试
前言(废话,可忽略)
已经记不得有多久没更新内容了,脑子只记得这一年过得兵荒马乱的~~~
2015年从电信出来去了互联网云计算的创业团队,激情满满学到了很多东西,这一年学习到openstack以及很多开源的项目,结实了很多厉害的大牛和好玩的同事伙伴。有陶老大,老谭,川川,钊哥这样的大神;也有老田,老余,啸大爷这样的逗逼同事。
最喜欢的就是和啸爷撕逼,哈哈….
不过最终公司还是夭折了,不管怎样我还是很感谢这一切。感恩陶老大…
正文
上周接到领导任务,让抓取对手网站发布的一些数据,获取到数据后供给市场部人员分析使用。
说实话,第一感觉就是要做网络爬虫spider。心里默念,“我靠,老子这块没玩过啊”但还是本着“男人不能说自己不行”的原则网上搜索了一些文章,最终选择了webmagic。webmagic这个框架整体来说比较易于二次开发,容易上手,还也是较多不足的地方,比如二级域名domain的问题,这样再根据targetUrl去获取二级页面时,可能出现信息无法获取的场景,也就是跨域domain的问题,比较常见。之前比较反感国内很多博客网站内容都是千篇一律,都是你抄我抄,蛋疼的很。
ok,言(我)归(也)正(想)传(抄)。哈哈~
webmagic相关资料
若只是简单获取相关网页数据,引入两个jar就大功告成了。
<dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-core</artifactId> <version>0.5.3</version></dependency><dependency> <groupId>us.codecraft</groupId> <artifactId>webmagic-extension</artifactId> <version>0.5.3</version></dependency>
按照官方提供的demo运行后,你会发现里面有几大组件。表格中其功能为本人理解,可能与实际对象含义存在偏差,如有误,请@我改正:
尝试
上面介绍了那么多,咱们是不是该好好耍一耍了呢?
首先咱们获取某互联网的信息数据,具体url就不指明了,可在代码中自行查找。打开网页后会看到数据量还是挺多的,有个分页div。按照官方讲解可获取分页div内容,一般来讲这块是有规律的,那样其实全部的url也就获取到了。
// 获取页面分页内容;List<String> pageNumberList = page.getHtml().xpath("//div[@class='bor-ddd tudi_fff page']/a/text()").all();// 待抓取列表;List<String> targetUrlList = new LinkedList<String>();int [] pageNumber = new int[200];// 求数组最大值;int max=0;for(String url : pageNumberList){ try{ int i = Integer.valueOf(url); pageNumber[i] = i; }catch (NumberFormatException ex){ continue; }catch (Exception ex){ ex.printStackTrace(); continue; } for(int i=1;i<pageNumber.length;i++) { if(pageNumber[i]>max) max=pageNumber[i]; }}
写道这里的时候,其实已经获取到了全部页面,对伐?
那后面的就一路向西就好了,挨个解析页面就行啦,你说呢~
再尝试
常见的场景:有些数据只能登陆网站才可以获取到,webmagic本身是不提供post请求,咋办呢? 只能追本溯源了,采用JDK自带的类进行处理了,首先模拟登陆获取需要用到的cookie,组装好相关site设置后,这样就可以获取到敏感数据了。
首先先手工登陆该网站,会发现登陆成功后会有一个提示,那我们就拿这个提示来验证咱们是否登陆成功,好伐?截图为手工成功后页面进行调整前的内容:
代码如下:
/** * 模拟登陆,获取cookie * @param username * @param password * @throws Exception */ public void logIn(String username, String password) throws Exception { httppost.setHeader("Content-Type", "application/x-www-form-urlencoded"); String post = "username="+username+"&password="+password; httppost.setEntity(new StringEntity(post, "utf-8")); try { // 提交登录数据 HttpResponse re = httpclient.execute(httppost);// System.out.println("response: "+re); Header[] h =re.getAllHeaders(); for (Header header : h) { System.out.println(header.toString()); } if(re.getEntity()!=null && EntityUtils.toString(re.getEntity()).contains("登录成功!")){ System.out.println("登录成功!"); } } catch (ClientProtocolException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
Server: nginxDate: Mon, 03 Oct 2016 16:53:23 GMTContent-Type: text/html; charset=utf-8Transfer-Encoding: chunkedConnection: keep-aliveKeep-Alive: timeout=10Vary: Accept-EncodingSet-Cookie: PHPSESSID=g12odi58b8s1cittik8jelfsk5; path=/; domain=.tuliu.comExpires: Thu, 19 Nov 1981 08:52:00 GMTPragma: no-cacheSet-Cookie: tlfailed_num=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.tuliu.comSet-Cookie: tlfailed_num_time=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.tuliu.comCache-control: privateX-Powered-By: Tuliu.com登录成功!
拿到PHPSESSID后离成功就剩一步之遥啦,将PHPSESSID设置到site对象中即可获取部分敏感数据啦,是不是很开心呢?
//抓取网站的相关配置,包括编码、抓取间隔、重试次数等private Site site = Site.me().setRetryTimes(5) .setSleepTime(2000) .addHeader("Connection", "keep-alive") .addCookie("PHPSESSID", PHPSESSID) // 此处为模拟登陆后的指; .setUserAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0") .setCharset("UTF-8").enableHttpProxyPool();
特别喜欢这种链式设计,用着很爽,好吧,已经很困了,先写到这里到,后续会再分享多个demo,大家一起学习webmagic。demo已提供链接,为了数据安全demo中url,username已模糊处理,望多交流。
代码下载地址
- Webmagic 获取数据初探访1
- WebMagic Java爬虫框架初探
- WebMagic 抓淘客助手数据
- webmagic
- WebMagic
- webmagic
- webmagic爬取腾讯nba数据
- webmagic 学习(1)-- 基础流程
- 数据,逻辑,信息初探(1)
- OpenStreetMap初探(六)——获取地图数据
- OpenStreetMap初探(六)——获取地图数据
- WebMagic从入门到放弃(1)
- WebMagic 0.7.1以后代理池方法
- WebMagic无法输出抓取到的数据和文件
- 【爬虫】WebMagic结合Spring mvc爬取数据进行存储
- 大数据采集:爬虫框架之WebMagic的基本使用
- 【爬虫】WebMagic结合Spring mvc爬取数据进行存储
- Springboot通过集成Webmagic实现数据抓取功能。
- JS快速排序
- 建立一个5行5列的矩阵,找出其中最小的元素,输出该值及行、列号。
- Medium 215题 Kth Largest Element in an Array
- HDU 1150 Machine Schedule 最小顶点覆盖
- 2016四川省赛A,C【写了1w个if的水题】
- Webmagic 获取数据初探访1
- 集合及concurrent并发包总结
- UML活动图概要
- JAVA-增强for循环
- LightOJ 1079 - Just another Robbery (背包问题)
- 如何统一设置a标签默认超链接点击进入新窗口
- ue找空行
- JAVA-可变参数
- 定义一个16位长整型数,统计里面0~9每个数字出现的次数。(包括将长整型转化为字符数组的方法及switch的用法)