python多线程爬取招聘网站信息

   日期:2020-09-06     浏览:130    评论:0    
核心提示:以下内容为实现在招聘网站爬取某个岗位的招聘信息,使用requests方式获取信息。首先导入需要用到的包import csvimport jsonfrom queue import Queuefrom re import findallimport requestsfrom threadPool import ThreadPool, makeRequests定义一个获取网页信息的函数,headers中需要修改User-Agent的信息,模拟用户登陆。如果返回的状态码是200,说明获取页面成

以下内容为实现在招聘网站爬取某个岗位的招聘信息,使用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&degreefrom=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()

看一下爬取的结果吧!

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服