首页 > 爬虫

今天爬数据真是爬的绝望,下午2点多开始写到下班,还主动加了一小时班,然后回到家又码到10点。终于爬出来了。

 

用java自带的 HttpURLConnection 模拟请求,返回的都是乱码。用Jsoup也是一样的。

用postman测了几下,结果一致。

应该是做了什么验证 ,导致代码伪装他的 ajax 请求是不会返回正确数据的。

 

还好 htmlunit 拯救了我。

htmlunit 简介:
一个Java代码版浏览器,它没有图形界面。它可以允许使用网页的一些高级操作,如填写表单、点击链接。你只需要调用getPage(url)方法,然后找到一个超链接,调用click()方法点击它,你就可以得到点击后返回的页面。包括Javascript、Ajax、cookie等都是自动处理的。浏览器能做什么,它就能做什么。

 

导入jar包后直接用,我今天写的代码就贴在下面了。

 

注释大部分都是一点点敲的,从创建到使用,等待加载、获取节点、设置参数、点击事件等等都写了。应该算是比较详细

 

 

阅读全文

  以bangumi动画为例= =

成果,总共四千多个(最后一名是雷锋的故事

这个图是我给扒下来的数据保存到mysql数据库了在导出的excel文件

还有用IO流输出的txt文件和DOM转换的xml文件就懒得放了

废话不多说,上代码

 


Anime类
private int id;//排名
private String name;//名字
private String oldName;//原名
private String message;//信息
private double rating;//分数
private int number;//评分人数
private String imagePath;//图片地址
还有getset方法和toString方法,就不贴了



完成思路:
按照bangumi动画排行榜的域名,设定的符合查找标准的for循环。
其域名的标识是直接从1-191顺序排列,故建立一个从1开始循环到191的for循环。
建立一个只有单个线程的线程池,虽然速度比多线程有所降低,但是由于其只有一个线程,所以会按照顺序从1-191页读取数据
避免了多线程导致的顺序混乱问题。
根据面向对象的思想,咱是个指挥官,你怎么完成是你的事情,只要你能达到效果,我只管调用方法就是了
我需要的结果就是,这个for循环给我转完后,我的List集合里就存了[bangumi动画排行榜里的所有的动画对象]
直接让线程池中的线程执行写好了的AnimeSpider线程,把要扒的域名、接收数据的集合、闭锁给传过去。完事。
List集合拿到了,也就是四千多个动画对象拿到了,然后就可以随意操作了
调用我写好了的WriteAnimeTXT.writeAnime(animes);WriteAnimeXML.writeAnime(animes);
MybaseInsert.insert(animes);writeImage(animes);这些我写好了的方法,做到输出为txt、xml、保存到数据库、下载图片等等
方法我都写进来了,共四页
解释下闭锁:
CountDownLatch类,创建时可以指定一个int类型的数字,在数字到0之前,await()将一直阻塞,使程序停止在这个位置。直到数字归零
在这使用是为了让线程都走完,也就是说要让List集合里已经存了bangumi动画排行的所有数据后,在执行后面的方法
使用CountDownLatch中的方法countDown()可以使数字减一

主类

 

 

AnimeSpider类,即在主方法中new了191次的线程