/// <summary> /// 获取猎聘信息(简要信息) /// </summary> /// <param name="city"></param> /// <param name="key"></param> /// <param name="index"></param> /// <returns></returns> public async Task <List <JobInfo> > GetJobsByLP(string city, string key, string index) { var cityCode = CodesData.GetCityCode(RecruitEnum.猎聘网, city); string url = string.Format("http://www.liepin.com/zhaopin/?key={0}&dqs={1}&curPage={2}", key, cityCode, index); using (HttpClient http = new HttpClient()) { var htmlString = await http.GetStringAsync(url); HtmlParser htmlParser = new HtmlParser(); var jobInfos = htmlParser.Parse(htmlString) .QuerySelectorAll("ul.sojob-list li") .Where(t => t.QuerySelectorAll(".job-info h3 a").FirstOrDefault() != null) .Select(t => new JobInfo() { PositionName = t.QuerySelectorAll(".job-info h3 a").FirstOrDefault().TextContent, CorporateName = t.QuerySelectorAll(".company-name a").FirstOrDefault().TextContent, Salary = t.QuerySelectorAll(".text-warning").FirstOrDefault().TextContent, WorkingPlace = t.QuerySelectorAll(".area").FirstOrDefault().TextContent, ReleaseDate = t.QuerySelectorAll(".time-info time").FirstOrDefault().TextContent, DetailsUrl = t.QuerySelectorAll(".job-info h3 a").FirstOrDefault().Attributes.FirstOrDefault(f => f.Name == "href").Value, }) .ToList(); return(jobInfos); } }
/// <summary> /// BOSS直聘信息(简要信息) /// </summary> /// <param name="city"></param> /// <param name="key"></param> /// <param name="index"></param> /// <returns></returns> public async Task <List <JobInfo> > GetJobsByBS(string city, string key, string index) { var cityCode = CodesData.GetCityCode(RecruitEnum.BOSS, city); string url = string.Format("http://www.zhipin.com/c{0}/h_{0}/?query={1}&page={2}", cityCode, key, index); using (HttpClient http = new HttpClient()) { var htmlString = await http.GetStringAsync(url); HtmlParser htmlParser = new HtmlParser(); var jobInfos = htmlParser.Parse(htmlString) .QuerySelectorAll(".job-list ul li") .Where(t => t.QuerySelectorAll(".info-primary h3").FirstOrDefault() != null) .Select(t => new JobInfo() { PositionName = t.QuerySelectorAll(".info-primary h3").FirstOrDefault().TextContent, CorporateName = t.QuerySelectorAll(".company-text h3").FirstOrDefault().TextContent, Salary = t.QuerySelectorAll(".info-primary h3 .red").FirstOrDefault().TextContent, WorkingPlace = t.QuerySelectorAll(".info-primary p").FirstOrDefault().TextContent, ReleaseDate = t.QuerySelectorAll(".job-time .time").FirstOrDefault().TextContent, DetailsUrl = "http://www.zhipin.com" + t.QuerySelectorAll("a").FirstOrDefault().Attributes.FirstOrDefault(f => f.Name == "href").Value, }) .ToList(); return(jobInfos); } }
/// <summary> /// 获取智联信息(简要信息) /// </summary> /// <param name="city"></param> /// <param name="key"></param> /// <param name="index"></param> /// <returns></returns> public async Task <List <JobInfo> > GetJobsByZL(string city, string key, string index) { var cityCode = CodesData.GetCityCode(RecruitEnum.智联招聘, city); string url = string.Format("http://sou.zhaopin.com/jobs/searchresult.ashx?jl={0}&kw={1}&p={2}", cityCode, key, index); using (HttpClient http = new HttpClient()) { var htmlString = await http.GetStringAsync(url); HtmlParser htmlParser = new HtmlParser(); var jobInfos = htmlParser.Parse(htmlString) .QuerySelectorAll(".newlist_list_content table") .Where(t => t.QuerySelectorAll(".zwmc a").FirstOrDefault() != null) .Select(t => new JobInfo() { PositionName = t.QuerySelectorAll(".zwmc a").FirstOrDefault().TextContent, CorporateName = t.QuerySelectorAll(".gsmc a").FirstOrDefault().TextContent, Salary = t.QuerySelectorAll(".zwyx").FirstOrDefault().TextContent, WorkingPlace = t.QuerySelectorAll(".gzdd").FirstOrDefault().TextContent, ReleaseDate = t.QuerySelectorAll(".gxsj span").FirstOrDefault().TextContent, DetailsUrl = t.QuerySelectorAll(".zwmc a").FirstOrDefault().Attributes.FirstOrDefault(f => f.Name == "href").Value, }) .ToList(); return(jobInfos); } }
/// <summary> /// 获取前程信息(简要信息) /// </summary> /// <param name="city"></param> /// <param name="key"></param> /// <param name="index"></param> /// <returns></returns> public async Task <List <JobInfo> > GetJobsByQC(string city, string key, string index) { var cityCode = CodesData.GetCityCode(RecruitEnum.前程无忧, city); string url = string.Format("http://search.51job.com/jobsearch/search_result.php?jobarea={0}&keyword={1}&curr_page={2}", cityCode, key, index); using (HttpClient http = new HttpClient()) { var htmlBytes = await http.GetByteArrayAsync(url); //【注意】使用GBK需要 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//注册编码提供程序 var htmlString = Encoding.GetEncoding("GBK").GetString(htmlBytes); HtmlParser htmlParser = new HtmlParser(); var jobInfos = (await htmlParser.ParseAsync(htmlString)) .QuerySelectorAll(".dw_table div.el") .Where(t => t.QuerySelectorAll(".t1 span a").FirstOrDefault() != null) .Select(t => new JobInfo() { PositionName = t.QuerySelectorAll(".t1 span a").FirstOrDefault().TextContent, CorporateName = t.QuerySelectorAll(".t2 a").FirstOrDefault().TextContent, Salary = t.QuerySelectorAll(".t3").FirstOrDefault().TextContent, WorkingPlace = t.QuerySelectorAll(".t4").FirstOrDefault().TextContent, ReleaseDate = t.QuerySelectorAll(".t5").FirstOrDefault().TextContent, DetailsUrl = t.QuerySelectorAll(".t1 span a").FirstOrDefault().Attributes.FirstOrDefault(f => f.Name == "href").Value, }) .ToList(); return(jobInfos); } }
public async Task <BossTokenParamDto> GetBossTokenParamAsync(string city, string key, int index) { var cityCode = CodesData.GetCityCode(RecruitEnum.BOSS, city); var url = $"https://www.zhipin.com/c{cityCode}/?query={key}&page={index}&ka=page-{index}"; var handler = new HttpClientHandler { AllowAutoRedirect = true, UseCookies = true }; using var client = new HttpClient(handler); var httpResponseMessage = await client.GetAsync(url); var requestUri = httpResponseMessage.RequestMessage.RequestUri; var nameValueCollection = System.Web.HttpUtility.ParseQueryString(requestUri.Query); var seed = nameValueCollection.Get("seed"); var ts = nameValueCollection.Get("ts"); var fileName = nameValueCollection.Get("name"); var filePath = requestUri.AbsoluteUri.Split("?")[0].Replace("security-check.html", $"security-js/{fileName}.js"); return(new BossTokenParamDto { Seed = seed, Ts = ts, FileName = fileName, FilePath = filePath }); }
/// <summary> /// 获取猎聘信息(简要信息) /// </summary> /// <param name="city"></param> /// <param name="key"></param> /// <param name="index"></param> /// <returns></returns> public async Task <List <JobInfo> > GetJobsByLP(string city, string key, int index) { var cache = GetCacheObject(); var data = cache.GetData(); if (data != null) { return(data); } var cityCode = CodesData.GetCityCode(RecruitEnum.猎聘网, city); var url = $"https://www.liepin.com/zhaopin/?key={key}&dqs={cityCode}&curPage={index}"; using var http = new HttpClient(); var htmlString = await http.GetStringAsync(url); var htmlParser = new HtmlParser(); var document = await htmlParser.ParseDocumentAsync(htmlString); var jobInfos = document.QuerySelectorAll("ul.sojob-list li") .Where(t => t.QuerySelectorAll(".job-info h3 a").FirstOrDefault() != null) .Select(t => new JobInfo() { PositionName = t.QuerySelectorAll(".job-info h3 a").FirstOrDefault().TextContent, CorporateName = t.QuerySelectorAll(".company-name a").FirstOrDefault().TextContent, Salary = t.QuerySelectorAll(".text-warning").FirstOrDefault().TextContent, WorkingPlace = t.QuerySelectorAll(".area").FirstOrDefault().TextContent, ReleaseDate = t.QuerySelectorAll(".time-info time").FirstOrDefault().TextContent, DetailsUrl = t.QuerySelectorAll(".job-info h3 a").FirstOrDefault().Attributes.FirstOrDefault(f => f.Name == "href").Value, }) .ToList(); cache.AddData(jobInfos); return(jobInfos); }
/// <summary> /// BOSS直聘信息(简要信息) /// </summary> /// <param name="city"></param> /// <param name="key"></param> /// <param name="index"></param> /// <param name="token"></param> /// <returns></returns> public async Task <List <JobInfo> > GetJobsByBS(string city, string key, int index, string token) { if (index <= 0) { index = 1; } var cache = GetCacheObject(20); var data = cache.GetData(); if (data != null) { return(data); } var cityCode = CodesData.GetCityCode(RecruitEnum.BOSS, city); var url = $"https://www.zhipin.com/c{cityCode}/?query={key}&page={index}&ka=page-{index}"; using var client = new HttpClient(); var cookie = $"__zp_stoken__={token}"; client.DefaultRequestHeaders.Add("Cookie", cookie); var htmlString = await client.GetStringAsync(url); var htmlParser = new HtmlParser(); var document = await htmlParser.ParseDocumentAsync(htmlString); var jobInfos = document.QuerySelectorAll(".job-list ul li") .Where(t => t.QuerySelectorAll(".info-primary h3").FirstOrDefault() != null) .Select(t => new JobInfo() { PositionName = t.QuerySelectorAll(".info-primary h3").FirstOrDefault().TextContent, CorporateName = t.QuerySelectorAll(".company-text h3").FirstOrDefault().TextContent, Salary = t.QuerySelectorAll(".info-primary h3 .red").FirstOrDefault().TextContent, WorkingPlace = t.QuerySelectorAll(".info-primary p").FirstOrDefault().TextContent, ReleaseDate = t.QuerySelectorAll(".job-time .time").FirstOrDefault().TextContent, DetailsUrl = "http://www.zhipin.com" + t.QuerySelectorAll("a").FirstOrDefault().Attributes.FirstOrDefault(f => f.Name == "href").Value, }) .ToList(); cache.AddData(jobInfos);//添加缓存 return(jobInfos); }
/// <summary> /// 获取智联信息(简要信息) /// </summary> /// <param name="city"></param> /// <param name="key"></param> /// <param name="index"></param> /// <returns></returns> public async Task <List <JobInfo> > GetJobsByZhiL(string city, string key, int index) { var cache = GetCacheObject(); var data = cache.GetData(); if (data != null) { return(data); } var cityCode = CodesData.GetCityCode(RecruitEnum.智联招聘, city); const int pageSize = 90; var start = (index - 1) * pageSize; const string url = "https://fe-api.zhaopin.com/c/i/sou?"; var handler = new HttpClientHandler { AllowAutoRedirect = false, UseCookies = false, }; var value = new { start, pageSize, cityId = cityCode, salary = "0,0", workExperience = -1, education = -1, companyType = -1, employmentType = -1, jobWelfareTag = -1, sortType = "publish", kw = key, kt = 3 }; using var http = new HttpClient(handler); http.DefaultRequestHeaders.Add("origin", "https://sou.zhaopin.com"); http.DefaultRequestHeaders.Add("referer", $"https://sou.zhaopin.com/?jl={cityCode}&kw={key}&kt=3"); http.DefaultRequestHeaders.Add("sec-fetch-dest", "empty"); http.DefaultRequestHeaders.Add("sec-fetch-mode", "cors"); http.DefaultRequestHeaders.Add("sec-fetch-site", "same-site"); var formatter = new JsonMediaTypeFormatter(); var mediaType = MediaTypeConstants.ApplicationJsonMediaType; var content = await formatter.SerializeAsync(value); var responseMessage = await http.PostAsync(url, content, formatter, mediaType, CancellationToken.None); responseMessage.EnsureSuccessStatusCode(); var htmlString = await responseMessage.Content.ReadAsStringAsync(); var zlResponse = JsonConvert.DeserializeObject <ZlResponse <ZlSouResponse> >(htmlString); var jobInfos = zlResponse?.Data?.Results?.Select(t => new JobInfo { PositionName = t.JobName, CorporateName = t.Company.Name, Salary = t.Salary, WorkingPlace = $"{t.City.Display}{(string.IsNullOrEmpty(t.BusinessArea) ? string.Empty : "-" + t.BusinessArea)}", ReleaseDate = t.UpdateDate, DetailsUrl = t.PositionURL, }).ToList(); cache.AddData(jobInfos); return(jobInfos); }