一个不甘平凡的普通人,致力于为Golang社区和算法学习做出贡献,期待您的关注和认可,陪您一起学习打卡!!!
专栏:算法学习
专栏:Go实战
个人主页:个人主页
跟着我一起来学习go爬虫吧!!!
文章介绍:爬取网站的招聘信息
方法:使用go自带的http包中的方法去爬取相应的数据
希望对您有所帮助,您的一键三连是我更新的动力!!!十分感谢
文章目录
- 页面数据分析
- 爬取动态页面
- 判断类型
- 抓包模拟请求头
页面数据分析
常见的页面分为:静态页面和动态页面
如何判断是什么类型的页面呢? 通过查看页面的源代码,如果和你通过f12查看的页面元素一致,那么就说明是静态页面。
如果是静态页面的话, 可以通过直接获取网页链接,然后根据自己想要的标签然后获取对应的数据,这一类比较简单一点。
什么情况下是动态抓取? 如果查看源代码之后,发现元素的组成和通过f12不一致,并且由很多ajax或者js或者css构成,那么就不能直接通过拿链接去获取对应的数据,因为这样我们无法获得所有想要的数据,只会获得一部分。
那我们应该怎样去做呢??
爬取动态页面
爬取动态页面的最常见的方法就是:通过抓包,获取对应的ajax文件,通过查看自己想要的json数据位置,锁定对应的文件,然后模拟请求头抓取,下面以抓取某站的校招信息为例子:
判断类型
查看源代码: 判断出如果直接抓取不会拿到数据
所以需要动态抓取
抓包模拟请求头
步骤一:
步骤二:
步骤三:
具体代码实现:
这一块几乎涵盖了http包中爬虫所有用法 哥们自己看吧,写的很清楚了
// 抓取职位信息,主要作用:抓取到页面的id,为之后的每一页信息爬取做铺垫func Fetch(url string, Method string, requestBody []byte) {//url := "https://jobs.bilibili.com/api/campus/position/positionList"// 构造请求体//requestBody := []byte(`{"pageSize":10,"pageNum":"2","positionName":"","postCode":[],"postCodeList":[],"workLocationList":[],"workTypeList":["0"],"positionTypeList":["0"],"deptCodeList":[],"recruitType":null}`)req, err := http.NewRequest(Method, url, bytes.NewBuffer(requestBody))if err != nil {fmt.Println(err)return}// 添加请求头部信息req.Header.Add("authority", "jobs.bilibili.com")req.Header.Add("accept", "application/json, text/plain, */*")req.Header.Add("accept-language", "zh-CN,zh;q=0.9")req.Header.Add("content-type", "application/json;charset=UTF-8")req.Header.Add("origin", "https://jobs.bilibili.com")req.Header.Add("referer", "https://jobs.bilibili.com/campus/positions" />)req.Header.Add("sec-ch-ua", `"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"`)req.Header.Add("sec-ch-ua-mobile", "?0")req.Header.Add("sec-ch-ua-platform", `"Windows"`)req.Header.Add("sec-fetch-dest", "empty")req.Header.Add("sec-fetch-mode", "cors")req.Header.Add("sec-fetch-site", "same-origin")req.Header.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36")req.Header.Add("x-appkey", "ops.ehr-api.auth")req.Header.Add("x-channel", "campus")req.Header.Add("x-csrf", "728e3c6c-e981-412e-be94-ab1f76557972")req.Header.Add("x-usertype", "2")// 发送请求并获取响应client := &http.Client{}resp, err := client.Do(req)if err != nil {fmt.Println(err)return}defer resp.Body.Close()// 处理响应数据err = json.NewDecoder(resp.Body).Decode(&receive)if err != nil {fmt.Println("Error decoding JSON:", err)return}//将所有的id信息添加到Allid数据中for i := 0; i < 10; i++ {//AllId = append(AllId, receive.Data.List[i].Id)if len(receive.Data.List) == i {return}AllId = append(AllId, receive.Data.List[i].Id)}}