我的现成的应用例子 账号密码不能给
去下载demo
Jsoup真的是太好用了 感动的要哭了
先把jar包下载链接留下点击打开链接
maven依赖如下:
org.jsoup
jsoup
1.8.3
个人觉得使用Jsoup的前提是对JQuery有一定的了解
登陆需要先自行分析需要的账号密码及格式 比如是user username user_name
然后
Connection.Response res = Jsoup.connect(网址)
.data("user_name"(参数名1), (实际参数值1), "pass_word"(参数名2), (实际参数值2),……(如果还有其他参数))
.ignoreContentType(true)
.method(Method.POST)
.execute();
通过这个获取到cookie
Map cookies = res.cookies();
然后再访问网站的时候只要带着cookie就可以不用登陆了
//--------------------------------------------------这是一行分隔符-------------------------------------------------------
再次检查代码的时候 发现自己写复杂了 还需要自己去核实cookies里面的参数叫什么 多麻烦 完全可以用
Document doc = Jsoup.connect(网址)
.cookies(cookies))//Map cookies = res.cookies();这个cookies
.get();
来实现登陆
//--------------------------------------------------这是一行分隔符-------------------------------------------------------
获取所需要的内容 是跟JQuery选择器差不多的方式
根据标签名 就doc.getElementsByTag("input")
根据className 就doc.getElementsByClass(".class")
以上两个会获取list 具体取哪个需要对照页面决定.get(index)
还有个根据ID获取的 doc.getElementById("#id")
获取属性的话就 element.attr() 获取文本就 element.text()
如果需要下载的话 就更是简单好操作
Response resultImageResponse = Jsoup.connect(下载网址)
.data(参数map)
.cookies(cookies)//就是第一步获取的cookie
.ignoreContentType(true)//不加这个的话 返回只能是文本文件
.execute();
FileOutputStream out = (new FileOutputStream(下载的文件名及路径 可在此new File(),也可以在前面先把路径new出来 再此处拼接文件名));
out.write(resultImageResponse.bodyAsBytes());
out.close();
//--------------------------------------------------这是一行分隔符-------------------------------------------------------
补充一点 下载的时候需要注意下载的方式 上面的那种适用于url的get请求 比如下载的链接是a标签 发一个url请求,里面带着下载文件的id名字等信息的
而对于post请求 也不是说上面的方法不可以 只是可能会存在一个问题 url长度不够
而且java写控制器的时候 虽然不一定会指定 但是是可以指定method具体是post还是get 所以不同情况还是分开处理会比较好
Response resultImageResponse = Jsoup.connect("网址")
.data(dataMap)
.cookies(cookies)
.ignoreContentType(true)
.method(Method.POST)
.execute();
//--------------------------------------------------这是一行分隔符-------------------------------------------------------
maven依赖如下:
org.seleniumhq.selenium
selenium-java
2.44.0
jar包下载 http://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java/2.44.0
对比Selenium的爬虫框架来说 Jsoup上手难度我觉得可能高一点 这个需要一定的jquery储备而Selenium爬虫完全是模拟浏览器操作 你怎么操作 就指使程序怎么操作 下载的话一般是 button.click()或者Action.click(button) 这种存在的主要问题在于 采用无界面的浏览器 对js支持可以说是非常弱 以至于click事件不好使的时候比好使的时候多 而且抓元素用id很大概率抓不到报错 下载的文件名和路径几乎不能改 比较被动
毕竟浏览器的下载就是这个样子 模拟浏览器下载 也就只能是一样的 存库的时候想要获取文件名就比较麻烦 有些下载url里面能改名 form表单的一般都是响应里面带的名字 没有办法直接获取 而Selenium目前据我所知支持三种浏览器
一种是无界面 在内存中操作 速度很快但是js支持不好的HtmlUnitDriver
其二是谷歌浏览器 需要下载驱动 对应当前的谷歌浏览器版本下载 最新版的浏览器目前是v66 对应下2.38版本驱动或2.39 下载链接为点击打开链接 查看和自己浏览器匹配的版本 建议去最新的驱动里面看notes 最新的会显示之前低版本的驱动支持浏览器版本。这个的好处是有界面了 更直观 而且因为是驱动的浏览器 所以并不存在js的问题 click非常好处理 缺点就是需要对应版本 如果你的电脑设置了软件自动更新 就可能存在忽然有一天爬虫不好用了 找一圈错发现是驱动过时了需要手动下新的 而且驱动分系统 如果是Windows系统开发 而要发布在Linux上 就可能存在用不了的问题
第三种是火狐浏览器 需要火狐浏览器装在默认下载位置 不在的话可以
System.setProperty("webdriver.firefox.bin", "C:\\Program Files\\Mozilla Firefox\\firefox.exe");
进行设置更改路径 不需要装驱动 不过我试的时候并不好用 因为原本也没打算继续使用Selenium所以没有深究。 使用的话 登陆就是模拟浏览器操作,先一步步定位到指定input输入密码,然后input.sendKeys(user);填入账号密码等信息,最后定位到指定的登陆按钮登陆。只要不new 一个driver,就不需要再次重复登陆 去哪都用原来的driver.get(url)就可以。
缺点显而易见的是 如果要从某一页的某个a标签进入另一个 然后再返回 就比较可能混乱 尤其是带分页的 无论是返回还是重新进页面 都需要设计好刚才访问到哪一页 driver还要重新回来的 而对比Jsoup 每次发送的请求都是新的 并不存在从一个页面进入还要返回的情形 形象点说 Selenium是当前窗口打开 重新输网址或者返回 找到上次浏览到哪在进入 jsoup是新标签打开 并不存在冲突
总结来说的话,Selenium比较简单易上手,虽然存在这这那那一些问题,但是对并不频繁爬取网页,手动爬就可以的,已经是足够了。Jsoup略微有一点难,但是上手之后及其好用,这个网页就是你的了,想要什么,想怎么要,想要放在哪,叫什么名,都是十分自由的。