社招进腾讯阿里的面试呗,你值得拥有!
优采云 发布时间: 2021-05-02 07:13社招进腾讯阿里的面试呗,你值得拥有!
内容
前言
几天前,我接受了阿里外籍人士的采访。作为一个自信和自大的人,尽管我是外籍人士,但我仍然对阿里充满钦佩之情,就像我要进入清华北大参加高考,而我想进入腾讯上班一样,阿里也是一样。当然,除了可以招募阿里的学校招募985/211之外,想要通过社会招募阿里的其他人更加困难。至少他们是某个领域的专家。因此,如果您有机会,请尝试阿里的采访。
一、面试内容1、电话面试和项目实践问题
首先,这是电话采访:这通常不是问题。仔细阅读并阅读更多书籍,少吃零食,多睡些……这肯定可以回答。
接下来是一个手写的演示主题,如下所示
文档链接:
在左侧的文档树中爬网所有文档列表
在查询页面上输入关键词或描述性语言,并给出3个最匹配的文档(从高到低排序)。
提供:
1.代码
2.匹配提示
奖励项目:如何提供描述性语言的推荐文档。例如,用户输入:我的日志采集不可用
大多数人在听到编写演示的消息时都会感到恐慌,不要害怕,我不是在这里与您分享经验和代码示例,因此在阅读本内容文章之后,我应该没问题了无论如何,一切都结束了。
2、动手主题:文档爬网和搜索
3、研究主题
首先,让我们看一下链接。让我们看看它是什么。原来是阿里云的帮助文档。看来,这个简单的演示实际上是在根据用户输入关键词一个小项目搜索相应的解决方案的。
第一步,抓取内容应该不难。不管您使用Java还是Python,困难都是第一位的,但是Python可能会更简单,并且用Java编写的代码会更多,当然也会更少。目前,编辑器仍然想首先学习Java,因此演示是通过Java代码完成的。对于Python,首先要学习学习一种语言,然后再扩展另一种语言,以便更好地为您提供帮助。
困难在于第二个小步骤,“在查询页面上输入关键词或描述性语言,并给出最匹配的3个文档(从高到低排序)”,
我们不要先进行爬网,因为我们必须封装所需的爬网格式。当我们不打算查询关键词此功能时,我们应该先保留它。
①查询输入关键词,给出最佳匹配解决方案主意
当然,您可以编写自己的算法和匹配项,但是在这种情况下,匹配项肯定不是非常准确,并且几乎不可能在一天内编写它。因此,让我们看看前辈是否有这种类型的更好的解决方案,而站在巨人的肩膀上,将事半功倍。
实际上,有很多方法可以实现相似的功能,
例如,搜索分词器:捷巴分词,Ansj分词...有关其他特定的分词效果,您可以单击此处:了解11种开源中文分词器
或类似于搜索引擎服务器的开源框架:Elasticsearch,Lucene ...对于其他特定的搜索引擎服务,您可以单击此处:了解13个开源搜索引擎
这里展示的编辑器是一个演示项目,用于使用solr搜索引擎进行爬网和搜索
二、开始学习
Solr下载地址:最好下载较低的版本,较高的版本需要较高的jdk版本,我的jdk是1. 7,而下载的solr版本是4. 7. 0,或者下载时在本文结尾处进行的演示中,我还将在其中使用的所有内容都放入其中。
1、配置步骤
①下载后,解压缩
②cmd进入此目录:xxxxx / solr- 4. 7. 0 / example
③执行命令:java -jar start.jar
④访问是否成功启动,请在浏览器中输入:8983 / solr进行访问,表明启动成功。
2、 Solr界面说明和使用
我不会详细介绍特定solr的其他功能。您可以参考在线资料,以进一步加深对solr的理解和使用
三、开始抓取
首先将solr的maven包引入项目中
org.apache.solr
solr-solrj
4.7.0
抓取非常简单,只需模拟浏览器即可访问内容,我们可以看到要抓取的网站左侧的所有文本内容都在其中
内部
这很简单,因此,在对抓取的数据进行常规匹配之后,我们可以获得所需的所有文本标题信息。
代码示例:
/**
* 爬取数据
* @return
*/
@ResponseBody
@RequestMapping("/getDocs")
public String getDocs() {
Map mapReturn = new HashMap(); //返回结果
try {
//爬取前先在solr上建林索引属性
alibabaService.addDefaultField();
//开始爬取指定url的数据
String htmlResult = GetAliApi.sendGet("https://help.aliyun.com/document_detail/48851.html", "");
//获取到 树文档的内容
String[] mainMenuListContainer = htmlResult.split("")[1].split("");
//log.debug(mainMenuListContainer[0]);
//log.debug("------------------------------");
//进行正则获取数据
String searchReg = "(.*?)";
Pattern pattern = Pattern.compile(searchReg); // 讲编译的正则表达式对象赋给pattern
Matcher matcher = pattern.matcher(mainMenuListContainer[0]);
int i = 0;
String pre = "A";
while (matcher.find()) {
i++;
String title = matcher.group(1);
log.debug(title);
//将数据放到solr里,添加索引
Alidocs alidocs = new Alidocs();
alidocs.setId(pre+i);
alidocs.setTitle(title);
alibabaService.addIndex(alidocs);
}
mapReturn.put("returnCode","00");
mapReturn.put("content","爬取成功");
}catch (Exception e){
e.printStackTrace();
mapReturn.put("returnCode","-1");
mapReturn.put("content","爬取失败,请重试");
}
String mapStr = JSONObject.toJSONString(mapReturn);
return mapStr;
}
addDefaultField()方法和addIndex()方法:
// 添加默认索引属性
public void addDefaultField() throws SolrServerException, IOException {
// 声明要连接solr服务器的地址
String url = "http://localhost:8983/solr";
SolrServer solr = new HttpSolrServer(url);
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "默认情况下必须添加的字段,用来区分文档的唯一标识");
doc.addField("title", "默认的名称属性字段");
solr.add(doc);
solr.commit();
}
// 添加索引
public void addIndex(Alidocs alidocs) throws SolrServerException, IOException {
// 声明要连接solr服务器的地址
String url = "http://localhost:8983/solr";
SolrServer solr = new HttpSolrServer(url);
solr.addBean(alidocs);
solr.commit();
}
sendGet()方法:
public static String sendGet(String url, String param) {
String result = "";
String urlName = url + "?" + param;
try {
URL realURL = new URL(urlName);
URLConnection conn = realURL.openConnection();
//伪造ip访问
String ip = randIP();
System.out.println("目前伪造的ip:"+ip);
conn.setRequestProperty("X-Forwarded-For", ip);
conn.setRequestProperty("HTTP_X_FORWARDED_FOR", ip);
conn.setRequestProperty("HTTP_CLIENT_IP", ip);
conn.setRequestProperty("REMOTE_ADDR", ip);
conn.setRequestProperty("Host", "help.aliyun.com/");
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
conn.setRequestProperty("Referer","https://help.aliyun.com/"); //伪造访问来源
conn.setRequestProperty("Origin", "https://help.aliyun.com/"); //伪造访问域名
conn.connect();
Map map = conn.getHeaderFields();
for (String s : map.keySet()) {
System.out.println(s + "-->" + map.get(s));
}
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
String line;
while ((line = in.readLine()) != null) {
result += "\n" + line;
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
这样,基本上就完成了爬网功能,我们可以看到我们要爬网的就是我们想要的信息
四、通过关键词搜索
检索更加简单,因为使用了solr搜索引擎的服务,因此只要根据solr api传递数据,就可以对其进行检索,它将自动过滤单词分割并返回数据根据匹配程度。
代码示例:
/**
* 通过关键词获取数据
* @param title
* @return
*/
@ResponseBody
@RequestMapping("/findDocs")
public String findDocs(String title) {
Map mapReturn = new HashMap(); //返回结果
try {
String result = alibabaService.findIndex(title);
mapReturn.put("returnCode","00");
mapReturn.put("content",result);
}catch (Exception e){
e.printStackTrace();
mapReturn.put("returnCode","-1");
mapReturn.put("content","查询异常");
}
String mapStr = JSONObject.toJSONString(mapReturn);
return mapStr;
}
findIndex()方法:
// 查找索引
public String findIndex(String titleInput) throws SolrServerException {
// 声明要连接solr服务器的地址
String url = "http://localhost:8983/solr";
SolrServer solr = new HttpSolrServer(url);
// 查询条件
SolrQuery solrParams = new SolrQuery();
solrParams.setStart(0);
solrParams.setRows(10);
solrParams.setQuery("title:"+titleInput);
// 开启高亮
solrParams.setHighlight(true);
solrParams.setHighlightSimplePre("");
solrParams.setHighlightSimplePost("");
// 设置高亮的字段
solrParams.setParam("hl.fl", "title");
// SolrParams是SolrQuery的子类
QueryResponse queryResponse = solr.query(solrParams);
// (一)获取查询的结果集合
SolrDocumentList solrDocumentList = queryResponse.getResults();
List contentList = new LinkedList();
for (SolrDocument solrDocument : solrDocumentList) {
Map map = new HashMap();
map.put("id",solrDocument.get("id"));
map.put("title",solrDocument.get("title"));
contentList.add(map);
}
return contentList.toString();
}
五、主页页面
最后一页是前台页面。它不是很好,因为它很着急,只给一天时间,而且您白天必须上班,晚上只能花几个小时学习背景代码,前台会留下来独自的。如果有时间,就可以美化它
前景代码示例:
阿里测试题
1、先爬取文档数据
<a class="weui-btn weui-btn_mini weui-btn_primary" id="getDocs">开始爬取</a>
搜索关键词
<a class="weui-btn weui-btn_mini weui-btn_primary" id="findDocs">查询</a>
$('#getDocs').click(function () {
ajaxLoading('爬取中,请稍后...');
$.ajax({
url: "/ali/getDocs",
data: {},
type: 'post',
dataType: 'json',
success: function (data) {
ajaxLoadEnd();
$.MsgBox.Alert("提示",data.content,"确定");
},
error: function () {
$.MsgBox.Alert("异常","爬取发生异常,请联系管理员!","确定");
}
})
})
$('#findDocs').click(function () {
var keytitle = $('.keytitle').val();
if(keytitle==""){
$.MsgBox.Alert("提示","淘气!请输入内容","确定");
return
}
ajaxLoading('查询中...');
$.ajax({
url: "/ali/findDocs",
data: {"title":keytitle},
type: 'post',
dataType: 'json',
success: function (data) {
ajaxLoadEnd();
if (data.returnCode=="00"){
$.MsgBox.Alert("提示",data.content,"确定");
}else {
$.MsgBox.Alert("提示",data.content,"确定");
}
},
error: function () {
$.MsgBox.Alert("异常","查询发生异常,请联系管理员!","确定");
}
})
})
function ajaxLoading(text){
$("").css({display:"block",width:"100%",height:$(window).height()}).appendTo("body");
$("").html(text).appendTo("body").css({display:"block",left:($(document.body).outerWidth(true) - 190) / 2,top:($(window).height() - 45) / 2});
}
function ajaxLoadEnd(){
$(".datagrid-mask").remove();
$(".datagrid-mask-msg").remove();
}
六、运行效果图
基本上可以,并且只需完成即可。它仍然与我的预期有所不同。但是,为了赶快,我迅速发送了它。我是在晚上22:21左右发送的。我以为面试官明天必须给出结果,但是阿里成为如此出色的公司并不无道理。面试官当场回答我,说我通过了,有那么多敬业的程序员。您的公司会失败吗?
七、摘要:(使用代码下载)
1.必须首先开始solr
解压缩,在xxxxx / solr- 4. 7. 0 / example cmd目录中
执行命令:java -jar start.jar
2、启动项目aliTestProject
然后先单击“抓取”,稍等片刻,等待页面上出现“成功抓取”一词,然后您就可以进行查询
3、查询效果图
整个项目代码下载链接:
参考文章:
感谢原创作者的分享,以便技术人员可以更快地解决问题