Jsoup+httpclient 模拟登陆和抓取页面

合集下载

详解JS实现系统登录页的登录和验证

详解JS实现系统登录页的登录和验证

详解JS实现系统登录页的登录和验证这篇⽂章⽤JS显⽰表单的登录以及验证和对键盘的监听,这⾥有两种⽅法,⼀种是⽆需⽤户验证直接登录,⼀种是需要账户密码匹配才可登录。

1. html代码<div class="content"><div class="login-wrap"><form id="user_login" action=""><h3>登录</h3><input class="name" name="" id="accountName" type="text" placeholder="请输⼊⽤户名"><input class="code" name="password" id="password" type="password" placeholder="请输⼊密码"><div class="btn"><input type="button" id="submit" class="submit" value="登录" onclick="return check(this.form);"><input type="reset" id="reset" class="reset" value="重置" ></div><div id="CheckMsg" class="msg"></div></form></div></div>2.CSS样式.content{padding:0 auto;margin: 0 auto;height: 450px;width: 100%;background: url(../Image/Login-Img/login_bg.jpg) no-repeat center;background-size:100% 450px ;margin-top: 25px;}.login-wrap{position: absolute;width:320px;height: 300px;border-radius: 10px;-webkit-border-radius: 10px;-moz-border-radius: 10px;right:200px;margin-top: 75px;background: url("../Image/Login-Img/form_bg.png") no-repeat;background-size: 100%;}.login-wrap h3{color:#fff;font-size: 18px;text-align: center;}.name,.code{border:1px solid #fff;width:230px;height: 40px;margin-left: 25px;margin-bottom: 20px;padding-left: 40px;}.name{background: url("../Image/Login-Img/user.png") no-repeat left;background-position-x:12px;}.code{background: url("../Image/Login-Img/passwd.png") no-repeat left;background-position-x:12px;}.btn input{height: 40px;width: 120px;float: left;margin-right: 25px;border:none;color:#fff;font-size: 16px;-webkit-border-radius: 10px;-moz-border-radius: 10px;border-radius: 10px;margin-top: 10px;cursor: pointer;}input:active{border-color:#147a62}.submit{background: #ea8c37;margin-left: 25px;}.reset{background: #bbb;}/**错误信息提醒**/.msg{color: #ea8c37;font-size: 14px;padding-left: 40px;padding-top: 10px;clear: both;font-weight: bold;}3.JS代码//验证表单是否为空,若为空则将焦点聚焦在input表单上,否则表单通过,登录成功function check(form){var accountName = $("#accountName"),$password = $("#password");var accountName = accountName.val(),password = $password.val();if(!accountName || accountName == ""){showMsg("请输⼊⽤户名");form.accountName.focus ();return false;}if(!password || password == ""){showMsg("请输⼊密码");form.password.focus ();return false;}//这⾥为⽤ajax获取⽤户信息并进⾏验证,如果账户密码不匹配则登录失败,如不需要验证⽤户信息,这段可不写 $.ajax({url : systemURL,// 获取⾃⼰系统后台⽤户信息接⼝data :{"password":password,"accountName":accountName},type : "GET",dataType: "json",success : function(data) {if (data){if (data.code == "1111") { //判断返回值,这⾥根据的业务内容可做调整setTimeout(function () {//做延时以便显⽰登录状态值showMsg("正在登录中...");console.log(data);window.location.href = url;//指向登录的页⾯地址},100)} else {showMsg(data.message);//显⽰登录失败的原因return false;}}},error : function(data){showMsg(data.message);}});}//错误信息提醒function showMsg(msg){$("#CheckMsg").text(msg);}//监听回车键提交$(function(){document.onkeydown=keyDownSearch;function keyDownSearch(e) {// 兼容FF和IE和Operavar theEvent = e || window.event;var code = theEvent.keyCode || theEvent.which || theEvent.charCode;if (code == 13) {$('#submit').click();//具体处理函数return false;}return true;}});到这⾥,⼀个完整的登录界⾯结束,下⾯看登录失败和成功时的效果:以上所述是⼩编给⼤家介绍的JS实现系统登录页的登录和验证详解整合,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。

JAVA-用HttpClient来模拟浏览器GET,POST

JAVA-用HttpClient来模拟浏览器GET,POST

一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。

所访问的这些页面有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需要认证以及是一些通过加密方式传输,例如HTTPS。

目前我们使用的浏览器处理这些情况都不会构成问题。

不过你可能在某些时候需要通过程序来访问这样的一些页面,比如从别人的网页中“偷”一些数据;利用某些站点提供的页面来完成某种功能,例如说我们想知道某个手机号码的归属地而我们自己又没有这样的数据,因此只好借助其他公司已有的网站来完成这个功能,这个时候我们需要向网页提交手机号码并从返回的页面中解析出我们想要的数据来。

如果对方仅仅是一个很简单的页面,那我们的程序会很简单,本文也就没有必要大张旗鼓的在这里浪费口舌。

但是考虑到一些服务授权的问题,很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的,而必须经过注册然后登录后方可使用提供服务的页面,这个时候就涉及到COOKIE问题的处理。

我们知道目前流行的动态网页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。

为了使我们的程序能使用别人所提供的服务页面,就要求程序首先登录后再访问服务页面,这过程就需要自行处理cookie,想想当你用.HttpURLConnection来完成这些功能时是多么恐怖的事情啊!况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的“顽固”!再有如通过HTTP来上传文件呢?不需要头疼,这些问题有了“它”就很容易解决了!我们不可能列举所有可能的顽固,我们会针对几种最常见的问题进行处理。

当然了,正如前面说到的,如果我们自己使用.HttpURLConnection来搞定这些问题是很恐怖的事情,因此在开始之前我们先要介绍一下一个开放源码的项目,这个项目就是Apache开源组织中的httpclient,它隶属于Jakarta的commons项目,目前的版本是2.0RC2。

安卓HttpClient+Jsoup+Httpwatch模拟登陆正方教务获取信息

安卓HttpClient+Jsoup+Httpwatch模拟登陆正方教务获取信息

安卓HttpClient+Jsoup+Httpwatch模拟登陆正方教务获取信息分类: android | 标签: 安卓,爬虫| 作者: u013082133 相关| 发布日期 : 2014-10-03 | 热度 : 1107°目录[+]之前想要写一下关于爬数据的文章的,发现时间有点急迫。

所以今天在期末考试之前写完跟大家分享一下的我的心得,先上之前的图。

今天我也以正方教务体统抓取成绩的例子来给大家讲解,第一次写博客,可能会写的不会,还请大家谅解,不过保证大家看的懂,请耐心看完。

好了,下面开始!!!第一步:登陆你们的教务,这是我们学习的教务的主页/,进去之后,打开httpWatch,至于没用过的话,自己去研究下,因为里面有将我们需要的Post参数和Post地址都归纳出来的,很好用。

如图:进去之后你会看见HttpWatch刷刷的,出来一大片数据,当然我们的从当中挑选出有用的数据。

如图,我们打开上栏中的第一列标签,就是横线的地方。

首先我们来观看下数据,请求方法:post,状态值:302,请求的URL:/default2.aspx。

然后,我们来观察下面大圈圈中的数据,这里是Post所带的参数,里面有__ViewStat(我也不知道是什么,不过一起带着Post就好了,这里有个情况,我等会在下面讲,先用绿色标记),Button的值(乱码),lbLanguage(不管,先记下),RadioButtonList1(单选按钮:学生...),TextBox1:账号,TextBox2:密码。

Ok.......下面我们来看一下Button和lbLanguage和RadioButtonList1具体的值,下面的标签打开Stream,如图:看,里面有一些不认识的参数的值。

Button="" ,lbLanguage="",RadioButtonList1="%D1%A7%C9%FA",哦了。

使用HttpClient实现基于WEB的第三方登录验证

使用HttpClient实现基于WEB的第三方登录验证

使用HttpClient实现基于WEB的第三方登录验证作者:张铁头马丽霞来源:《电脑知识与技术》2012年第12期摘要:WEB应用经常需要用户登录才能进行操作,这要求必须先是其已注册用户。

但有些情况下希望的用户只限于某个第三方网站已有的合法用户。

如果第三方网站提供用户数据库或者诸如WEBService类接口,非常容易实现,否则就需要新的解决办法。

HttpClient是一个开源的组件,实现了完整的WEB客户端编程能力,可以通过HttpClient模拟用户向第三方网站提交用户名密码等验证信息,然后根据返回的登录结果页面内容中是否包含相关的关键字来判断用户是否合法。

关键词:HttpClient;java;登陆验证中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)07-2779-02Third-party Login Authentication with HttpClient Based WEBZHANG Tie-tou1,MA Li-xia2(1.Henan Polytechnic Department of Information Engineering, Zhengzhou 450046, China; 2. Henan Star Hi-Tech Company Limited, Zhengzhou 450001, China)Abstract: WEB applications often require a user to log in order to operate, so that this user must be registered before. But in some cases the user should be a legitimate user of a third-party websites.If the third party website to provide database or interfaces such as WebService class, it is easy to implement, otherwise new solutions should be resolved. HttpClient is an open-source components to achieve a complete Web client-side programming capabilities, user name, passwords and other authentication information is submitted through the HttpClient simulation users to third-party websites, and then return results of the login page content words to determine whether the user is legitimate. Key words: HttpClient; java; login authentication一般的情况下我们都是使用IE或者Firefox等浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等。

