python使用bs4爬取boss直聘静态页面
思路:
1、将需要查询城市列表,通过城市接口转换成相应的code码
2、遍历城市、职位生成url
3、通过url获取列表页面信息,遍历列表页面信息
4、再根据列表页面信息的job_link获取详情页面信息,将需要的信息以字典data的形式存在列表datas里
5、判断列表页面是否有下一页,重复步骤3、4;同时将列表datas一直传递下去
6、一个城市、职位url爬取完后,将列表datas接在列表datas_list后面,重复3、4、5
7、最后将列表datas_list的数据,遍历写在Excel里面
知识点:
1、将response内容以json形式输出,解析json并取值
2、soup的select()和find_all()和find()方法使用
3、异常Exception的使用
4、wldt创建编辑Excel的使用
importrequests,time,xlwt frombs4importBeautifulSoup classMyJob(): def__init__(self,mycity,myquery): self.city=mycity self.query=myquery self.list_url="https://www.zhipin.com/job_detail/?query=%s&city=%s&industry=&position="%(self.query,self.city) self.datas=[] self.header={ 'authority':'www.zhipin.com', 'method':'GET', 'scheme':'https', 'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'accept-encoding':'gzip,deflate,br', 'accept-language':'zh-CN,zh;q=0.9', 'cache-control':'max-age=0', 'cookie':'lastCity=101210100;uab_collina=154408714637849548916323;toUrl=/;c=1558272251;g=-;l=l=%2Fwww.zhipin.com%2Fuser%2Flogin.html&r=;Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1555852331,1556985726,1558169427,1558272251;__a=40505844.1544087205.1558169426.1558272251.41.14.4.31;Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1558272385', 'referer':'https://www.zhipin.com/?ka=header-logo', 'upgrade-insecure-requests':'1', 'user-agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/70.0.3538.110Safari/537.36' } #将城市转化为code码 defget_city(self,city_list): city_url="https://www.zhipin.com/wapi/zpCommon/data/city.json"#获取城市 json=requests.get(city_url).json() zpData=json["zpData"]["cityList"] list=[] forcityincity_list: fordata_sfinzpData: fordata_dqindata_sf["subLevelModelList"]: ifcity==data_dq["name"]: list.append(data_dq["code"]) returnlist #获取所有页内容 defget_job_list(self,url,datas): print(url) html=requests.get(url,headers=self.header).text soup=BeautifulSoup(html,'html.parser') jobs=soup.select(".job-primary") forjobinjobs: data={} #招聘id data["job_id"]=job.find_all("div",attrs={"class":"info-primary"})[0].find("a").get("data-jobid") #招聘链接 data["job_link"]="https://www.zhipin.com"+job.find_all("div",attrs={"class":"info-primary"})[0].find("a").get("href") #招聘岗位 data["job_name"]=job.find_all("div",attrs={"class":"info-primary"})[0].find("div",attrs={"class":"job-title"}).get_text() #薪资 data["job_red"]=job.find_all("div",attrs={"class":"info-primary"})[0].find("span",attrs={"class":"red"}).get_text() #地址#工作年限#学历 data["job_address"]=job.find_all("div",attrs={"class":"info-primary"})[0].find("p").get_text().split("") #企业链接 data["job_company_link"]=job.find_all("div",attrs={"class":"info-company"})[0].find("a").get("href") #企业信息 data["job_company"]=job.find_all("div",attrs={"class":"info-company"})[0].find("p").get_text().split("") #boss链接 data["job_publis_link"]=job.find_all("div",attrs={"class":"info-publis"})[0].find("img").get("src") #boos信息 data["job_publis"]=job.find_all("div",attrs={"class":"info-publis"})[0].find("h3").get_text().split("") time.sleep(5) self.get_job_detail(data)#获取job详情页内容 print(data) datas.append(data)#将某条job添加到datas中,直到将当前页添加完 try: next_url=soup.find("div",attrs={"class":"page"}).find("a",attrs={"class":"next"}).get("href") #ifnext_url[-1]=="3":#第二页自动抛异常 ifnext_urlin"javascript:;":#最后一页自动抛异常 raiseException() exceptExceptionase: print("最后一页了;%s"%e) returndatas#返回所有页内容 else: time.sleep(5) next_url="https://www.zhipin.com"+next_url self.get_job_list(next_url,datas) returndatas#返回所有页内容 #获取详情页内容 defget_job_detail(self,data): print(data["job_link"]) html=requests.get(data["job_link"],headers=self.header).text soup=BeautifulSoup(html,'html.parser') #招聘公司 data["detail_content_name"]=soup.find_all("div",attrs={"class":"detail-content"})[0].find("div",attrs={"class":"name"}).get_text() #福利 data["detail_primary_tags"]=soup.find_all("div",attrs={"class":"info-primary"})[0].find("div",attrs={"class":"job-tags"}).get_text().strip() #招聘岗位 data["detail_primary_name"]=soup.find_all("div",attrs={"class":"info-primary"})[0].find("h1").get_text() #招聘状态 data["detail_primary_status"]=soup.find_all("div",attrs={"class":"info-primary"})[0].find("div",attrs={"class":"job-status"}).get_text() #薪资 data["detail_primary_salary"]=soup.find_all("div",attrs={"class":"info-primary"})[0].find("span",attrs={"class":"salary"}).get_text() #地址#工作年限#学历 data["detail_primary_address"]=soup.find_all("div",attrs={"class":"info-primary"})[0].find("p").get_text() #工作地址 data["detail_content_address"]=soup.find_all("div",attrs={"class":"detail-content"})[0].find("div",attrs={"class":"location-address"}).get_text() #职位描述 data["detail_content_text"]=soup.find_all("div",attrs={"class":"detail-content"})[0].find("div",attrs={"class":"text"}).get_text().strip().replace(";","\n") #boss名字 data["detail_op_name"]=soup.find_all("div",attrs={"class":"detail-op"})[1].find("h2",attrs={"class":"name"}).get_text() #boss职位 data["detail_op_job"]=soup.find_all("div",attrs={"class":"detail-op"})[1].find("p",attrs={"class":"gray"}).get_text().split("·")[0] #boss状态 data["detail_op_status"]=soup.find_all("div",attrs={"class":"detail-op"})[1].find("p",attrs={"class":"gray"}).get_text().split("·")[1] #将获取的数据写入Excel defsetExcel(self,datas_list): book=xlwt.Workbook(encoding='utf-8') table=book.add_sheet("boss软件测试") table.write(0,0,"编号") table.write(0,1,"招聘链接") table.write(0,2,"招聘岗位") table.write(0,3,"薪资") table.write(0,4,"地址") table.write(0,5,"企业链接") table.write(0,6,"企业信息") table.write(0,7,"boss链接") table.write(0,8,"boss信息") table.write(0,9,"detail详情") i=1 fordataindatas_list: table.write(i,0,data["job_id"]) table.write(i,1,data["job_link"]) table.write(i,2,data["job_name"]) table.write(i,3,data["job_red"]) table.write(i,4,data["job_address"]) table.write(i,5,data["job_company_link"]) table.write(i,6,data["job_company"]) table.write(i,7,data["job_publis_link"]) table.write(i,8,data["job_publis"]) table.write(i,10,data["detail_content_name"]) table.write(i,11,data["detail_primary_name"]) table.write(i,12,data["detail_primary_status"]) table.write(i,13,data["detail_primary_salary"]) table.write(i,14,data["detail_primary_address"]) table.write(i,15,data["detail_content_text"]) table.write(i,16,data["detail_op_name"]) table.write(i,17,data["detail_op_job"]) table.write(i,18,data["detail_op_status"]) table.write(i,19,data["detail_primary_tags"]) table.write(i,20,data["detail_content_address"]) i+=1 book.save(r'C:\%s_boss软件测试.xls'%time.strftime('%Y%m%d%H%M%S')) print("Excel保存成功") if__name__=='__main__': city_list=MyJob("","").get_city(["杭州"]) query_list=["软件测试","测试工程师"] datas_list=[] forcityincity_list: forqueryinquery_list: myjob=MyJob(city,query) datas=myjob.get_job_list(myjob.list_url,myjob.datas) datas_list.extend(datas) myjob.setExcel(datas_list)
以上就是python使用bs4爬取boss直聘静态页面的详细内容,更多关于python爬取boss直聘的资料请关注毛票票其它相关文章!