Golang 爬取学院的安全测试题库

kqzh · · 1689 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

>[原文地址](https://www.liuxinc.ink/2019/10/17/olang-Scraping%EF%BC%88%E4%B8%89%EF%BC%89/) <!-- more --> ## 前言 学院的安全教育测试题目好难,为了通过测试,也为了检验一下最近的学习成果,我尝试用 golang 爬取了整个安全题库,并保存成csv文件方便使用(轻松100分) ## 遇到的问题 * 寻找关键的 form-data * json 的反序列化 ## 实现 ```go package main import ( "encoding/csv" "encoding/json" "fmt" "io/ioutil" "net/http" "net/url" "os" "strconv" ) type ContentSlice struct { Content string `json:"content"` RightAnswer string `json:"rightAnswer"` } type Content struct{ Content2 []ContentSlice `json:"content"` } type Data struct { Success bool `json:"success"` Data Content `json:"data"` } type Work struct { title string answer string } var ( SeminarId = 137 PageNum = 1 sum=0 ) func main() { works := make([]Work, 0, 1000) for{ var msg Data resp, err := http.PostForm("http://47.97.116.171:8085/web/getPractise", url.Values{"seminarId": {strconv.Itoa(SeminarId)}, "pageNum": {strconv.Itoa(PageNum)}}) if err != nil { fmt.Println(err) break } body, err := ioutil.ReadAll(resp.Body) defer resp.Body.Close() json.Unmarshal([]byte(body), &msg) if err != nil { fmt.Println(err) break } if msg.Success{ PageNum++ sum++ fmt.Println("select :",sum) works = append(works,Work{ title: msg.Data.Content2[0].Content, answer: msg.Data.Content2[0].RightAnswer, }) }else{ PageNum=1 SeminarId++ if SeminarId==150{ fmt.Println("收集完成!!!") break } } } fmt.Println("total is :",sum) f, _ := os.Create("Answers.csv") defer f.Close() f.WriteString("\xEF\xBB\xBF") writer := csv.NewWriter(f) defer writer.Flush() writer.Write([]string{"title", "answer"}) for _, v := range works { writer.Write([]string{v.title, v.answer}) } } ```

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1689 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传