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

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

[Golang] 爬虫实战-获取动态页面数据-获取校招信息_第1张图片

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

文章目录

  • 页面数据分析
  • 爬取动态页面
    • 判断类型
    • 抓包模拟请求头

页面数据分析

常见的页面分为:静态页面和动态页面
如何判断是什么类型的页面呢? 通过查看页面的源代码,如果和你通过f12查看的页面元素一致,那么就说明是静态页面。
如果是静态页面的话, 可以通过直接获取网页链接,然后根据自己想要的标签然后获取对应的数据,这一类比较简单一点。
什么情况下是动态抓取? 如果查看源代码之后,发现元素的组成和通过f12不一致,并且由很多ajax或者js或者css构成,那么就不能直接通过拿链接去获取对应的数据,因为这样我们无法获得所有想要的数据,只会获得一部分。
那我们应该怎样去做呢??

爬取动态页面

爬取动态页面的最常见的方法就是:通过抓包,获取对应的ajax文件,通过查看自己想要的json数据位置,锁定对应的文件,然后模拟请求头抓取,下面以抓取某站的校招信息为例子:

判断类型

查看源代码: 判断出如果直接抓取不会拿到数据
[Golang] 爬虫实战-获取动态页面数据-获取校招信息_第2张图片
所以需要动态抓取

抓包模拟请求头

步骤一:

[Golang] 爬虫实战-获取动态页面数据-获取校招信息_第3张图片
步骤二:

[Golang] 爬虫实战-获取动态页面数据-获取校招信息_第4张图片
步骤三:

[Golang] 爬虫实战-获取动态页面数据-获取校招信息_第5张图片

具体代码实现:
这一块几乎涵盖了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)
	}
}

你可能感兴趣的:(Go实战,爬虫,golang,ajax,go)