1.HtmlUnit 简要介绍
HtmlUnit 是一款 java 的无界面浏览器程序库。它模仿 HTML 文档,并提供相应的 API,容许您调用页面,填写表单,点击链接等操作,就像您在“失常”浏览器中做的一样。它有相当不错的 JavaScript 反对(还在不断改进),甚至可能解决相当简单的 AJAX 库,模仿 Chrome,Firefox 或 Internet Explorer 取决于应用的配置。它通常用于测试目标或从网站检索信息。
HtmlUnit 不是一个通用的单元测试框架。它是一种模仿浏览器以用于测试目标的办法,并且旨在用于另一个测试框架(如 JUnit 或 TestNG)中。无关简介,请参阅文档“HtmlUnit 入门”。HtmlUnit 用作不同的开源工具,如 Canoo WebTest,JWebUnit,WebDriver,JSFUnit,WETATOR,Celerity,Spring MVC Test HtmlUnit 作为底层的“浏览器”。
HtmlUnit 最后由 Gargoyle Software 的 Mike Bowler 编写,并依据 Apache 2 许可证公布。从那时起,它曾经收到了许多来自其余开发商的奉献,明天也会失去他们的帮忙。
几年前在做一个购物网站的数据抓取工作中,偶尔的机会邂逅了 HtmlUnit 了。记得过后怎么也捉取不到页面上的价格数据,而 httpfox 也追踪不到价格数据的 URL,正当我一愁莫展的时个,HtmlUnit 呈现并帮我解决了问题。所以明天我要说声谢谢,也将 HtmlUnit 举荐给大家。
2.htmlUnit 办法介绍
一、环境引入
因为我是在我本人的 spring boot 我的项目在引入的,所以我在 pom 文件中退出依赖就行了
; “ 复制代码 ”)
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.41.0</version>
</dependency>
; “ 复制代码 ”)
如果你只是爬取一个 js 不多的网站我倡议换上面这个依赖
; “ 复制代码 ”)
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.23</version>
</dependency>
; “ 复制代码 ”)
两者的区别我前面会讲,当然如果你不是用的 maven 工程(没有 pom),能够去官网下载源代码库
二、应用
HtmlUnit 应用起来非常简单,在应用时能够去官网手册查看语法事实上手册仅仅是入门解说,听我上面讲也够了;
1、创立客户端和配置客户端
; “ 复制代码 ”)
final String url ="https:****";// 大家这能够填本人爬虫的地址
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_68);// 创立火狐浏览器 2.23 版本是 FIREFOX_45 new 不写参数是默认浏览器
webClient.getOptions().setCssEnabled(false);//(屏蔽)css 因为 css 并不影响咱们抓取数据 反而影响网页渲染效率
webClient.getOptions().setThrowExceptionOnScriptError(false);//(屏蔽)异样
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);//(屏蔽)日志
webClient.getOptions().setJavaScriptEnabled(true);// 加载 js 脚本
webClient.getOptions().setTimeout(50000);// 设置超时工夫
webClient.setAjaxController(new NicelyResynchronizingAjaxController());// 设置 ajax
HtmlPage htmlPage = webClient.getPage(url);// 将客户端获取的树形构造转化为 HtmlPage
Thread.sleep(10000);// 主线程休眠 10 秒 让客户端有工夫执行 js 代码 也能够写成 webClient.waitForBackgroundJavaScript(1000)
; “ 复制代码 ”)
这里有个期待 js 执行,2.41.0 很好兼容 js 多的状况,2.3 却老是出问题,无奈刷新网页,2.41.0 打印的也很具体,执行过程也比较慢,可能慢工出细活
这里差多就获取了近程地址页面,当初要做的就是解析 dom 节点 填写数据模仿点击等事件。如果你要将他打印输出 htmlPage.asText()输入 htmlPage 节点的文本 htmlPage.asXml()输入 htmlPage 节点的 xml 代码
2、节点的获取
在此环节倡议准备一点前端的常识
HtmlUnit 给出两种节点获取形式
XPath 查问:
; “ 复制代码 ”)
final HtmlPage page = webClient.getPage(“http://htmlunit.sourceforge.net”); //get list of all divs
final List<?> divs = htmlPage .getByXPath("//div"); //get div which has a 'name' attribute of 'John'
final HtmlDivision div = (HtmlDivision) htmlPage .getByXPath("//div[@name='John']").get(0);
; “ 复制代码 ”)
css 选择器:(我更加钟爱)
; “ 复制代码 ”)
final DomNodeList<DomNode> divs = htmlPage .querySelectorAll(“div”); for (DomNode div : divs) {
....
} //get div which has the id 'breadcrumbs'
final DomNode div = htmlPage .querySelector("div#breadcrumbs");
; “ 复制代码 ”)
css 给出汇合查问 querySelectorAll 和单个查问 querySelector,如果你没有根底我给出以下例子你就明确:
htmlPage .querySelectorAll(“div”)返回 htmlPage 上面 div 标签汇合
htmlPage .querySelector(“div:nth-child(1)”) 返回 htmlPage 上面 div 的第一个 div
htmlPage .querySelector(”.submit”)返回 htmlPage 上面第一个 class=submit 的标签
htmlPage .querySelector(”#submit”) 返回 htmlPage 上面第一个 id=submit 的标签
htmlPage .querySelector(“div.submit”) 返回 htmlPage 上面第一个 class 为 submit 的 div 标签
htmlPage .querySelector(“div[id=‘submit’]”) 返回 htmlPage 上面第一个 id 为 submit 的 div 标签
以上的列举办法置信曾经够用,不够的能够参阅 css 选择器
以下列举常见的 html 标签与 HtmlUnit 类的对应关系
; “ 复制代码 ”)
div -> HtmlDivision
div 汇合 -> DomNodeList<DomNode> fieldSet -> HtmlFieldSet
form -> HtmlForm
button -> HtmlButton
a -> HtmlAnchor <input type=”xxx”> -> HtmlXxxInput
(<input type=”text”> -> HtmlTextInput)
table -> HtmlTable
tr -> HtmlTableRow
td -> TableDataCell
; “ 复制代码 ”)
有 setAttribute()办法节点的属性款式,setNodeValue()设置节点 value 值。是不是英语一下子就进步了?简直所有的标签能够找到与之对应的的类,上面看我的实战:这是一个在线填写温度的 excel 文档 如果拜访改地址,他会提醒登陆网页上有登录按钮,如果登录过网页上是没有登录按钮,咱们当初模仿关上主动登录框:
; “ 复制代码 ”)
// 这段代码是为了让网页的的某个按钮加载进去之后再执行上面的代码
while (htmlPage.querySelector("#header-login-btn")==null) {synchronized (htmlPage) {htmlPage.wait(1000);
}
}
HtmlButton login = htmlPage.querySelector("#header-login-btn");// 获取到登陆按钮
if (login!=null){// 如果网页上没这个按钮你还要去获取他只会失去一个空对象,所以咱们用空的形式能够判断网页上是否有这个按钮
System.out.println("----- 未登录测试 -----");
htmlPage=login.click();// 模仿按钮点击后要将网页返回回来不便动静更新数据
System.out.println(htmlPage.asText());
HtmlAnchor switcher_plogin = htmlPage.querySelector("a[id='switcher_plogin']"); if (switcher_plogin!=null) {// 帐号密码登录
System.out.println("----- 点击了帐号密码登陆 -----");
htmlPage = switcher_plogin.click();
System.out.println(htmlPage.asText());
}
}
System.out.println(htmlPage.asText());
webClient.close();
; “ 复制代码 ”)
爬虫最重要的步骤是咱们对网页先进行调试,有哪些按钮,要点击哪个,要给哪些设值。毕竟咱们要用代码安顿代码。
延申:如果你要对网页的数据获取或者文件进行下载,光靠 HtmlUnit 解析是不够的,举荐 Jsoup 库,是能够配合 HtmlUnit 应用的,比拟好用,这里就不列举。
三、实现一个小的 demo
留神:htmlunit 援用的 jar 包不全是会奇怪的报错
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…
https://github.com/threebb1/u…
https://www.github.com/threeb…
http://github.com/threebb1/ut…