java的简单爬虫
来源:互联网 发布:淘宝买东西货到付款 编辑:程序博客网 时间:2024/06/05 09:19
印言
之前没有写过爬虫,最近被学长压迫,所以迅速学习了一波爬虫,这个过程十分的痛苦。
之前自己也没有发博客的习惯,- -仿佛发博客是上个世纪的事情,之前也有很多技术学习,但没有放到博客上。
希望以后学了什么技术可以发上来,既加深自己的印象,还帮助了大众。
其实java的爬虫也没有那么难,之前刚刚大一的时候以为爬虫只有python有,十分的low。
本质还是发HTTP请求,最简单的直接爬取页面,对于没有做反爬技术的网站还是很简单的。
只要是用HttpClient这个库基本上就够了,然后解析HTML使用Jsoup。
当然在学习的过程中发现了webmagic的爬虫框架,很庆幸是国人写的。
- 但是感觉那个框架目前对非Http get的请求的支持并不是那么好。(时间坐标2017.11.6)
- 相信这个框架会不断完善。
接下来说一说我爬取过程中遇到的坑。
- 我爬取了我们学校教务处的网站,说教务处,相信绝大多数都是相同的那一套。
- 第一个坑就是编码的坑,教务处编码采用GB2312,HttpClient默认采用UTF-(当然,中间还尝试了OkHttp),相比之下我觉得HttpClient对编码的处理更适合我。
- 第二个坑就是C#的坑,教务处的网站用.Net开发,由于我只懂java,一开始以为那个__viewstate是个不怎么重要的参数,但其实不然,如果post的__viewstate不正确,
返回码虽然是302(登录成功),但是response header里面的location却会把你定位到错误界面。
怎么解决这两个坑呢?
先不着急,我们先来看看怎么发起get,post请求。
CloseableHttpClient client = HttpClients.createDefault();HttpGet get = new HttpGet("http://www.baidu.com");CloseableHttpResponse response = client.execute(get);
这样就对百度发起了一次http的get请求。
这个response里面包含了header,页面内容等。
然后怎么获取Header中的信息,和页面内容呢?
String[] cookies = response.getHeaders("Set-Cookie");String html = Utils.getHtml(response.getEntity.getContent,"GB2312");
这样就可以获得cookie,和html页面内容,当然还有其他方法,稍微看一下API就知道具体有什么方法了,基本从名字就可以看出来时干什么用的了。
然后Utils.getHtml是我自己的一个静态方法,代码如下。
public String getHtml(InputStream inputstream,String encoding)throws IOException{ ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024];// 1K buffer int len = 0; while ((len = is.read(buffer)) != -1) { bos.write(buffer, 0, len); } is.close(); return new String(bos.toByteArray(), encoding); }
接下来是Post请求。
post请求你总是要post点东西的嘛,所以先构造Body的。
所以代码如下
HttpPost post = new HttpPost("http://www.baidu.com"); //开始构造Body List<NameValuePair> postbody = new ArrayList<>(); postbody.add(new BasicNameValuePair("__VIEWSTATE",viewState)); postbody.add(new BasicNameValuePair("username",username)); postbody.add(new BasicNameValuePair("password",password)); postbody.addHeader("User-Agent",user-agent); //Body构造结束,开始处理编码格式 UrlEncodedFormEntity GB_2312 = new UrlEncodedFormEntity(postbody,"GB2312"); post.setEntity(GB_2312); //当然还可以给任何一个http使用代理,对我来说使用代理的好处是可以用burpsuite来看httphistory,查看自己发送的请求具体是什么。 post.setConfig(RequestConfig.custom().setProxy(proxy).build()); CloseableResponse postResponse = client.execute(postbody);
然后就拿到postResponse,用Jsoup解析。
String html = Utils.getHtml(postResponse.getEntity().getContext(),"GB2312"); Document document = Jsoup.parse(html); Elements elements = document.select("input[name=__VIEWSTATE]");
然后就把需要的内容爬下来了。
以上代码基本手写,没有借助IDE,如果有什么小错误根据IDE提示稍微修改一下就可以。
不是说要解决那两个坑的吗?
- 稍微看仔细一点应该就知道,那两个坑已经解决了吧。
- 就到这里吧,如果在看到这篇博客的时候有什么困惑,我的邮箱:solomonchn1@Gmail.com。
阅读全文
0 0
- 简单的JAVA爬虫
- java的简单爬虫
- 简单的java爬虫程序
- Java 简单的BFS爬虫
- java实现的简单爬虫
- 简单的java爬虫程序
- 简单的java爬虫实现
- JAVA简单的爬虫代码
- Java 简单的BFS爬虫
- 简单的java爬虫代码
- 网络爬虫(三) Java实现简单的网络爬虫
- 网络爬虫(四) Java实现简单的网络爬虫
- 学习简单的Java爬虫的心得
- 一个简单的JAVA网页爬虫
- 一个简单的java网络爬虫(spider)
- 一个简单的JAVA网页爬虫
- 一个简单的java网络爬虫(spider)
- Java简单的网络爬虫实现
- java设计模式个人总结(二)
- JAVA基础(三)
- 泛型类的类型为什么不能是基本
- 常量指针与指针常量的区别
- 个人训练记录
- java的简单爬虫
- lua基础之数组
- 我的学习记录27
- Dynamic CRM 365 程序设计器介绍
- 读书笔记:MySQL InnoDB存储引擎关键特性
- URAL
- Chrome开发者工具使用小技巧
- debian apt-get 更新源文件格式说明
- 【XML】4种解析器总结(DOM/SAX/JDDOM/DOM4J)