利用httpclient jericho多线存实现抓取网页内容

利用httpclient jericho多线存实现抓取网页内容

任务描述:某图书网站按条件查询得出一页20条记录,每条记录有书目的简要信息和url链接到书的详细信息。

需要抓取网站图书的详细信息,保存到本地数据库中。

任务分析:用httpclient模拟执行url将网站的信息取回,再用jericho包,分析页面元素,将需要的信息取出,保存到数据库中。

因为数据量比较大,还是采用多线存的方式来执行抓取详细页面,分析获得数据。

处理过程:按条件查询到图书列表信息后,主线存不停的下翻页面,分析每本图书的详细url,将url保存到一个ArrayList中,启多个子线存分别去抓取详细页面的信息。

然后利用jericho包分析页面数据并保存到数据库中。

代码实现截取如下:......public class BookCatcher{private static ArrayList threads= new ArrayList();//存储未处理URLpublic static boolean isFinished=false;public String getUrl() {try {synchronized (threads) {if (threads.size() > 0) {String tmp = String.valueOf(threads.get(0));threads.remove(0);return tmp;} elsereturn null;}} catch (Exception e) {return null;}}public void process(){//处理预处理//下面开10个线程等待处理new Thread(new Processer(this)).start();new Thread(new Processer(this)).start();new Thread(new Processer(this)).start();new Thread(new Processer(this)).start();new Thread(new Processer(this)).start();new Thread(new Processer(this)).start();new Thread(new Processer(this)).start();new Thread(new Processer(this)).start();new Thread(new Processer(this)).start();new Thread(new Processer(this)).start();....for(int j=0;j<pages;j++)//从第一页翻到最后一页{...source = CommonUtil.getSourceByUrl(url);List<Element> elements = source.getAllElementsByClass("ProductTitle");for (Element element : elements){String href = element.getContent().getFirstStartTag().getAttributeValue("href");if (href!=null && !"".equals(href)){synchronized (threads) {threads.add(bookurl);// 把URL存进去}}}isFinished=true; //主线存处理完所有的url}class Processer implements Runnable{BookCatcher c;public Processer(BookCatcher c){this.c = c;}public void run(){String bookUrl = null;while((bookUrl=c.getUrl())!=null || !BookCatcher.isFinished) //当还有记录时就处理{if(bookUrl!=null){//处理分析页面数据并将数据保存到数据库Source source = CommonUtil.getSourceByUrl(bookUrl);String tmp = "";BookBean bean = new BookBean();bean.setStoreBookUrl(bookUrl);//书名StartTag tag = source.getFirstStartTagByClass("BookTitle");tmp = tag.getRenderer().toString();bean.setName(tmp);//作者tag = source.getFirstStartTagByClass("bookAuthor");if (tag!=null){List<StartTag> list = tag.getElement().getAllStartTags(HTMLElementName.A);if (list.size()>0)bean.setAuthor(list.get(0).getElement().getContent().toString());}//书籍图片tag = source.getFirstStartTag("id", "BookImage", false);if (tag!=null)bean.setPicUrl(tag.getAttributeValue("src").trim());StartTag tagLeft = source.getFirstStartTagByClass("Left");tmp=tagLeft.getRenderer().toString();List<String> resList = new ArrayList<String>();String[] leftArray = tmp.split("·");for (String str:leftArray){if ("".equals(str)) continue;resList.add(str);}StartTag tagRight = source.getFirstStartTagByClass("Right");tmp = tagRight.getRenderer().toString();String[] rightArray = tmp.split("·");for (String str:rightArray){if ("".equals(str)) continue;resList.add(str);}for (String str:resList){try{String name = CommonUtil.getString(str.split(":")[0]);String value = CommonUtil.getString(str.split(":")[1]);if ("ISBN".equals(name)) bean.setIsbn(value);if ("出版社".equals(name)) bean.setPublisherOrg(value);if ("页码".equals(name)) bean.setPageNum(value);if ("出版日期".equals(name)) bean.setPublishDate(value);if ("装帧".equals(name)) bean.setWrapType(value);if ("开本".equals(name)) bean.setFormat(value);}catch(ArrayIndexOutOfBoundsException ee){}}//定价tag = source.getFirstStartTagByClass("BookPrice");String price = tag.getElement().getAllStartTags(HTMLElementName.STRIKE).get(0).getRenderer().toString();price = price.substring(1,price.length());bean.setPrice(price);//零售价格tag = source.getFirstStartTagByClass("DetailPrice");if (tag!=null)bean.setStorePrice(tag.getElement().getAllStartTagsByClass("OurPrice").get(0).getRenderer().toSt ring());elsebean.setStorePrice("0");List<StartTag> tagList = source.getAllStartTagsByClass("ContentValue");if(tagList!=null && tagList.size()>1){// 内容简介tag = tagList.get(0);tmp = tag.getRenderer().toString().trim();if(tmp.length()>2000)tmp = tmp.substring(0, 1990)+"...";bean.setContent(tmp);}new BookBO().saveBook(bean);}else//如果没标志处理则休眠一秒再重新开始处理{try{Thread.sleep(1000);} catch (InterruptedException e){e.printStackTrace();}}}}}//CommonUtil中的方法,通过httpclient提交到url,返回的页面信息装入jericho的source public static Source getSourceByUrl(final String url) {Source source = null;HttpClient httpClient = new HttpClient();GetMethod getMethod = new GetMethod(url);getMethod.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler());try {int statusCode = httpClient.executeMethod(getMethod);if (statusCode != HttpStatus.SC_OK) {log.error("Method failed: " + getMethod.getStatusLine());}source = new Source(getMethod.getResponseBodyAsStream());} catch (HttpException e) {log.error("Please check your provided http address!");e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {getMethod.releaseConnection();}return source;}。

基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览实例

基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览实例

基于WebClient实现Http协议的Post与Get对⽹站进⾏模拟登陆和浏览实例本⽂实例讲述了基于WebClient实现Http协议的Post与Get对⽹站进⾏模拟登陆和浏览的⽅法。

分享给⼤家供⼤家参考。

具体分析如下:⼀、问题:我们在⼀些场合经常需要模拟浏览器进⾏⼀些操作,⽐如模拟投票,或者模拟点击,或者Web游戏外挂。

⼆、解决⽅法:C#中封装好的WebClient可以在某些要求不算⾼的场景实现Http的Post和Get。

具体请见如下代码:复制代码代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using ;namespace TestCNM{public class WebClientExt{public string Get(string Url,string Referer, Encoding Encoder,ref string CookieStr){string result = "";WebClient myClient = new WebClient();myClient.Headers.Add("Accept: */*");myClient.Headers.Add("User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET4.0E;.NET4.0C; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152;.NET CLR 3.5.30729; SE 2.X MetaSr 1.0)");myClient.Headers.Add("Accept-Language: zh-cn");myClient.Headers.Add("Content-Type: multipart/form-data");myClient.Headers.Add("Accept-Encoding: gzip, deflate");myClient.Headers.Add("Cache-Control: no-cache");if (CookieStr != ""){myClient.Headers.Add(CookieStr);}myClient.Encoding = Encoder;result = myClient.DownloadString(Url);if (CookieStr == ""){CookieStr = myClient.ResponseHeaders["Set-Cookie"].ToString();CookieStr = GetCookie(CookieStr);}return result;}public string Post(string Url, string Referer, Encoding Encoder, ref string CookieStr, string Data){string result = "";WebClient myClient = new WebClient();myClient.Headers.Add("Accept: */*");myClient.Headers.Add("User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET4.0E;.NET4.0C; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152;.NET CLR 3.5.30729; SE 2.X MetaSr 1.0)");myClient.Headers.Add("Accept-Language: zh-cn");myClient.Headers.Add("Content-Type: multipart/form-data");myClient.Headers.Add("Accept-Encoding: gzip, deflate");myClient.Headers.Add("Cache-Control: no-cache");if (CookieStr != ""){myClient.Headers.Add(CookieStr);}myClient.Encoding = Encoder;result = myClient.UploadString(Url, Data);if (CookieStr == ""){CookieStr = myClient.ResponseHeaders["Set-Cookie"].ToString(); CookieStr = GetCookie(CookieStr);}return result;}private string GetCookie(string CookieStr){string result = "";string[] myArray = CookieStr.Split(',');if (myArray.Count() > 0){result = "Cookie: ";foreach (var str in myArray){string[] CookieArray = str.Split(';');result += CookieArray[0].Trim();result += "; ";}result = result.Substring(0, result.Length - 2);}return result;}}}希望本⽂所述对⼤家的C#程序设计有所帮助。

使用 HttpClient 检索与获取过程数据

使用 HttpClient 检索与获取过程数据

使用HttpClient 检索与获取过程数据如何使用HttpClient 处理程序将 HttpClientHandler 类与 .Http 命名空间中的 HttpClient 类结合使用,以向 Web Service发送 GET 请求并检索响应。

HttpClient 类用于通过 HTTP 发送和接收基本要求。

它提供了一个用于从 URI 所标识的资源发送 HTTP 请求和接收 HTTP 响应的基类。

该类可用来向 Web 服务发送 GET、PUT、POST、DELETE 以及其他请求。

上述每种请求都作为异步操作进行发送。

HttpClientHandler 类是 HttpClient 的默认消息处理程序。

HttpClientHandler 类以及从该类派生的类让开发人员可以对 HTTP 请求配置从代理到身份验证的一系列选项。

一: 创建新项目打开 Microsoft Visual Studio 2010,然后从“文件”菜单中选择“新建项目”。

在模板列表中,选择 Visual C#。

在该区域下面,选择“Windows”,然后选择“Windows窗体应用程序”。

将该应用程序命名为 HttpClientHandlerSample,然后单击“确定”。

二: 添加WINDOWS UI在本节中,我们将在 Windows Form 中定义应用的布局,以指定应用中每个对象的大小和位置。

通过添加显示数据的控件和内容,我们已经完成了应用的用户界面。

如下图。

三: 创建 HttpClientHandler,发送 GET 请求并检索响应以下示例代码将首先创建 HttpClientHandler 对象。

该代码还将对该对象设置一个属性,并使用 HttpClientHandler 创建一个 HttpClient 对象。

1.首先创建 HttpClientHandler 对象。

将 AllowAutoRedirect 属性设置为 false。

curl 模拟登录案例

curl 模拟登录案例

curl 模拟登录案例
当使用curl模拟登录时,可以使用以下步骤来创建一个示例:
1. 首先,使用curl的POST请求模拟登录页面的请求,将用户名和密码发送给服务器。

这通常涉及到发送一个包含登录表单数据的POST请求。

```bash
curl -X POST -d
"username=your_username&password=your_password"
```
2. 服务器验证用户名和密码后,会返回一个重定向到登录成功页面的响应。

通常,服务器会在响应中包含一个重定向头部,指示浏览器跳转到登录成功页面。

```bash
curl -i -L
```
上述命令中,`-i`选项用于显示响应头,`-L`选项用于自动跟随重定向。

3. 服务器返回重定向响应后,可以使用curl的GET请求获取登录成功页面的内容。

```bash
curl
```
这将返回登录成功页面的HTML内容。

请注意,上述示例仅适用于基本的模拟登录过程。

在实际应用中,服务器可能会使用更复杂的验证机制和安全措施来保护用户凭据。

此外,请确保在使用curl进行模拟登录时遵守相关法律法规和网站的使用条款。

Java简单模拟登陆和爬虫实例---博客园老牛大讲堂

Java简单模拟登陆和爬虫实例---博客园老牛大讲堂

Java简单模拟登陆和爬⾍实例---博客园⽼⽜⼤讲堂鉴于有⼈说讲的不清楚,我这⾥再详细补充⼀下:更新⽇期:2017-11-23本⽚⽂章适合初学者,只简单说了⼀下爬⾍怎么⽤,和⼀个简单的⼩实例。

不适合你的就可以不看了。

----1、什么是爬⾍? 个⼈推荐: 个⼈解释:⽹路爬⾍其实就是拷贝⽹页源代码。

例如:我写了个⽹站:http://www.qe14053716.icoc.me/,你想获取⾥⾯的数据咋办?java的话肯定是把⽹站的源代码全部拿过来,把想要的数据给分析出来就完事了!百度爬⾍:百度是个搜索引擎,它的⼯作是什么呢?其实就是不断的把你的源代码拿过去,之后你的数据就泄漏了。

例如:我的,这篇⽂章百度会每隔⼀段时间爬取⼀下,这样⼤家就能通过百度搜索到我的⽂章了。

例如:现在出了不仅仅是博客园,还有其他的:新浪,博客等,还有⼀下不知名的博客园之类的,因为他们没有⽤户,没有⼈发⽂章咋办?所以就爬取别⼈的⽹站,来发表到⾃⼰的内容上。

防爬⾍:怎么防⽌爬⾍,像这种公开的博客园,⽆法防⽌爬⾍,因为博客园需要爬⾍来做推⼴!所以我加了防伪标志-----,不管这篇⽂章被爬⾍了多少遍,我的博客园⽼⽜⼤讲堂永远都会在,你们可以查看我的原⽂章了!常见的爬⾍技术:现在⽹路上出了很多爬⾍技术:、,这些都做的⽐较成熟了,好像是免费的。

可以使⽤(我没⽤过,不介绍了)我介绍的是爬⾍常见的技术之⼀:jsoup爬⾍2、jsoup爬⾍优缺点?---缺点:1,抓⽹页有点慢,2、抓静态⽹页⽐较好。

如果⾥⾯涉及到⼀些动态的⽹页,可能抓不出来。

缺点太多了,现在主流⼀般不⽤jsoup,因为现在动态⽹页居多,jsoup爬取动态⽹页效果太差。

所以不⽤如果使⽤,也⼀般jsoup技术和其他技术⼀块来⽤,⽅便爬取⽹页。

3、怎么爬⾍?--- 例⼦:这⾥⽤了jsoup爬⾍。

这⾥的⽤户名,密码因为涉及到其他的,所以你懂的。

 这⾥的例⼦需要⼀个jar包:⾃⼰下。

⾥⾯⽤的是jsoup爬⾍1)爬取⽹页----不需要登陆就能获取的⽹页数据。

