python获取无忧网的招聘数据

工作前的闲聊

又到了家里催找工作的时候

我的天,就想窝在家多钻研一下程序都不行的

然后,爬爬51job的招聘信息吧,主要是不想自己一页页去翻,怪麻烦的

作为一个恋家的人,而且自己有台车子不开怪可惜的,鉴于广州限行,就暂不考虑,有需要再看看吧

:以下内容在作者这边的请求头中是有cookie值的,但大家如果需要用的话,就请使用自己的cookie值吧,代码中就不贴上去了


接口分析

搜索关键字:"python"

工作地区: "江门" + "中山" + "珠海" + "佛山"

https://search.51job.com/list/031500%252C030700%252C030500%252C030600,000000,0000,00,9,99,python,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=

网址是这么一串东西,

不难看出:

031500就是江门, 030700就是中山, 030500就是珠海, 030600就是佛山

%252C是他们中间的连接符

然后还有后面的python , 以及.html?前的那个数字是页数

剩下那些参数其实都不太需要,但还是留着吧

页面爬取

接口基本分析完,先把网页文本拔下来看看长啥样

import requests

url = r"https://search.51job.com/list/031500%252C030700%252C030500%252C030600,000000,0000,00,9,99,python,2,1.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}

resp = requests.get(url, headers=headers)

with open("51job.html", "w", encoding="utf-8") as f:
    f.write(resp.content.decode(resp.encoding))

保存到的html文件点开看看,然后发现,很多是乱码,主要还是因为这个response.encoding不太给力,不过没关系,拿到第一手网页代码,可以到head标签中的meta标签中查找charset属性,这里找到是gbk,然后把response.encoding改成"gbk"即可

修改之后再运行一次,走你 !

这就可以了,然后看看拿到的页面有没有我们需要的内容

页面分析

在网页审查元素可以看到我们想要的是id为resultList的div下的类属性为el的div

 

 

 

在我们保存的网页代码中查找关键字,可以看到我们需要的信息是存在的

信息等的都十分齐全

解析与提取页面数据

接下来就是解析,用的是xpath , 初步解析,要求先是取到以下内容

div下的p标签下的span标签下的a标签的href值和文本内容,"职位名称"(a标签里的href链接方便后续爬取职位详情)

div下的class=t2的span标签的文本内容,"所属公司"

div下的class=t3的span标签的文本内容,"上班地点"

div下的class=t4的span标签的文本内容,"工资待遇"

div下的class=t5的span标签的文本内容,"发布时间"

from lxml import etree
content = resp.content.decode("gbk")

tree = etree.HTML(content)

div_list = tree.xpath('//div[@id="resultList"]/div[@class="el"]')

for div in div_list:
    try:
        position = div.xpath('./p/span/a/text()')[0].strip()
        href = div.xpath('./p/span/a/@href')[0].strip()
        company = div.xpath('./span[@class="t2"]/a/text()')[0].strip()
        city = div.xpath('./span[@class="t3"]/text()')[0].strip()
        treatment = div.xpath('./span[@class="t4"]/text()')[0].strip()
        publish_time = div.xpath('./span[@class="t5"]/text()')[0].strip()
    except:
        continue

数据的保存

还有什么格式的文档比类excel文档看起来舒服的呢,所以这里采用numpy模块对数据进行处理并保存到本地

import numpy as np

# 这是在for循环之前的
arr = np.array(["职位", "链接", "公司", "城市", "待遇", "发布时间"])

# 这是在for循环里取得数据之后的(try结构外)
    arr_tmp = np.array([position, href, company, city, treatment, publish_time])
    arr = np.vstack((arr, arr_tmp))

# 这是在for循环之后的
np.savetxt("work.csv", arr, fmt="%s", delimiter=",")

这是后就能看到目录下生成了以个csv文件

打开查看,正是我们想要的内容

接下来可以大量地获取了

正式爬取数据

从网页可以直观看到有10页的数据,所以直接用循环取获取即可

整体代码如下

import requests
from lxml import etree
import numpy as np


arr = np.array(["职位", "链接", "公司", "城市", "待遇", "发布时间"])

url_head = r"https://search.51job.com/list/031500%252C030700%252C030500%252C030600,000000,0000,00,9,99,python,2,"

url_tail = r".html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare="

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
for page in range(10):
    url = url_head + str(page + 1) + url_tail
    resp = requests.get(url, headers=headers)
    content = resp.content.decode("gbk")
    tree = etree.HTML(content)
    div_list = tree.xpath('//div[@id="resultList"]/div[@class="el"]')
    for div in div_list:
        try:
            position = div.xpath('./p/span/a/text()')[0].strip()
            href = div.xpath('./p/span/a/@href')[0].strip()
            company = div.xpath('./span[@class="t2"]/a/text()')[0].strip()
            city = div.xpath('./span[@class="t3"]/text()')[0].strip()
            treatment = div.xpath('./span[@class="t4"]/text()')[0].strip()
            publish_time = div.xpath('./span[@class="t5"]/text()')[0].strip()
        except:
            continue
        arr_tmp = np.array([position, href, company, city, treatment, publish_time])
        arr = np.vstack((arr, arr_tmp))

np.savetxt("work.csv", arr, fmt="%s", delimiter=",")

爬取完毕之后检查csv文件,正式我们想要的内容并且条数是基本接近的(有小部分取不到属正常情况)

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值