以下内容为实现在招聘网站爬取某个岗位的招聘信息,使用requests方式获取信息。首先导入需要用到的包
import csv import json from queue import Queue from re import findall import requests from threadPool import ThreadPool, makeRequests定义一个获取网页信息的函数,headers中需要修改User-Agent的信息,模拟用户登陆。如果返回的状态码是200,说明获取页面成功,再调用analysis_data函数提取想要的信息。
def get_net_data(url): headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36' } response = requests.get(url, headers=headers) if response.status_code == 200: # print(response.text) analysis_data(response.text)定义analysis_data函数,由于使用了多线程爬取数据,而线程不会返回数据,所以使用Queue对象创建一个队列存放数据。从上个函数的print(response.text)语句可以发现我们想要的数据在一个json数据格式中。 使用正则表达式将那部分数据取出来,再使用列表切片将其转变成字符串格式,然后将json格式的数据转换成python格式的数据。 逐个遍历job列表,提取每个岗位的公司名字等等,存放到q对象中。
q = Queue() def analysis_data(data): global q re_str = r'"engine_search_result":(.+?),"jobid_count"' all_job_str = findall(re_str, data)[0] all_job = json.loads(all_job_str) for job in all_job: job_list = [job['company_name'], job['job_name'], job['providesalary_text'], job['attribute_text'], job['issuedate'], job['companysize_text']] q.put(job_list)然后定义一个函数write_data将我们需要的数据保存到csv文件中。
def write_data(): with open('file/java招聘.csv', 'w')as f: writer = csv.writer(f) writer.writerow(['公司', '岗位', '薪资', '要求', '发布时间', '公司规模']) while True: job = q.get() if job == 'end': break writer.writerow(job)最后,调用刚才写的函数。创建一个数量为10的线程池,爬取10个页面,使用列表生成式生成页面地址。当所有页面都爬取完成的时候,队列中添加‘end’作为结束标志。
if __name__ == '__main__': pool = ThreadPool(10) params = [ f'https://search.51job.com/list/090200,000000,0000,00,9,99,java,2,{x}.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=' for x in range(1, 11)] tasks = makeRequests(get_net_data, params) for task in tasks: pool.putRequest(task) pool.wait() q.put('end') write_data()看一下爬取的结果吧!参考结果