关闭

使用httpclient获取其他网站数据(含解析验证码)

标签: 验证码httpclientpython
330人阅读 评论(0) 收藏 举报
分类:
    **使用httpclient获取其他网站数据**

使用httpclient模拟浏览器请求网站加载个人诉讼记录信息接口;
总结:1.系统如果上线,linux系统中使用了python命令来识别验证码,先将验证码保存在本地,识别完成后删除;需要一个python脚本,代码粘下面:
2.如果是在windows系统上运行该系统,提供了一个OCR的封装类,直接调用即可识别验证码;这里需要使用一个工具类,地址:http://download.csdn.net/download/qq_23339149/9617921

接口类:    
import com.alibaba.fastjson.JSONObject;
import com.aweb.platform.util.StringUtils;
import com.dbn.sysmodule.util.IdcardUtils;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.log4j.Logger;
import org.jsoup.Jsoup;
import org.jsoup.select.Elements;
import org.springframework.beans.factory.annotation.Value;

import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by warming on 2016/8/31 with IntelliJ IDEA.
 */
public class OuterInformationServiceImpl implements com.dbn.remote.service.OuterInformationService {
    private Logger log = Logger.getLogger(OuterInformationServiceImpl.class);

    @Value("${zhiXingIndexUrl}")
    private String zhiXingIndexUrl;
    @Value("${verificationCodeUrl}")
    private String verificationCodeUrl;
    @Value("${zhiXingSearchUrl}")
    private String zhiXingSearchUrl;
    @Value("${zhiXingSearchUserAgent}")
    private String zhiXingSearchUserAgent;

