python 爬取字节内推招聘信息
今天收到一个任务,用 python 爬取招聘网站信息。招聘网址是这个:https://job.toutiao.com/s/JNcJSRo。打开之后自动跳转到了这里:https://job.bytedance.com/referral/pc/position?token=MzsxNTk0NDQzMDMxOTkzOzY3NzE1NjI2MDc2ODMyNTc4Njk7MA。
常规操作,先审查元素。每一个职位的 title 和职位描述是相同的 class,如果可以得到页面静态内容,就可以把招聘信息保存下来了。
import requests url = "https://job.bytedance.com/referral/pc/position?token=MzsxNTk0NDQzMDMxOTkzOzY3NzE1NjI2MDc2ODMyNTc4Njk7MA" headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'} resp = requests.get(url,headers=headers) print(resp.text)
打印的文本没有发现什么有用信息,很明显,这里的数据都是另外通过 POST 请求获取的。监听一下网络请求,发现了数据来源。
既然可以完整的看到需要的数据,模拟一个一样的请求不就可以了吗。分析后调整代码。
1 import requests 2 import json 3 4 def getJobData(): 5 url = "https://job.bytedance.com/api/v1/search/job/posts?keyword=&limit=10&offset=0&job_category_id_list=&location_code_list=&subject_id_list=&recruitment_id_list=&portal_type=1&portal_entrance=1&_signature=7ZAzMgAgEAgBrEgAxo1ege2QMyAALLC" 6 headers = { 7 'accept':'application/json, text/plain, */*', 8 'accept-encoding':'gzip, deflate, br', 9 'accept-language':'zh-CN', 10 'content-type':'application/json', 11 'cookie':'referral-token=MzsxNTk0NDQzMDMxOTkzOzY3NzE1NjI2MDc2ODMyNTc4Njk7MA; channel=referral; platform=pc; s_v_web_id=kddyb7ab_IRgnUvNC_fthm_45Io_9aFj_nBUcCkZP3U3c; device-id=6856593760391792135; TS01ab245c=015df6ccf27d7fed70cc0134a66cf6caed02d10578dff54bbbb38f2bec5d8d76af64ca121c34e7472fe6ab288bce53c5044a27abf2; SLARDAR_WEB_ID=bb0ff545-72f9-440a-9574-4ea5ae7bb74e; TS0170d300=015df6ccf28055e45208edcc51b025a5ed540a12f025e46e1d8699ecb874d4d16d0dfa4aefe40f75beea5c836bda606eb3839ed21b; atsx-csrf-token=9xQgHaOg5kY17BZGoxQXuM0_B9rT9S17F4ya-z6hxD4%3D', 12 'env':'undefined', 13 'origin':'https://job.bytedance.com', 14 'portal-channel':'referral', 15 'portal-platform':'pc', 16 'referer':'https://job.bytedance.com/referral/pc/position?token=MzsxNTk0NDQzMDMxOTkzOzY3NzE1NjI2MDc2ODMyNTc4Njk7MA', 17 'sec-fetch-dest':'empty', 18 'sec-fetch-mode':'cors', 19 'sec-fetch-site':'same-origin', 20 'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36', 21 'website-path':'referral', 22 'x-csrf-token':'9xQgHaOg5kY17BZGoxQXuM0_B9rT9S17F4ya-z6hxD4=' 23 } 24 data={ 25 'keyword':'', 26 'limit':10000, 27 'offset':0, 28 'job_category_id_list':[], 29 'location_code_list':[], 30 'subject_id_list':[], 31 'recruitment_id_list':[], 32 'portal_type':1, 33 'portal_entrance':1, 34 '_signature':'7ZAzMgAgEAgBrEgAxo1ege2QMyAALLC' 35 } 36 param = json.dumps(data) 37 resp = requests.post(url=url,data=param,headers=headers) 38 # 知道为啥打印这个 status 吗? 39 print(resp.status_code) 40 job_data = resp.json() 41 job_list = job_data["data"]["job_post_list"] 42 return job_list 43 44 def saveFile(): 45 fi = open('job.bytedance.data.txt','r+',encoding='utf-8') 46 jobs = getJobData() 47 print("共有职位:" + str(len(jobs)) + " 个") 48 for i in range(len(jobs)): 49 city = jobs[i]["city_info"]["name"] 50 title = jobs[i]["title"] 51 desc = jobs[i]["description"] 52 requirement = jobs[i]["requirement"] 53 fi.write(city + "-" + title + "\n【职位描述】\n" + desc + "\n【职位要求】\n" + requirement + "\n\n") 54 55 saveFile()
保存下来的文件有10.5Mb,网页上有1000个分页,每页10条信息,所以直接将请求参数 limit 改成了10000。
10000个职位,我的天!
然而没有一个职位属于我。
?
??
???
继续失业吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?