爬虫java代码

爬虫java代码

爬虫java代码爬虫Java代码爬虫是一种用于自动从互联网上获取数据的程序。

它可以模拟人类在网络上浏览的行为,通过发送HTTP请求,获取网页的内容,并从中提取所需的数据。

在爬虫的开发过程中,使用Java语言编写的爬虫代码是非常普遍的选择。

爬虫的实现主要依赖于Java中的网络相关库,如Apache HttpClient和Jsoup等。

首先,我们需要使用HttpClient库来发送HTTP请求,并获取网页的内容。

这可以通过创建HttpClient对象、设置请求头和请求参数、执行请求等步骤来完成。

使用HttpClient可以模拟浏览器的行为,例如设置User-Agent、Cookie等,以便能够成功地获取网页的内容。

接下来,我们需要使用Jsoup库来解析网页的内容,从中提取所需的数据。

Jsoup是一款非常强大的Java HTML解析器,它可以将HTML文档转化为DOM树,并提供了一系列的API来方便地操作DOM树。

通过使用Jsoup,我们可以使用CSS选择器来定位和提取网页中的元素,并获取它们的属性值、文本内容等信息。

爬虫的开发过程中,需要注意一些问题。

首先,需要处理异常情况,例如网络连接超时、网页不存在等情况。

