又到了家里催找工作的时候
我的天,就想窝在家多钻研一下程序都不行的
然后,爬爬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°reefrom=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°reefrom=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°reefrom=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文件,正式我们想要的内容并且条数是基本接近的(有小部分取不到属正常情况)