[Golang] 爬虫实战-获取动态页面数据-获取校招信息

411 阅读3分钟

😚一个不甘平凡的普通人,致力于为Golang社区和算法学习做出贡献,期待您的关注和认可,陪您一起学习打卡!!!😘😘😘 🤗专栏:算法学习 🤗专栏:Go实战 💬个人主页:个人主页

请添加图片描述

跟着我一起来学习go爬虫吧!!! 文章介绍:爬取网站的招聘信息 方法:使用go自带的http包中的方法去爬取相应的数据 希望对您有所帮助,您的一键三连是我更新的动力!!!十分感谢 @TOC

页面数据分析

常见的页面分为:静态页面和动态页面 如何判断是什么类型的页面呢? 通过查看页面的源代码,如果和你通过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?type=0&page=2")
	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)
	}
}