可以使用try-catch语句来捕获异常,并进行相应的处理。

其次,为了避免给网站服务器带来过大的负担,需要设置合适的请求头和请求参数,并控制爬虫的访问频率。

可以使用Thread.sleep()方法来暂停爬虫的执行,以达到限制访问频率的目的。

为了提高爬虫的效率,可以使用多线程或异步编程的方式来并发执行多个爬虫任务。

Java中提供了多线程编程的支持,可以使用Thread类或线程池来创建和管理线程。

通过合理地设计和使用多线程,可以提高爬虫的处理能力和效率。

在编写爬虫代码时,还需要注意一些道德和法律方面的问题。

爬虫不应该用于非法目的,例如盗取他人的个人信息、侵犯他人的隐私等。

此外,爬虫也应该遵守网站的访问规则,不应该给网站服务器带来过大的负担,以免影响正常的网站访问。

HttpClient 模拟登录Web版新浪微博

HttpClient 模拟登录Web版新浪微博

HttpClient 模拟登录Web版新浪微博上篇介绍了如何模拟登录手机版微博,过程还是比较简单的,没有设计到复杂的加密部分。

登录Web版微博的过程还是一样的,只不过这次需要提交的数据多一点。

publicstatic Cookie[] getWCookies(String username,String password) throws HttpException, IOException{HttpClient client =null;PostMethod post = null;GetMethod get = null;try{client = new HttpClient();client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY );post = newPostMethod("/sso/login.php?client=ssologin.js (v1.3.16)");String data = getServerTime();String nonce = makeNonce(6);NameValuePair[] nvps = new NameValuePair[] {new NameValuePair("entry", "weibo"),new NameValuePair("gateway", "1"),new NameValuePair("from", ""),new NameValuePair("savestate", "7"),new NameValuePair("useticket", "1"),new NameValuePair("ssosimplelogin", "1"),new NameValuePair("vsnf", "1"),new NameValuePair("vsnval", ""),new NameValuePair("su", encodeAccount(username)),new NameValuePair("service", "miniblog"),new NameValuePair("servertime", data),new NameValuePair("nonce", nonce),new NameValuePair("pwencode", "wsse"),new NameValuePair("sp", new SinaSSOEncoder().encode(password, data, nonce)),new NameValuePair("encoding", "UTF-8"),new NameValuePair("returntype", "META"),new NameValuePair("url","/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOC ontroller.feedBackUrlCallBack") };post.setRequestBody(nvps);client.executeMethod(post);String url =post.getResponseBodyAsString().substring(post.getResponseBodyAsString ().indexOf("/ajaxlogin.php?"),post.getResponseBodyAsS tring().indexOf("code=0")+6);get = new GetMethod(url);client.executeMethod(get);}catch(IOException e){e.printStackTrace();}finally{get.abort();post.abort();}return client.getState().getCookies();}其中密码部分进行了加密,加密的算法在网页的js文件里,网上有人把它改成了Java代码。

httpclient模拟自动登陆

httpclient模拟自动登陆

