如何实现一个拍照搜题功能
如何实现一个拍照搜题功能
主要分4步数据抓取,数据处理 ,图文转换,搜索引擎
1.数据抓取
主要抓取网页网站题库数据
可抓取题库网,无忧网,新东方题库
技术实现:
利用jsoup抓取相应网站的数据,利用htmlunit模拟客户端抓取数据
通过下面链接可下载Jsoup的jar包
http://central.maven.org/maven2/org/jsoup/jsoup/1.12.1/jsoup-1.12.1.jar
通过下面链接可下载htmlunit的jar包
http://central.maven.org/maven2/net/sourceforge/htmlunit/htmlunit/2.35.0/htmlunit-2.35.0.jar
遇到问题:
js异步加载 :
如组卷网会通过js异步加载导致jsoup第一步抓取的只是一个网站空壳,抓不到想要的数据
可以通过htmlunit技术去模拟浏览器,把js异步加载过程也模拟完成后能获得正确数据
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_52);//选择模拟浏览器型号//屏蔽日志信息LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log","org.apache.commons.logging.impl.NoOpLog");Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF);//支持JavaScriptwebClient.getOptions().setJavaScriptEnabled(true);webClient.getOptions().setCssEnabled(false);webClient.getOptions().setActiveXNative(false);webClient.getOptions().setCssEnabled(false);webClient.getOptions().setThrowExceptionOnScriptError(false);webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);webClient.getOptions().setTimeout(10000);webClient.waitForBackgroundJavaScript(10000);url="https://passport.zujuan.com/login";URL link=new URL(url);WebRequest webRequest=new WebRequest(link);HtmlPage rootPage = webClient.getPage(webRequest);//获得要抓取的页面
需要登陆:
有些网站一些页面需要登陆操作
可以通过设置hander cookie来跳过登陆,但是cookie部分数据会动态发生改变需要时时注意,
public static Document setHeader(String url) throws IOException {//设置header返回docMap<String, String> header = new HashMap<String, String>();Connection conn=Jsoup.connect(url);conn.header("Host","www.tiku.cn");conn.header("Connection","keep-alive");conn.header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0");conn.header("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");conn.header("Accept-Encoding","gzip, deflate");conn.header("Accept-Language","zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2");conn.header("Cookie","Hm_lvt_02f32149c7ea90d0cd47ed89025e457c=1555984749,1555986859,1556607888,1557306767; PHPSESSID=5i8v8easa3uhkev2r36uennqai; Hm_lpvt_02f32149c7ea90d0cd47ed89025e457c=1557399030; AD=None; token=6ce06f56f40d000c3bb79b7a65bed7e8; userId=25431; isLogin=1");//题库网的PHPSESSID会动态改变的得实时更新conn.header("Referer","http://www.tiku.cn/");//设置header的参数conn.execute();return conn.get();
}
或者通过htmlunit取模拟登陆
CookieManager cm=webClient.getCookieManager();//得到当前分配得到的cookieSet<Cookie> cookies=((CookieManager) cm).getCookies();Iterator<Cookie> it=cookies.iterator();while(it.hasNext()){webClient.getCookieManager().addCookie(it.next());}rootPage=webClient.getPage(url);HtmlForm form=rootPage.getForms().get(0);//获取当前页面的表单HtmlInput name=form.getInputByName("LoginForm[username]");HtmlInput pwd=form.getInputByName("LoginForm[password]");name.setValueAttribute("17684721017");pwd.setValueAttribute("123456");HtmlButton btn= (HtmlButton) rootPage.getByXPath("/html/body/div/div/form/div/div[3]/button").get(0);rootPage=btn.click();//获得登陆后的页面
访问频率限制:
某些网站对于一个ip有访问次数限制,所以需要正确线程池大小,而且尽量减少一次抓取所需要的访问次数
而且访问次数过多会导致网站连接延迟增加所以要提高连接超时限制
锁账户和ip机制
有些网站会有个动态黑名单,封锁异常多次访问的ip和账户
2.抓取数据的处理
遇到问题
抓取的数据可能是xml代码,json代码,其中可能带有html特殊字符,所以需要对其去转义,图片地址有可能是不带域名的所以处理的时候得加上域名
str= str.replace("<","<");
str= str.replace(""","\"");
str= str.replace(">",">");
str= str.replace("&","&");
str= str.replace("'","'");
str= str.replace(""","");
3.OCR技术(文字识别)
名称 | api来源 | 来源网址 | 是否开源 | 限制次数 | 技术问题 |
---|---|---|---|---|---|
iocr | 百度 | http://ai.baidu.com/tech/ocr/iocr | 否 | 每个账户50000次/天 | |
tesseract | 谷歌 | 作为开源项目发布在Google Project上 | 是 | 无限制 | 官方字库准确率过低,需要自己训练字库 |
百度ocr调用实现
将图片文件进行转码获得一个处理后的字符串
byte[] imgData = FileUtil.readFileByBytes(filePath);//需要自定义两个工具类
String imgStr = Base64Util.encode(imgData);
String params = URLEncoder.encode("image", "UTF-8") + "=" + URLEncoder.encode(imgStr, "UTF-8");//Base64Util,FileUtil这两个是自定义的工具类将图片文件转码
利用百度对每个账户分配的 API Key 和 Secret Key 获得新的accessToken通行证
public static String getAuth(String ak, String sk) {// 获取token地址String authHost = "https://aip.baidubce.com/oauth/2.0/token?";String getAccessTokenUrl = authHost// 1. grant_type为固定参数+ "grant_type=client_credentials"// 2. 官网获取的 API Key+ "&client_id=" + ak// 3. 官网获取的 Secret Key+ "&client_secret=" + sk;try {URL realUrl = new URL(getAccessTokenUrl);// 打开和URL之间的连接HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();connection.setRequestMethod("GET");connection.connect();// 获取所有响应头字段Map<String, List<String>> map = connection.getHeaderFields();// 遍历所有的响应头字段for (String key : map.keySet()) {System.err.println(key + "--->" + map.get(key));}// 定义 BufferedReader输入流来读取URL的响应BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String result = "";String line;while ((line = in.readLine()) != null) {result += line;}/*** 返回结果示例*/System.err.println("result:" + result);JSONObject jsonObject = new JSONObject(result);String access_token = jsonObject.getString("access_token");return access_token;} catch (Exception e) {System.err.printf("获取token失败!");e.printStackTrace(System.err);}return null;}
通过访问这个url可以得到通行证码
再通过http访问百度给的接口,需要在url地址带上通行证信息和图像处理后的字符串
String result = HttpUtil.post(otherHost, accessToken, params);//HttpUtil是一个自定义的连接类
最后获得百度传回的json文件,获得的文件格式为识别的每一行的字,所以好得处理下把每行字取出来合并
遇到问题
百度ocr api有账户次数限制 每个账户5w次/日
开源免费的tesseract的精度太低,需要训练词库,训练词库的方法可以通过下面这个博客学习
https://www.cnblogs.com/wzben/p/5930538.html
4.搜索引擎的搭建
技术实现
利用solr框架搭建一个针对题目title的搜索引擎
通过下面链接下载solr相关文件
http://mirror.bit.edu.cn/apache/lucene/solr/8.1.0/solr-8.1.0-src.tgz
配置要点:可查看微博https://www.cnblogs.com/xuyiqing/p/8707966.html
通过官网下载的文件,可直接通过终端启动solr,有几个重要的jar包需要添加,极其重要缺一不可
建立核心,在核心内有两个配置文件需要修改,data-config.xml solrconfig.xml
需要加入ik词库,需要配置scheme文件来修改词库内容
接下来:在刚才提到的schema.xml中配置:加上这一段
<fieldType name="text_ik" class="solr.TextField"><analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType><field name="title_ik" type="text_ik" indexed="true" stored="true"/>
<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
新建的这两个域支持IK分析器
启动前得提高solr服务器启动对应的jvm大小,防止因为数据量过大导致内存溢出问题
./solr -m 2g
cmd输入 为虚拟机分配2g大小的内存
导入数据的时候尽量将少量字段导入减少solr读取建立索引的消耗,导入id,title字段通过图片转义的文字对应title,来找到对应id并返回
java调用只需要先建立对solr服务器对应核心的连接然后定义关键词再获得结果响应
5.实现
把爬取的题库资源上传id和题目两个字段到solr服务器中,
用户把图片资源上传后,通过百度ocr接口把图片转换为文字,
对应文字上传到solr提供的接口返回相似度最高的前五个题目的id和题目,
返回用户这五个id和题目,用户自己点击选择最想看的题目,在上传id到服务器然后服务器查询数据库返回对应的h5和答案给用户
如何实现一个拍照搜题功能相关推荐
- java拍照搜题软件下载_拍照即可秒出答案,搜题类App:是教辅“神器”还是偷懒“神器”?...
• 搜题软件能够使资源利用率更大化,也可能让学生产生依赖,能否正确利用,主要在于学生对搜题软件的使用方法和自制力 • "抄作业"一直都存在,从某种角度而言,科技手段对原有的作业模式 ...
- AI的双刃剑:拍照搜题与协助作弊
在你辅导孩子学习的时候,有没有心有余力不足或者被气得抓狂的时刻? 当围棋比赛选手已经可以利用AI来作弊,这就意味着在智力型.脑力型的教育.比赛.活动.学习等领域,人类已经面临AI的全面挑战了. AI如 ...
- 用python的OCR实现自动拍照搜题--源码
自动拍照搜题源码 说明: 因为有很多人要源码,所以还是贴一下好了 很久之前的一个小demo就是搞着玩玩的没什么技术含量,马上要毕业去工作了,现在也不想在动了. 虽然是叫"自动拍照搜题&quo ...
- 互联网晚报 | 12月14日 星期二 | “植发第一股”雍禾医疗登陆港交所;商汤科技将延迟上市;“拍照搜题”等作业APP暂时下线...
今日看点 ✦ 星巴克承认无锡两门店存在违规行为,深夜道歉并启动全面自查 ✦ 知乎宣布全面上线8.0版本,将强化搜索功能 ✦ "植发第一股"雍禾医疗正式登陆港交所,总市值86.3 ...
- java拍照搜题软件下载_修改版|学生福利!!免费拍照搜题秒出答案,扫一扫作业出答案!...
让大家期待已久的学习软件终于来了!之前的两篇文章非常感谢朋友们的支持!收到最多的建议是希望多推荐一些学习软件,最后整理出了本篇文章给大家分享! 题拍拍 题拍拍app是一款学而思网校官方推出的手机拍照搜 ...
- 大学生拍照搜题_大学生心理健康教育知识,请问:这个考试有没有找答案软件?...
现在很多高校都特别重视大学生心理健康这一块,因此有些老师会引荐一些相关的课程,让学生学习,以此来提高大学生心理方面的素养,帮他们提高社会的应对能力及解决问题的能力.据我所知,有些大学里,有些心理学课程 ...
- 数学题库python_GitHub Python项目推荐|一个拍照做题程序|数学计算题识题|opencv...
GitHub Python项目推荐|一个拍照做题程序输入一张包含数学计算题的图片输出识别出的数学计算式以及计算结果 项目分析 仓库名称:mathAI 标星(star):1469 (网红级项目,高手作品 ...
- python 拍照搜题_直播答题?Python助你自动搜题赢百万!
2018年的1月,最火的莫过于各种直播答题App了吧?动辄百万的高额奖金,难易不定.种类繁杂的奇怪问题,紧张刺激的10秒作答,还有推广才能拿到的复活卡,就这样被征服了. 答题的时候想,要是能百度搜题就 ...
- python拍照搜题_Python数据分析实践,中国大学MOOC(慕课)答案公众号搜题
Python数据分析实践,中国大学MOOC(慕课)答案公众号搜题 更多相关问题 I can guess you were in a hurry. You ( ) your sweater inside ...
- python变成拍照搜题软件_2020年中国大学MOOC的APP用Python玩转数据作业答案
人们在改造客观世界和主观世界的实践活动中,既追求眼前的生产生活目标,渴望满足眼前的物质和精神的需求又憧憬长远的生产生活目标,期盼满足更高的物质和精神需求.这是指( ). 化学治疗时, 有关药液外渗的处 ...
最新文章
- IBM:决胜量子计算五大战略!商用近在咫尺
- 为什么JavaScript现在和将来都是编程语言首选?
- 【数据结构-栈和队列】详解栈和队列(代码+STL+原理)
- vb mysql ado_VB中的ADO数据对象编程详解
- 寻求神谕的词语:谈海日寒诗集《空山集》
- imagick php 缩放,php使用imagick模块实现图片缩放、裁剪、压缩示例
- go使用互斥锁实现协程同步
- 创建的Maven Web工程无法部署到服务器及web-app_2_3.dtd规范
- 百度云盘不限速 又一款百度网盘满速下载工具利器
- 《明朝那些事儿》心得体会
- js实现文件下载有很多种方式,本文主要介绍7种。
- ajax中的callback,ajax callback是什么
- MacOS图标文件 .icns 一键生成脚本
- JAVA的直接内存介绍
- 2005-04-28 把爸爸锁在阳台上
- java魔剑天使_大天使之剑大神教你打造牛逼魔剑士
- 开关、电机、断路器、电热偶、电表接线图大全
- Windows定时运行python程序
- 数据库 和html的交互
- GPRS模块与STM32的数据传输
热门文章
- 基于java SSM的房屋租赁系统设计和实现
- word文档太大怎么压缩到最小?
- 哈理工OJ 1983 Math(前缀和)
- 第一章 复数与复变函数
- 打印机驱动下载后只能打印单面(设置双面打印)解决方法
- Matlab数据库工具箱的简单使用
- win10+vs2015破解VA_X
- 【imessage软件群推送】 “CMCC“ | grep password #待补充 重置后撤销暂存的变更
- 奶茶店收银系统php版,奶茶店收银系统
- SQL Server 2008 R2 建立数据库,建立表,建立存储过程