以下内容为实现在招聘网站爬取某个岗位的招聘信息,使用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()
看一下爬取的结果吧!