    public String getPersonLitigationRecords(String pName, String cardNum) throws Exception {
        String jsonStr = null;
        try {
            if (StringUtils.checkStr(pName) && IdcardUtils.validateCard(cardNum)) {
                HttpClient client = new HttpClient();
                GetMethod method = null;
                loadIndex(method, client);//模拟加载首页
                String htmlResponse = getRecords(client, method, pName, cardNum);
                int count = 0;
                Boolean success = false;
                while (count < 5) { //请求次数
                    if (htmlResponse.contains("验证码错误")) {
                        htmlResponse = getRecords(client, method, pName, cardNum);
                        count++;
                    } else {
                        success = true;
                        break;
                    }
                }
                log.info("验证码解析错误次数:" + count);
                if (!success) {
                    return "查询失败";
                }
                jsonStr = getJsonStrByHtml(htmlResponse);
                log.info("查询结果:" + jsonStr);
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new Exception("查询个人诉讼记录错误!", e);
        }
        return jsonStr;
    }

    private String getRecords(HttpClient client, GetMethod method, String pName, String cardNum) throws Exception {
        //加载验证码
        method = new GetMethod(verificationCodeUrl);
        method.addRequestHeader("User-Agent", zhiXingSearchUserAgent);
        client.executeMethod(method);
        //通过linux调用python命令执行;
        String fileName = "/tmp/" + Long.toString(System.currentTimeMillis()) + String.valueOf(getRandom()) + ".jpeg";
        FileOutputStream fout = null;
        try {
            fout = new FileOutputStream(fileName);
            fout.write(method.getResponseBody());
        }catch(Exception e){
            log.info("将验证码写入本地失败!");
        }finally{
            if(fout != null){
                fout.flush();
                fout.close();
            }
        }
        String code = exec(fileName);
        log.info("解析验证码为::" + code);

        //适用于windows操作系统
//        InputStream bis = new ByteArrayInputStream(get.getResponseBody());
//        String code = ParseJPEG_withOCR.getRecogniseStr(bis);
//        log.info("验证码解析结果:" + code);
//        bis.close();

        PostMethod post = new PostMethod(zhiXingSearchUrl);
        post.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        post.setRequestHeader("Referer", zhiXingIndexUrl);
        post.addRequestHeader("User-Agent", zhiXingSearchUserAgent);
        post.setRequestBody("searchCourtName=" + URLEncoder.encode("全国法院(包含地方各级法院)") + "&selectCourtId=1&selectCourtArrange=1&pname=" +
                URLEncoder.encode(pName) + "&cardNum=" + cardNum + "&j_captcha=" + code);
        client.executeMethod(post);
        InputStream is = null;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try{
            is = post.getResponseBodyAsStream();
            int i = -1;
            while ((i = is.read()) != -1) {
                baos.write(i);
            }
        }catch (Exception e){
            log.info("获取查询返回页面失败!");
        }finally {
            if(is != null){
                is.close();
            }
        }
        return baos.toString();
    }

    //获取HTML页面中table标签对应的json值
    private String getJsonStrByHtml(String htmlResponse) throws Exception {
        if (StringUtils.checkStr(htmlResponse)) {
            JSONObject data = new JSONObject();
            org.jsoup.nodes.Document doc = Jsoup.parse(htmlResponse);
            Elements trs = doc.getElementsByTag("tr");
            Elements ths = doc.getElementsByTag("th");
            Elements tds = doc.getElementsByTag("td");
            int trsSize = trs.size();//行数
            int thsSize = ths.size();//表头列数
            int tdsSize = tds.size();//td数
            if (trsSize > 0 && thsSize > 0 && tdsSize > 0) {
                List<Object> list = new ArrayList<>();
                for (int j = 0; j < trs.size() - 1; j++) {
                    Map<String, Object> map = new HashMap<>();
                    for (int i = 0; i < thsSize - 1; i++) {
                        map.put(ths.get(i).text(), tds.get(thsSize * j + i).text());
                    }
                    list.add(map);
                }
                data.put("data", list);
                return data.toJSONString();
            } else {
                return null;
            }
        } else {
            return null;
        }
    }

    //模拟请求首页
    private void loadIndex(GetMethod get, HttpClient client) throws IOException {
        get = new GetMethod(zhiXingIndexUrl);
        get.addRequestHeader("User-Agent", zhiXingSearchUserAgent);
        client.executeMethod(get);
        log.info("首页加载完成");
    }

    //调用linux命令
    public String exec(String fileName) {
        log.info("验证文件名称:" + fileName);
        try {
            String cmd ="python /tmp/captcha.py " + fileName;
            Process process = Runtime.getRuntime().exec(cmd);
            LineNumberReader br = new LineNumberReader(new InputStreamReader(
                    process.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String line;
            while ((line = br.readLine()) != null) {
                System.out.println(line);
                sb.append(line).append("\n");
            }
            //删除生成的验证码图片
            Runtime.getRuntime().exec("rm -f " + fileName);
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    //随机三位数
    public int getRandom() {
        int number = 0;
        while (true) {
            number = (int) (Math.random() * 1000);
            if (number >= 100 && number < 1000) {
                break;
            }
        }
        return number;
    }
}

工具类:

import com.asprise.util.ocr.OCR;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;


public class ParseJPEG_withOCR {
    public static String getRecogniseStr(InputStream imageFile) {
        String s = "";
        try {
            BufferedImage image = ImageIO.read(imageFile);
            int width = image.getTileWidth();
            int height = image.getTileHeight();
            image = image.getSubimage(0, 0, width, height);
            s = new OCR().recognizeEverything(image);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println(" 图片识别失败! ");
        }
        return s;
    }
    public static String getRecogniseStrByFile(File imageFile) {
        String s = "";
        try {
            BufferedImage image = ImageIO.read(imageFile);
            int width = image.getTileWidth();
            int height = image.getTileHeight();
            image = image.getSubimage(0, 0, width, height);
            s = new OCR().recognizeEverything(image);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println(" 图片识别失败! ");
        }
        return s;
    }

    public static void main(String[] args) {
//        for (int i = 0; i < 100; i++) {
//            String code = getRecogniseStrByFile(new File("D:\\pic\\download/" + i + ".jpeg"));
//            System.out.println(code);
//        }
    }

}

python脚本(文件名命名为:captcha.py),在linux同目录下保存验证码,执行命令:python /tmp/captcha.py ” + fileName 即可返回数据,pytesseract类库可
百度下载:

from PIL import Image
import sys
import pytesseract

def output(imgfile):
    img = Image.open(imgfile)
    gray = img.convert('L')
    print(pytesseract.image_to_string(gray, config='-psm 7'))


if __name__ == "__main__":
    file_name = sys.argv[1]
    output(file_name)
1
0
查看评论

使用HttpClient 4.x登陆带有验证码的网站

对于爬虫来说,验证码通常是实现过程中的一个巨大的障碍,因为验证码的多样性,有的甚至变态至极,所有一般来说使用代码自动识别验证码是非常困难的,本问的内容就是讲如何将验证码保存到本地,然后通过人工输入验证码实现登陆,从而抓取网页信息。 首先说说整个登陆的流程,当我们打开一个网站的时候,浏览器就会记录该网...
  • xiongyangg
  • xiongyangg
  • 2015-04-03 21:25
  • 4069

使用HttpComponents(即HttpClient)抓取数据

在平时的项目开发中,我们很多时候会需要别的网站的一些信息,但是对方不太可能专门为我们开发一个专用接口,这时候,我们就需要使用HttpComponents来将对方网站的信息抓取下来,方便我们业务上使用.那这个HttpComponents是什么呢?HttpComponents是一款用来模拟http请求的...
  • highcoder
  • highcoder
  • 2015-11-12 00:43
  • 1128

HttpClient4登陆有验证码的网站

其实就这个问题,本来是很简单的,我自己花了近两个下午才搞定,现在记录一下。也希望能帮助后来的朋友。 先说httpclient   操蛋的httpclent!   为什么说操蛋呢,因为从httpclient3到httpclient4,有很大的变化,而且我自己水...
  • dlf123321
  • dlf123321
  • 2016-03-02 15:01
  • 1261

httpClient 带验证码登录实现

抓取一个农业网站思路步骤如下: 1、首先需要获取验证码页面,把它以图片的格式保证下来。(图片格式需要通过抓包的工具查看。如:httpWatch)并跟踪到的cookie保存下来。cookie必须要跟抓包工具看到的cookie一致。 2、提交登录页面所需要的字段和验证码,字段尽可能全部提交上去。
  • shiyu_sy
  • shiyu_sy
  • 2016-09-06 14:23
  • 1494

httpclient绕过登陆验证码抓取数据

session的保持是通过cookie来维持的,所以如果用户有勾选X天内免登录,这个session 就X天内一直有效,就是通过这个cookie来维护。如果没选X天内免登录,基本上就本次才能保持session,下次打开浏览器就要重新登录了。  所以在web安全里,黑客通过XSS,最终目的就...
  • qew110123
  • qew110123
  • 2015-11-25 14:40
  • 2886

android中使用httpclient方法获得网页内容并对json对象解析

摘要:android中使用httpclient的get和post方法获取网络的内容,并将获取的json对象解析成部分,用于制作使用到网站已有信息的android应用。 学习自极客学院android视频,《数据存储》章中《操作JSON数据》,《网络通信》章中《异步任务》和《基于http通信》。Jav...
  • chnqutan
  • chnqutan
  • 2014-10-26 20:09
  • 2238

Java HttpClient 实现自动登录与获取网页信息

用HttpGet获取网页上的信息: public void testGet(String url) throws ClientProtocolException, IOException { // TODO Auto-generated constructor stub HttpClient...
  • llwwlql
  • llwwlql
  • 2016-10-11 20:39
  • 6365

JSP基本注册登录系统(含验证码)

纯手工编写,希望对大家能有所帮助 首先编写注册和登录的基本页面,分别命名为regist.jsp,login.jsp,另外再创一个用于证明用户已经登录的页面提示,命名为main.jsp login.jsp主要代码如下: 登录 用户名: <% ...
  • laijieyao
  • laijieyao
  • 2013-10-25 07:07
  • 10287

Android登录客户端,验证码的获取,网页数据抓取与解析,HttpWatch基本使用

大家好,我是M1ko。在互联网时代的今天,如果一个App不接入互联网,那么这个App一定不会有长时间的生命周期,因此Android网络编程是每一个Android开发者必备的技能,博主是在校大学生,自学Android一年半多,正好通过一个模拟登录校园网软件,来给大家演示如何在网页上抓取我们想要的数据,...
  • MikoGodZd
  • MikoGodZd
  • 2016-04-12 19:17
  • 6577

HttpClient 抓包实现验证码登陆,网站是教务系统

因为要做一个教务系统的客户端,学校不提交接口,所以需要自己去抓包,然后用Httpclient 实现登陆,比较头疼的是验证码,这里参考很多人的源码和文档终于自己成功登陆了。先是下载httpwatch pro版,然后抓到想要POST登陆信息的网页url,然后就是用代码实现登陆了 比较需要注意的是,POS...
  • u011276141
  • u011276141
  • 2014-03-03 10:13
  • 3105
    个人资料
    • 访问:12263次
    • 积分:454
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:1篇
    • 译文:1篇
    • 评论:1条
    最新评论