package httpclient模拟登陆;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import org.apache.http.Header;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import ValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import java.util.ArrayList;import java.util.List;/***DZ登录与发贴实例**@author Administrator 创建人**/public class LoginDZ extends Thread{static final String domainurl = "/"; //原始地址 static final String loginurl ="/member.php?mod=logging&action=login&loginsubmit= yes&infloat=yes&lssubmit=yes";//登录地址static final String loginUsername = "username"; // 登录用户名static final String loginPassword = "password"; // 密码static final String username = ""; // 登录用户名(自己改)static final String password = ""; // 登录密码(自己改)/***状态码对应HttpServletResponse的常量详细描述**@author Administrator*@time2012-4-812:24*/static class HttpStatus {static int SC_MOVED_TEMPORARILY = 301; // 页面已经永久移到另外一个新地址static int SC_MOVED_PERMANENTLY = 302; // 页面暂时移动到另外一个新的地址static int SC_SEE_OTHER = 303; // 客户端请求的地址必须通过另外的 URL 来访问static int SC_TEMPORARY_REDIRECT = 307; // 页面暂时移动到另外一个新的地址}/***获取formhash值value**@param url*@return*@throws IOException*@throws ClientProtocolException*@throws IOException*@throws ClientProtocolException*/public String getFormhash(String url,DefaultHttpClient httpclient) throws ClientProtocolException, IOException {HttpGet httpGet = new HttpGet(url);HttpResponse response = httpclient.execute(httpGet);HttpEntity entity = response.getEntity();StringBuffer sb = null;// 输出页面内容if (entity != null) {String charset = EntityUtils.getContentCharSet(entity);InputStream is = entity.getContent();sb = new StringBuffer();BufferedReader br = new BufferedReader(new InputStreamReader(is, charset));String line = null;while ((line = br.readLine()) != null) {sb.append(line);}is.close();}int pos = sb.indexOf("name=\"formhash\" value=");// 找出这个 formhash 的内容,这是登录用的 formhashString login_formhash = sb.substring(pos + 23, pos + 23 + 8);return login_formhash;}/***登录*@param httpclient*@param user用户名*@param pass密码*@param formhash提交的表单formhash值*@throws ClientProtocolException*@throws IOException*/public boolean logicDz(DefaultHttpClient httpclient,String formhash)throws ClientProtocolException, IOException{/* 创建post连接 */HttpPost httpPost = new HttpPost(loginurl);/* 创建登录条件 */List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("username", username));nvps.add(new BasicNameValuePair("password", password));nvps.add(new BasicNameValuePair("formhash", formhash));/* 添加到httpPost提交的内容中 */httpPost.setEntity(new UrlEncodedFormEntity(nvps, "gbk"));/*执行并打印登录后内容显示情况*/// printHttpGet(httpclient.execute(httpPost));HttpResponse response = httpclient.execute(httpPost);//不打印登录情况/*判断登录是否成功*/HttpEntity entity = response.getEntity();StringBuffer sb = null;// 输出页面内容if (entity != null) {String charset = EntityUtils.getContentCharSet(entity);InputStream is = entity.getContent();sb = new StringBuffer();BufferedReader br = new BufferedReader(new InputStreamReader(is, charset));String line = null;while ((line = br.readLine()) != null) {sb.append(line+"\t\n");}is.close();}if(sb.indexOf("title=\"访问我的空间\"") != -1){int pos = sb.indexOf("title=\"访问我的空间\"");String username =sb.substring(pos+15, pos+50);username = username.substring(0, username.indexOf("<", 1));System.out.println("登录时的用户名为:"+username);System.out.println("################################# 登录成功 ############################");return true;}else{return false;}/*释放资源*/// httpPost.abort();}/***发贴成功后返回页面内容*@param httpclient*@param url*@param message*@param subject*@param login_formhash*@return HttpResponse*@throws ClientProtocolException*@throws IOException*/public HttpResponse postMessage(DefaultHttpClient httpclient,String url,String message,String subject,String login_formhash) throws ClientProtocolException, IOException{HttpPost httpPost = new HttpPost(url);HttpResponse response = null;List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("message", message)); //内容nvps.add(new BasicNameValuePair("subject", subject)); //标题nvps.add(new BasicNameValuePair("formhash", login_formhash)); //提交form的hash值(防外提交form的)/*以下的可以不设置,看了一下论坛中,这两个都有值的*/nvps.add(new BasicNameValuePair("allownoticeauthor", "1"));nvps.add(new BasicNameValuePair("wysiwyg", "1"));httpPost.setEntity(new UrlEncodedFormEntity(nvps, "gbk"));response = httpclient.execute(httpPost);/*释放资源*/httpPost.abort();return response;}/***回复*@param httpclient*@param httpost*@param message*@param subject*@param login_formhash*@return*@throws ClientProtocolException*@throws IOException*/public HttpResponse postReMessage(DefaultHttpClient httpclient,String url,String message,String subject,String login_formhash) throws ClientProtocolException, IOException{HttpResponse response = null;/*提交的url,需要加上domainurl的地址*/url = getReMessageUrl(url,httpclient);System.out.println("回复提交表单地址 url="+url);HttpPost httpPost = new HttpPost(url);List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("message", message)); //内容nvps.add(new BasicNameValuePair("subject", subject)); //标题nvps.add(new BasicNameValuePair("formhash", login_formhash)); //提交form的hash值(防外提交form的)/*以下的可以不设置,看了一下论坛中,这两个都有值的*/nvps.add(new BasicNameValuePair("allownoticeauthor", "1"));nvps.add(new BasicNameValuePair("wysiwyg", "1"));httpPost.setEntity(new UrlEncodedFormEntity(nvps, "gbk"));response = httpclient.execute(httpPost);/* 释放资源 */httpPost.abort();return response;}/***获取回复的url*@param url*@param httpclient*@return*@throws ClientProtocolException*@throws IOException*/public String getReMessageUrl(String url,DefaultHttpClient httpclient) throws ClientProtocolException, IOException {HttpGet httpGet = new HttpGet(url);// Invalid use of SingleClientConnManager: connection still allocated.HttpResponse response = httpclient.execute(httpGet);HttpEntity entity = response.getEntity();StringBuffer sb = null;// 输出页面内容if (entity != null) {String charset = EntityUtils.getContentCharSet(entity);InputStream is = entity.getContent();sb = new StringBuffer();BufferedReader br = new BufferedReader(new InputStreamReader(is, charset));String line = null;while ((line = br.readLine()) != null) {sb.append(line+"\t\n");}is.close();}int pos = sb.indexOf("id=\"fastpostform\" action=");int pos_end = sb.indexOf("fastpost\"");System.out.println(sb.length()+" pos="+pos+"pos_end="+pos_end);// 找出这个 reMessageUrl 的内容String reMessageUrl = domainurl + sb.substring(pos+26, pos_end+8);//去除amp;reMessageUrl = reMessageUrl.replaceAll("amp;", "");//释放资源httpGet.abort();return reMessageUrl;}/***获取重定向的url*@param httpclient*@param response*@return返回url地址*/public String redirectHttp(DefaultHttpClient httpclient,HttpResponse response) {Header header = response.getFirstHeader("location");String urlRedirect = "";if(!header.getValue().contains(domainurl)){urlRedirect = domainurl+header.getValue();} else {urlRedirect = header.getValue();}return urlRedirect;}/***根据HttpResponse对象打印页面内容*@param response*@throws IOException*@throws IllegalStateException*/public void printHttpGet(HttpResponse response) throws IllegalStateException, IOException{HttpEntity entity = response.getEntity();StringBuffer sb = null;// 输出页面内容if (entity != null) {String charset = EntityUtils.getContentCharSet(entity);InputStream is = entity.getContent();sb = new StringBuffer();BufferedReader br = new BufferedReader(new InputStreamReader(is, charset));String line = null;while ((line = br.readLine()) != null) {sb.append(line+"\t\n");}is.close();System.out.println(sb.toString());}}/***主函数main()*@param args*@throws IOException*@throws InterruptedException*/public static void main(String args[]) throws IOException, InterruptedException {LoginDZ loginDZ = new LoginDZ();// connectionManagerDefaultHttpClient httpclient = new DefaultHttpClient();// 得到httpclient实例/* 登录论坛 */System.out.println("################################# 开始登录############################");String login_formhash =loginDZ.getFormhash(domainurl,httpclient);//获取formhashif(!loginDZ.logicDz(httpclient,login_formhash)){System.out.println("################################# 登录失败 ############################");return;}/* 开发发贴 */System.out.println("################################# 开发发贴############################");String url = null; //发贴的urlString message = null; //发贴的内容String subject = null; //发贴的标题// /* 这个就是发贴机了自己去加吧,可以用线程多个一起发,不用等其中fid不同而已,可从1开始到50*/// for(int i=0;i<1;i++){// /* 发贴参数 */// url ="/forum.php?mod=post&action=newthread&fid=24&extra=&topicsubmit=yes";// message = "最近组建创业团队,搞IT行业,欢迎加入,请留下你的联系方式"; // subject = "最近组建创业团队,搞IT行业,欢迎加入";// login_formhash = loginDZ.getFormhash(url,httpclient);//// /* 调用发贴方法四个参数,其中最后一个为form提交的hash值 */// HttpResponse response = loginDZ.postMessage(httpclient, url, message, subject, login_formhash);// /* 测试看看内容 */// System.out.println("################################# 发贴完成后内容如下 ############################");// loginDZ.printHttpGet(response); //打印发贴后的页面看看//// System.out.println("################################# 重定向跳转页面 ############################");// /* 获取重定向标识码 */// int statuscode = response.getStatusLine().getStatusCode();// if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY)// || (statuscode == HttpStatus.SC_MOVED_PERMANENTLY)// || (statuscode == HttpStatus.SC_SEE_OTHER)// || (statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) { // System.out.println("################################# 开始发表回复 ############################");// /* 发表回复 */// url = loginDZ.redirectHttp(httpclient, response);// message = "最好介绍一下自己,我会选择性的加大家的,最好加上联系的QQ 之类的";// subject = "最近组建创业团队,搞IT行业,欢迎加入";// login_formhash = loginDZ.getFormhash(url,httpclient);//// for(int j=0;j<1;j++){// //可以多次对一个帖子回复// }//// sleep(10000);//等10秒再回复//// response = loginDZ.postReMessage(httpclient,url, message, subject, login_formhash);//// /*打印页面内容*/// loginDZ.printHttpGet(response);// }// }url = "/thread-264893-1-1.html";message = "这个真不敢乱留联系方式,怕!好怕";subject = "最近组建创业团队,搞IT行业,欢迎加入";login_formhash = loginDZ.getFormhash(url,httpclient);for(int i=15;i<20;i++){System.out.println(message+" 现在是" + i);loginDZ.postReMessage(httpclient,url, message, subject,login_formhash);sleep(10000);}/* 关闭连接管理器 */httpclient.getConnectionManager().shutdown();}}。

Java爬虫工具Jsoup详解

Java爬虫工具Jsoup详解

Java爬⾍⼯具Jsoup详解Java 爬⾍⼯具Jsoup详解Jsoup是⼀款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML ⽂本内容。

它提供了⼀套⾮常省⼒的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作⽅法来取出和操作数据。

jsoup 的主要功能如下:1. 从⼀个 URL,⽂件或字符串中解析 HTML;2. 使⽤ DOM 或 CSS 选择器来查找、取出数据;3. 可操作 HTML 元素、属性、⽂本;jsoup 是基于 MIT 协议发布的,可放⼼使⽤于商业项⽬。

jsoup 可以从包括字符串、URL 地址以及本地⽂件来加载 HTML ⽂档,并⽣成 Document 对象实例。

简单⽽⾔,Jsoup就是先取html页⾯代码然后解析这些页⾯通过Jsoup携带的满⾜我们绝⼤多数需求的各种选择器从这个页⾯中获取我们所需要的重要数据的⼀款功能强⼤的html解析器,但也只是相对⽽⾔,这⾥的页⾯这是死的静态页⾯,如果你想获取动态⽣成的页⾯数据那么你得⽤到其他的java 爬⾍技术,我会不定时更新这些技术⼀起探讨。

下⾯我们来具体谈谈如何运⽤Jsoup⼀、如何取页⾯Jsoup提供了⽤来解析html页⾯的⽅法 parse(),我们通过解析它可以获取整个页⾯的dom对象,通过这个对象来获取你所需要的页⾯所须有的参数。

获取页⾯的⽅法有很多,这⾥就简单的列举⼏个:①通过Jsoup携带的connect()⽅法String htmlPage = Jsoup.connect("https://").get().toString();这个⽅法说需要的参数就是⼀个String类型的url链接,但是你的注意把这些链接的protrol加上,以免问题,其实这个⽅法解决了我们很多问题,我们完全可以把Jsoup解析html抽取成⼀段通⽤⼯具类,然后通过改变拼接的url参数获取到很多我们想要的东西,举个例⼦:京东和淘宝的商品链接都是固定的,通过改变其三⽅商品ID来获取商品详情参数。

Python模拟登录网站并抓取网页的方法

Python模拟登录网站并抓取网页的方法
t he ge n e r a l me c ha ni s ms a nd p r oc e s s es o f t he l o gi ng i n s i t e . Fi na l l y ,l og i n i n Ba i d u s u c c e s s f ul l y , a n d c r a wl t h e we b a c c o un t d a t a b y pyt ho n, a n d gi ve s t h e r e l e v a nt c o de s . Ke y wo r ds :M i ni n g we b; Pyt ho n; Fe t c h We b Pa g es
Ab s t r a c t : F i r s t l y , e l a b o r a t e t h e c u r r e n t c o n t e x t a n d a p p l i c a t i o n s c e n a r i o s o f s i mu l a t e d l o g i n g i n s i t e t e c h n o l o g y . S e c o n d l i n t r o d u c e
据 研 究 的 大 方 向o n s e 的 内容 包 括 以下 曲 项 :
H t ml 源 码 或 者 图片 ,i s o n字 符 串等 C o o k i e s : 后 续 的访 问 中 如 果 需 要 c o o k i e , 返 内容 l f I 则会 包 含 c o o k i e 其 中 UR L 是 统 一 资源 定位 符 的简 称 ,是 对 可 以从 互联 网上 得 到 的 资源 的位 置和 访 问方 法 的一 种 简 沽 的表 示 , 包 括 主机 部 分 、文 件 路 径 部 分 ;R e q u e s t H e a d e r s 是 向服 务请 求 信 息 的 头信 息 ,包含 编码 格 式 、用 户代 理 、提 交 主 机 和 路 等 信 息; P o s t d a t a 是 指 提 交 的用 户 、 内容 、 格式参数等 。 C o o k i e s 是服 务器 发送 给 浏 览器 的 、保 存 存 本 地 的 、服 务 器 用 来 识 别 用 户 的 文件 ,以及 用 来 判 断 用 是 否 合法 以及 一 髓录 信 息 。

HttpClient + Jsoup 模拟登陆,解析HTML

HttpClient + Jsoup 模拟登陆,解析HTML

HttpClient + Jsoup 模拟登陆,解析HTML,信息筛选(广工图书馆)HttpClient + Jsoup 模拟登陆,解析HTML获取信息微博:/375061590QQ :375061590最近在做一个校园综合Android客户端,主要是想把学校各类网站信息进行整合,放在一个平台上,供学校学生阅览。

思路如下:拿广东工业大学图书馆网站作为一个例子实现目标:用个人账号登陆图书馆并获取到个人借阅情况。

登陆地址http://222.200.98.171:81/login.aspx这里会用到Chrome的开发者工具(浏览器按F12可以开启)打开登陆界面的源码,下面是源码中的form标签Html代码&lt;formname=&quot;aspnetForm&quot;method=&quot;post&quot;action=&quot;login.aspx?Ret urnUrl=%2fuser%2fuserinfo.aspx&quot;onsubmit=&quot;javascript:returnWebForm_OnSubmit() ;&quot;id=&quot;aspnetForm&quot;&gt;&lt;div&gt;&lt;inputtype=&quot;hidden&quot;name=&quot;__EVENTTARGET&quot;id=&quot;__EVENT TARGET&quot;value=&quot;&quot;/&gt;&lt;inputtype=&quot;hidden&quot;name=&quot;__EVENTARGUMENT&quot;id=&quot;__EV ENTARGUMENT&quot;value=&quot;&quot;/&gt;&lt;inputtype=&quot;hidden&quot;name=&quot;__VIEWSTATE&quot;id=&quot;__VIEWSTA T E&quot;value=&quot;/wEPDwULLTE0MjY3MDAxNzcPZBYCZg9kFgoCAQ8PFgIeCEltYWdl VXJsBRt+XGltYWdlc1xoZWFkZXJvcGFjNGdpZi5naWZkZAICDw8W Ah4EVGV4dAUt5bm/5 Lic5bel5Lia5aSn5a2m5Zu+5Lmm6aaG5Lmm55uu5qOA57Si57O757ufZGQCAw8PFgIfAQUcM jAxM+W5tDAz5pyIMDXml6UgIOaYn+acn+S6jGRkAgQPZBYEZg9kFgQCAQ8W Ah4LXyFJd GVtQ291bnQCCBYSAgEPZBYCZg8V AwtzZWFyY2guYXNweAAM55uu5b2V5qOA57SiZAI CD2QWAmYPFQMTcGVyaV9uYXZfY2xhc3MuYXNweAAM5YiG57G75a+86IiqZAIDD2QW AmYPFQMOYm9va19yYW5rLmFzcHgADOivu+S5puaMh+W8lWQCBA9kFgJmDxUDCXhzd GIuYXNweAAM5paw5Lmm6YCa5oqlZAIFD2QW AmYPFQMUcmVhZGVycmVjb21tZW5kL mFzcHgADOivu+iAheiNkOi0rWQCBg9kFgJmDxUDE292ZXJkdWVib29rc19mLmFzcHgADO aPkOmGkuacjeWKoWQCBw9kFgJmDxUDEnVzZXIvdXNlcmluZm8uYXNweAAP5oiR55qE5 Zu+5Lmm6aaGZAIID2QW AmYPFQMbaHR0cDovL2xpYnJhcnkuZ2R1dC5lZHUuY24vAA/lm 77kuabppobpppbpobVkAgkPZBYCAgEPFgIeB1Zpc2libGV oZAIDDxYCHwJmZAIBD2QWBAI DD2QWBAIBDw9kFgIeDGF1dG9jb21wbGV0ZQUDb2ZmZAIHDw8W Ah8BZWRkAgUPZBY GAgEPEGRkFgFmZAIDDxBkZBYBZmQCBQ8PZBYCHwQFA29mZmQCBQ8PFgIfAQWlAU NvcHlyaWdodCAmY29weTsyMDA4LTIwMDkuIFNVTENNSVMgT1BBQyA0LjAxIG9mIFNo ZW56aGVuIFVuaXZlcnNpdHkgTGlicmFyeS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuPGJyIC 8+54mI5p2D5omA5pyJ77ya5rex5Zyz5aSn5a2m5Zu+5Lmm6aaGIEUtbWFpbDpzenVsaWJAc3p 1LmVkdS5jbmRkZL5QuJMrEZz+0UxuTVpXZ/EaY5A4&quot;/&gt;&lt;/div&gt;&lt;scripttype=&quot;text/javascript&quot;&gt;//&lt;![CDATA[vartheForm=document.forms[‘aspnetForm’];if(!theForm){theForm=document.aspnetForm;}function__doPostBack(eventTarget,eventArgument){if(!theForm.onsubmit||(theForm.onsubmit()!=false)){theForm.__EVENTTARGET.value=eventTarget;theForm.__EVENTARGUMENT.value=eventArgument;theForm.submit();}}//]]&gt;&lt;/script&gt;&lt;scriptsrc=&quot;/WebResource.axd?d=kbLQnwjf5uNQN4GcWRC5kD1rIySOzkR3uLyKE5x UO0j4Fa2lQPZwQlk_qYaspRXtlojncSBfRJNkA00qXOMQqsKd8WY1&amp;amp;t=634751988 274393221&quot;type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;scriptsrc=&quot;/WebResource.axd?d=nsbO6ZJty6_6fuRufFNYnRiJ-xEoD0xQr70NX6g0v6 4gngA TPLSnyyt7jyZkELLW6THXmh92_m0Y5TyvhES_-JroQeU1&amp;amp;t=6347519882743 93221&quot;type=&quot;text/javascript&quot;&gt;&lt;/script&gt;&lt;scripttype=&quot;text/javascript&quot;&gt;//&lt;![CDATA[functionWebForm_OnSubmit(){if(typeof(ValidatorOnSubmit)==&quot;function&quot;&amp;&amp;ValidatorOnSubmit()==false) returnfalse;returntrue;}//]]&gt;&lt;/script&gt;&lt;div&gt;&lt;inputtype=&quot;hidden&quot;name=&quot;__EVENTV ALIDATION&quot;id=&quot;__EV ENTV ALIDATION&quot;value=&quot;/wEWBQKa7ezdCwKOmK5RApX9wcYGAsP9wL8JAq W86pcIaBhXmFYzd5pGDTk/afln2TfArPw=&quot;/&gt;&lt;/div&gt;&lt;inputname=&quot;ctl00$ContentPlaceHolder1$txtlogintype&quot;type=&quot;hidden&quot;i d=&quot;ctl00_ContentPlaceHolder1_txtlogintype&quot;value=&quot;0&quot;/&gt;&lt;divid=&quot;Login&quot;class=&quot;clearFix&quot;&gt;&lt;divclass=&quot;LoginTitle&quot;&gt;登录我的图书馆&lt;/div&gt;&lt;divclass=&quot;LeftLogin&quot;&gt;&lt;divclass=&quot;LoginDiv&quot;&gt;&lt;divclass=&quot;loginContent&quot;&gt;&lt;divclass=&quot;loginInfo&quot;&gt;&lt;spanclass=&quot;leftInfo&quot;&gt;图书证号:&lt;/span&gt;&lt;spanclass=&quot;rightInfo&quot;&gt;&lt;inputname=&quot;ctl00$ContentPlaceHolder1$txtUsername_Lib&quot;type=&quot;text&qu ot;id=&quot;ctl00_ContentPlaceHolder1_txtUsername_Lib&quot;class=&quot;txtInput&quot;aut ocomplete=&quot;off&quot;/&gt;&lt;spanid=&quot;ctl00_ContentPlaceHolder1_rfv_UserName_ Lib&quot;style=&quot;color:Red;display:none;&quot;&gt;请输入证号&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;divclass=&quot;loginInfo&quot;&gt;&lt;spanclass=&quot;leftInfo&quot;&gt;密&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;码:&lt;/span&gt;&lt;spanclass=&quot;rightInfo&quot;&gt;&lt;inputname=&quot;ctl00$ContentPlaceHolder1$txtPas_Lib&quot;type=&quot;password&quot ;id=&quot;ctl00_ContentPlaceHolder1_txtPas_Lib&quot;class=&quot;txtInput&quot;/&gt;&lt;sp anid=&quot;ctl00_ContentPlaceHolder1_rfv_Password_Lib&quot;style=&quot;color:Red;display :none;&quot;&gt;请输入密码&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;spanid=&quot;ctl00_ContentPlaceHolder1_lblErr_Lib&quot;&gt;&lt;/span&gt;&lt;/div&gt;&lt;divclass=&quot;loginInfo&quot;&gt;&lt;inputtype=&quot;submit&quot;name=&quot;ctl00$ContentPlaceHolder1$btnLogin_Lib&quo t;value=&quot;登录&quot;onclick=&quot;javascript:WebForm_DoPostBackWithOptions(newWebForm_PostBackOp tions(&amp;quot;ctl00$ContentPlaceHolder1$btnLogin_Lib&amp;quot;,&amp;quot;&amp;quot;,t rue,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,false,false))&quot;id=&quot;ctl00_ContentP laceHolder1_btnLogin_Lib&quot;class=&quot;btn&quot;/&gt;&lt;inputtype=&quot;button&quot;value=&quot;清空&quot;onclick=&quot;rset()&quot;class=&quot;btn&quot;/&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;divclass=&quot;RightDescription&quot;&gt;&lt;imgsrc=&quot;images/pin.gif&quot;/&gt;&lt;br/&gt;1.如果您使用的是公共电脑,请在使用完毕后,务必退出登录,以保安全。

抓取网页,分析网页内容,模拟登陆网站的逻辑流程和注意事项

抓取网页,分析网页内容,模拟登陆网站的逻辑流程和注意事项

抓取⽹页,分析⽹页内容,模拟登陆⽹站的逻辑流程和注意事项这⾥只是做为⼩结和吸收要点去访问⼀个URL地址,获得对应的⽹页的过程,其对应的内部机制是准备好对应的Http请求(Http Request)+ 提交对应的Http Request–>获得返回的响应(Http Response) + 获得Http Response中的⽹页源码⼀:准备此Http请求Request (访问URL之前的准备⼯作)1:基本的url + 查询字符串URL地址,其实涉及到编码和解码的问题:具体可以看如下的2:GET还是POST2.1. get是从服务器上获取数据,post是向服务器传送数据。

2.2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段⼀⼀对应,在URL中可以看到。

post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内⼀起传送到ACTION属性所指的URL地址。

⽤户看不到这个过程。

2.3. 对于get⽅式,⽤Request.QueryString获取变量的值,对于post⽅式,⽤Request.Form获取提交的数据。

2.4. get传送的数据量较⼩,不能⼤于2KB。

post传送的数据量较⼤,⼀般被默认为不受限制。

但理论上,IIS4中最⼤量为80KB,IIS5中为100KB。

2.5. get安全性⾮常低,post安全性较⾼。

但是执⾏效率却⽐Post⽅法好。

建议:2.1、get⽅式的安全性较Post⽅式要差些,包含机密信息的话,建议⽤Post数据提交⽅式;2.2、在做数据查询时,建议⽤Get⽅式;⽽在做数据添加、修改或删除时,建议⽤Post⽅式;3:必须或可选:Headers即request header,头信息Headers,包含很多个Header有些是必须的,有些是可选的(根据不同情况,可忽略的)有的时候,甚⾄不设置任何header也是可以的。

需要登陆网站后才能获取数据的页面爬取

需要登陆网站后才能获取数据的页面爬取

需要登陆⽹站后才能获取数据的页⾯爬取⽬的是万⼀博主⽹站⽆法访问到的话⾃⼰需要学习的东西可就不存在了.本⽂需要学习的地⽅,使⽤三种不同的⽅式爬取需要登录才能获取数据的⽹站数据POST 请求⽅法:需要在后台获取登录的 URL并填写请求体参数,然后 POST 请求登录,相对⿇烦;添加 Cookies ⽅法:先登录将获取到的 Cookies 加⼊ Headers 中,最后⽤ GET ⽅法请求登录,这种最为⽅便;Selenium 模拟登录:代替⼿⼯操作,⾃动完成账号和密码的输⼊,简单但速度⽐较慢。

对于很多要先登录的⽹站来说,模拟登录往往是爬⾍的第⼀道坎。

本⽂介绍 POST 请求登录、获取 Cookies 登录、Seleium 模拟登录三种⽅法。

摘要:在进⾏爬⾍时,除了常见的不⽤登录就能爬取的⽹站,还有⼀类需要先登录的⽹站。

⽐如⾖瓣、知乎,以及上⼀篇⽂章中的桔⼦⽹。

这⼀类⽹站⼜可以分为:只需输⼊帐号密码、除了帐号密码还需输⼊或点击验证码等类型。

本⽂以只需输⼊账号密码就能登录的桔⼦⽹为例,介绍模拟登录常⽤的 3 种⽅法。

POST 请求⽅法:需要在后台获取登录的 URL并填写请求体参数,然后 POST 请求登录,相对⿇烦;添加 Cookies ⽅法:先登录将获取到的 Cookies 加⼊ Headers 中,最后⽤ GET ⽅法请求登录,这种最为⽅便;Selenium 模拟登录:代替⼿⼯操作,⾃动完成账号和密码的输⼊,简单但速度⽐较慢。

下⾯,我们⽤代码分别实现上述 3 种⽅法。

1. ⽬标⽹页这是我们要获取内容的⽹页:这个⽹页需要先登录才能看到数据信息,登录界⾯如下:可以看到,只需要输⼊账号和密码就可以登录,不⽤输验证码,⽐较简单。

下⾯我们利⽤⼀个测试账号和密码,来实现模拟登录。

2. POST 提交请求登录⾸先,我们要找到 POST 请求的 URL。

有两种⽅法,第⼀种是在⽹页 devtools 查看请求,第⼆种是在 Fiddler 软件中查看。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

现在我已经不再使用 htmlparser 了,原因是 htmlparser 很少更新,但最重要的是有了 jsoup 。 jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API, 可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。 jsoup 的主要功能如下: 1. 从一个 URL,文件或字符串中解析 HTML; 2. 使用 DOM 或 CSS 选择器来查找、取出数据; 3. 可操作 HTML 元素、属性、文本; jsoup 是基于 MIT 协议发布的,可放心使用于商业项目。 jsoup 的主要类层次结构如图 1 所示:
道理很简单,你只需要利用 jsoup 的选择器找出元素,然后就可以通过以上的方法来进行修改,除了无法修改标签名外 (可以删除后再插入新的元素) ,包括元素的属性和文本都可以修改。 修改完直接调用 Element(s) 的 html() 方法就可以获取修改完的 HTML 文档。 回页首
HTபைடு நூலகம்L 文档清理
程序示例:获取所有链接
数据修改
设置属性值 设置元素的 html 内容 设置元素的文本内容
html 清理
消除不受信任的 html (来防止 xss 攻击)
jsoup 简介
Java 程序在解析 HTML 文档时,相信大家都接触过 htmlparser 这个开源项目,我曾经在 IBM DW 上发表过两篇关 于 htmlparser 的文章,分别是:从 HTML 中攫取你所需的信息和 扩展 HTMLParser 对自定义标签的处理能力。但
修改数据
在解析文档的同时, 我们可能会需要对文档中的某些元素进行修改, 例如我们可以为文档中的所有图片增加可点击链接、 修改链接地址或者是修改文本等。 下面是一些简单的例子:
清单 4.
doc.select("ments a").attr("rel", "nofollow"); // 为所有链接增加 rel=nofollow 属性 doc.select("ments a").addClass("mylinkclass"); // 为所有链接增加 class=mylinkclass 属性 doc.select("img").removeAttr("onclick"); // 删除所有图片的 onclick 属性 doc.select("input[type=text]").val(""); // 清空所有文本输入框中的文本
jsoup 的过人之处——选择器
前面我们已经简单的介绍了 jsoup 是如何使用选择器来对元素进行检索的。 本节我们把重点放在选择器本身强大的语法 上。下表是 jsoup 选择器的所有语法详细列表。
表 2. 基本用法:
tagname 使用标签名来定位,例如 a
ns|tag
使用命名空间的标签定位,例如 fb:name 来查找 <fb:name> 元素
图 1. jsoup 的类层次结构
接下来我们专门针对几种常见的应用场景举例说明 jsoup 是如何优雅的进行 HTML 文档处理的。 回页首
文档输入
jsoup 可以从包括字符串、URL 地址以及本地文件来加载 HTML 文档,并生成 Document 对象实例。 下面是相关代码:
清单 1
// 直接从字符串中输入 HTML 文档 String html = "<html><head><title> 开源中国社区 </title></head>" + "<body><p> 这里是 jsoup 项目的相关文章 </p></body></html>"; Document doc = Jsoup.parse(html);
Element masthead = doc.select("div.masthead").first(); // 找出定义了 class=masthead 的元素
Elements resultLinks = doc.select("h3.r > a"); // direct a after h3
这是 jsoup 真正让我折服的地方,jsoup 使用跟 jQuery 一模一样的选择器对元素进行检索,以上的检索方法如果换成 是其他的 HTML 解释器,至少都需要很多行代码,而 jsoup 只需要一行代码即可完成。 jsoup 的选择器还支持表达式功能,我们将在最后一节介绍这个超强的选择器。 回页首
jsoup 在提供强大的 API 同时,人性化方面也做得非常好。在做网站的时候,经常会提供用户评论的功能。有些用户 比较淘气,会搞一些脚本到评论内容中,而这些脚本可能会破坏整个页面的行为,更严重的是获取一些机要信息,例如 XSS 跨站点攻击之类的。 jsoup 对这方面的支持非常强大,使用非常简单。看看下面这段代码:
如果这五个过滤器都无法满足你的要求呢,例如你允许用户插入 flash 动画,没关系,Whitelist 提供扩展功能,例如 whitelist.addTags("embed","object","param","span","div"); 也可调用 addAttributes 为某些元素增加属性。 回页首
.userAgent("I ’ m jsoup") // 设置 User-Agent .cookie("auth", "token") // 设置 cookie .timeout(3000) // 设置连接超时时间
.post();
// 使用 POST 方法访问 URL
// 从文件中加载 HTML 文档 File input = new File("D:/test.html"); Document doc = Jsoup.parse(input,"UTF-8","/");
请大家注意最后一种 HTML 文档输入方式中的 parse 的第三个参数,为什么需要在这里指定一个网址呢(虽然可以不 指定,如第一种方法) ?因为 HTML 文档中会有很多例如链接、图片以及所引用的外部脚本、css 文件等,而第三个名 为 baseURL 的参数的意思就是当 HTML 文档使用相对路径方式引用外部文件时,jsoup 会自动为这些 URL 加上一 个前缀,也就是这个 baseURL。 例如 <a href=/project> 开源软件 </a> 会被转换成 <a href=/project> 开源软件 </a>。 回页首
#id
使用元素 id 定位,例如 #logo
.class
使用元素的 class 属性定位,例如 .head
[attribute]
使用元素的属性进行定位,例如 [href] 表示检索具有 href 属性的所有元素
[^attr]
使用元素的属性名前缀进行定位,例如 [^data-] 用来查找 HTML5 的 dataset 属性
jsoup Cookbook(中文版)
入门
解析和遍历一个 html 文档
输入
解析一个 html 字符串 解析一个 body 片断 根据一个 url 加载 Document 对象 根据一个文件加载 Document 对象
数据抽取
使用 dom 方法来遍历一个 Document 对象 使用选择器语法来查找元素 从元素集合抽取属性、文本和 html 内容 URL 处理
清单 3.
File input = new File("D:\test.html"); Document doc = Jsoup.parse(input,"UTF-8","/");
Elements links = doc.select("a[href]"); // 具有 href 属性的链接 Elements pngs = doc.select("img[src$=.png]");// 所有引用 png 图片的元素
你可能会觉得 jsoup 的方法似曾相识,没错,像 getElementById 和 getElementsByTag 方法跟 JavaScript 的方法 名称是一样的,功能也完全一致。你可以根据节点名称或者是 HTML 元素的 id 来获取对应的元素或者元素列表。 与 htmlparser 项目不同的是, jsoup 并没有为 HTML 元素定义一个对应的类, 一般一个 HTML 元素的组成部分包括: 节点名、属性和文本,jsoup 提供简单的方法供你自己检索这些数据,这也是 jsoup 保持瘦身的原因。 而在元素检索方面,jsoup 的选择器简直无所不能,
jsoup 使用一个 Whitelist 类用来对 HTML 文档进行过滤,该类提供几个常用方法:
表 1. 常用方法:
方法名 简介
none()
只允许包含文本信息
basic()
允许的标签包括:a, b, blockquote, br, cite, code, dd, dl, dt, em, i, li, ol, p, pre, q, small, strike, strong, sub, sup, u, ul, 以及合适的属性
// 从 URL 直接加载 HTML 文档 Document doc = Jsoup.connect("/").get(); String title = doc.title();
相关文档
最新文档