设为首页 收藏本站
查看: 1257|回复: 0

[经验分享] [Golang]实习最后一天小纪念+并发爬虫小练习

[复制链接]

尚未签到

发表于 2018-9-20 07:39:51 | 显示全部楼层 |阅读模式
  今天是我在公司实习的最后一天,一个月的时间真的是太短暂了,我非常享受在公司工作的这一个月,在这里Leader和同事们对我的帮助极大地促进了我技术水平的进步和自信心的提升,我发自内心地感谢白山云科技给我这样一个实习的机会,谢谢你们对我的无私帮助(虽然他们可能也看不到…)。
  眼看着暑假还剩不到一个月,其实我内心是不想离开这个公司的,但是想到开学以后又要有各种网络赛和区域赛,又有新生的到来,为了校队,我还是离开吧(虽然我回去也没啥卵用…)。
  实习期间第一次写函数式的程序,并且第一次完成了一个用于日志分析的分布式程序。还有腾讯的实时监控数据上报的需求的边缘服务器日志收集和汇总的功能,第一次为自己的代码写了测试。第一次与他人真正地合作完成一个项目,虽然到今天下午的时候leader说腾讯给出了新接口,我们分析了一下需求表示要改一大部分东西,不过我是没有机会再做下去了,留给zzb同学吧,估计他看了我的代码要推翻重写了,哈哈。
  记得刚来的时候我一直担心leader分配给我任务,我做不好。但是心一横接下来,不管做得好不好,只要用心去做,哪怕结果不尽人意,还是会得到宽容和认可(好吧我现在觉得我写的东西都是一坨shi…)。
  人总归有第一次,在随后的磕磕绊绊中学习,直到做出一点微小的贡献。慢慢地,力所能及的地方越来越高,直到自己羽翼丰满,独当一面,这就是奋斗和成长最吸引人的地方了吧。
  不知不觉我就要大三了,大学生活已经度过了一半。大一大二的时候总觉得一些具体的技术我没必要深究,于是就全部搁浅。经过这次实习我的心态有了变化,对自己未来的规划也应当再做一些调整了:
  多读一些书,在内存管理、并行代码编写上多下一些功夫。算法再优雅但终归是跑在单核上的,并行程序才适合这个时代。
  复习一下网络和数据库的内容。
  多看一些语言的第三方库,自己造轮子会浪费很多时间。
  多尝试写自己没有写过的东西,不要担心自己第一次写不出来,谁都有第一次,第一次也往往不是顺利的。
  复习好数学,继续学习机器学习的知识。
  刷题是必须持续进行的,帮助我提高思维水平,以便更好地接受其他知识。
  系统地学一下Linux,并且和windows说再见。
  现在就想起来这么多,等到以后继续补充吧。
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  爬虫的需求很简单,就是从paste.ubuntu.com上搞别人贴的代码,然后判断是不是C/C++代码。面临着几个问题需要考虑:
  1、paste访问的时间很长,这很影响爬虫和内容处理的效率,这该怎么办:
  这个问题我使用了三种方法来解决,第一个是采用并行程序,这个就不多说了,多开几个线程做处理会快些。第二个是预判这个文件的大小,设定一个阈值,保证这个文件超过阈值后一定不是C/C++的题解代码,当然塞一张表除外,不过OJ一般限制65535B,我们可以取一半即30000B。第三个是设置timeout,在golang里就需要手工建立一个client发送get请求了,这里的具体函数如下:

DSC0000.gif DSC0001.gif   

func GetHtml(Url string, MagicNum string) []byte {  
timeout := time.Duration(15 * time.Second)
  
client := http.Client{
  
Timeout: timeout,
  
}
  
request, err := http.NewRequest(http.MethodGet, Url, nil)
  

  
if err != nil {
  
log.Errorln(err.Error())
  
return nil
  
}
  
res, err := client.Do(request)
  
if err != nil {
  
log.Errorln(err.Error())
  
return nil
  
}
  
result, err := ioutil.ReadAll(res.Body)
  
if len(result) > 30000 {
  
return nil
  
}
  
res.Body.Close()
  
if err != nil {
  
log.Errorln(err.Error())
  
return nil
  
}
  
rd := bytes.NewReader(result)
  
nd, err := goquery.Parse(rd)
  
if err != nil {
  
log.Panicln(err.Error())
  
}
  
str := nd.Find("td.code").Text()
  

  
buf := []byte(str)
  
return buf
  
}
  


GetHtml  2、判断这个html中包含的代码是C/C++代码:
  这个我处理得很糙,就是去看看有没有一个#include子串,当然这个子串是可以增加的,不过可能影响效率。希望有更好办法的朋友可以留下你的方法,在此谢谢。

  

func Judge(buf []byte) bool {  
var patterns = []string{
  
"#include",
  
}
  
n := len(patterns)
  
for i := 0; i < n; i++ {
  
ok, err := regexp.Match(patterns, buf)
  
if ok {
  
return true
  
}
  
if err != nil {
  
log.Errorln(err.Error())
  
return false
  
}
  
}
  
return false
  
}
  


Judge  3、并行访问时如何保证访问不冲突:
  这个也很好解决,学过操作系统的人都明白可以添加一个mutex来保证一个资源不被同时访问。我这里更新的是一个offset,道理是一样的。这个os.Args[1]和offset都是全局变量,但是只有offset需要写,所以只给它加mutex就行了。

  

func numGetter(MagicNum string, ch chan int64) {  
Num, err := strconv.ParseInt(MagicNum, 10, 64)
  
if err != nil {
  
log.Errorln(err.Error())
  
return
  
}
  
ch

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-597870-1-1.html 上篇帖子: 【GoLang】GoLang struct 使用 下篇帖子: [golang]内存不断增长bytes.makeSlice
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表