Python网络爬虫爬取智联招聘职位

浏览: 9742

前言


这是我第一次写天善博客,梁勇大哥说,你应该把你平时做的东西用博客记录下来,以后也方便看,作为一名准备转行数据分析的小白,我先接触到的是网络爬虫学习,每次爬虫运行都有新的bug收获,通过不断debug,终于稍微能爬一些数据了,在此想和大家分享一下~


观察网站结构。

打开智联招聘网页,搜索数据分析师,出来很多招聘岗位,限定全国范围,从下图看出有12354个职位,一共有90页,看最后一页职位已经只是和数据分析师相关而已。

Clipboard Image.png


看看最后一页搜索结果


Clipboard Image.png

PS:小技巧,在页面下部跳转页面输入一个很大的数字,比如10000可以跳到最后一页。

右键查看网页源代码,CTRL+F搜索关键要爬取信息,如下图红框内容

Clipboard Image.png


Clipboard Image.png


页面红框上的 大数据分析师 字样竟然搜不到!!!



可能藏在json文件里了

那就再试试,搜一下 数据分析师


Clipboard Image.png

这下总算有了



为什么会这样呢,经过检查发现:


Clipboard Image.png


大和后面的数据分析中间有个<b>标签,这是什么意思,吓得我赶紧百度了一下


Clipboard Image.png

设置成粗体?exm?好吧 图上确实是显示粗体


Clipboard Image.png



继续观察源代码,发现我想要的信息都在这(下图红框),看来不用抓包分析辣~




Clipboard Image.png


开始写爬虫程序

打开我最爱的pycharm(直译为py的魅力)不信你百度看


Clipboard Image.png

没时间解释了,快上车!


好吧,你根本不是司机,开始写代码。。。


#!/usr/bin/python
# -*- coding: utf-8 -*-

from urllib import request
import re
import os,glob
import xlwt

开头声明一下我用的utf-8国际编码

导入一些模块

PS:

1.request模块主要是会自动解码来自服务器的内容

2.re模块是写正则表达式提取信息用

3.glob是一个文件操作相关模块,用它可以查找符合自己目的的文件,类似于Windows下的文件搜索

4.os模块提供了一个统一的操作系统接口函数

5.xlwt模块读写excel文件需要


book = xlwt.Workbook()
sheet = book.add_sheet('sheet', cell_overwrite_ok=True)
path = 'D:\\work'
os.chdir(path)

以上是设置路径和为最后数据写入excel文件做铺垫


result11=[]
result21=[]
result31=[]
result41=[]
result51=[]

建立五个空的列表放我要抓的最终信息


Clipboard Image.png



经尝试网站是gbk编码,我实际操作中发现和上图红框内中文有关,所以encode和decode总是报错,我想找个不含中文的同样网址,试试F12吧


在网页按下F12,刷新网页,观察到请求的url是下图红框中的


Clipboard Image.png


里面没有中文啊,复制出来访问看看。

果然一样!!!

注意到这个url最后有个p=1,这很可能是页码,我换成5试试吧


Clipboard Image.png

Clipboard Image.png


看上图,果然是这样,我试试最后第90页


Clipboard Image.png

Clipboard Image.png

果然是这样,接下来继续写代码

for k in range(1,91):
html=request.urlopen("http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%e5%85%a8%e5%9b%bd&kw=%e6%95%b0%e6%8d%ae%e5%88%86%e6%9e%90%e5%b8%88&sm=0&isfilter=0&fl=489&isadv=0&sg=aae5284f62664af8b14611bda6d68315&p="+str(k)).read() #读取网页源代码内容


pat1 = 'onclick="submitLog.*?">(.*?)</a>'
pat2 = '<td class="gsmc"><a href="https://ask.hellobi.com/(.*?)" target='
pat3 = '<td class="zwyx">(.*?)</td>'
pat4 = '<td class="gzdd">(.*?)</td>'
pat5 = 'target="_blank">(.*?)<'

result1 = re.compile(pat1).findall(str(html,"utf-8"))
result2 = re.compile(pat2).findall(str(html,"utf-8"))
result3 = re.compile(pat3).findall(str(html,"utf-8"))
result4 = re.compile(pat4).findall(str(html,"utf-8"))
result5 = re.compile(pat5).findall(str(html,"utf-8"))

result11.extend(result1)
result21.extend(result2)
result31.extend(result3)
result41.extend(result4)
result51.extend(result5)

range(1,91)循环爬取1~90页,p="+str(k)是为了构造循环网址(我要把90页全爬下来)

通过观察网页构造选择正则提取

每次提取一页中的所有信息不断循环存在result11~51的列表里

j = 0
for i in range(0,len(result11)):
try:
zhiwei = result11[i]
wangzhi = result21[i]
gongzi = result31[i]
gongzuodidian = result41[i]
gongsimingcheng = result51[i]

sheet.write(i + 1, j, zhiwei)
sheet.write(i + 1, j + 1, wangzhi)
sheet.write(i + 1, j + 2, gongzi)
sheet.write(i + 1, j + 3, gongzuodidian)
sheet.write(i + 1, j + 4, gongsimingcheng)

except Exception as e:
print('出现异常:' + str(e))
continue

book.save('d:\\shujufenxishi.xls')

最后把列表文件循环写到本地xls文件中

结果如下图

Clipboard Image.png

Clipboard Image.png


一共5221条数据,并不是网页搜索的12354条,这活生生被吃了一半不止啊!


Clipboard Image.png


我又运行了一下,果然数量不一样了,好吧。。。这个问题还有待解决,麻烦各位dalao懂的话留言提醒一下小弟


Clipboard Image.png


这个<b></b>标签看着难受,用excel做点后处理


Clipboard Image.png


查找替换


Clipboard Image.png


报错了额

原来我默认的是wps打开,换成office的excel打开之后操作结果如下


Clipboard Image.png


是不是好多了呢,有机会以后继续谢谢针对本数据后续的数据分析~

完整代码如下:


#!/usr/bin/python
# -*- coding: utf-8 -*-

from urllib import request
import re
import os,glob
import xlwt

book = xlwt.Workbook()
sheet = book.add_sheet('sheet', cell_overwrite_ok=True)
path = 'D:\\work'
os.chdir(path)
result11=[]
result21=[]
result31=[]
result41=[]
result51=[]

for k in range(1,91):
html=request.urlopen("http://sou.zhaopin.com/jobs/searchresult.ashx?jl=%e5%85%a8%e5%9b%bd&kw=%e6%95%b0%e6%8d%ae%e5%88%86%e6%9e%90%e5%b8%88&sm=0&isfilter=0&fl=489&isadv=0&sg=aae5284f62664af8b14611bda6d68315&p="+str(k)).read() #读取网页源代码内容


pat1 = 'onclick="submitLog.*?">(.*?)</a>'
pat2 = '<td class="gsmc"><a href="https://ask.hellobi.com/(.*?)" target='
pat3 = '<td class="zwyx">(.*?)</td>'
pat4 = '<td class="gzdd">(.*?)</td>'
pat5 = 'target="_blank">(.*?)<'
#pat6 = '<span>(.*?)</span>'
#pat7 = 'target="_blank">(.*?)</a>'

result1 = re.compile(pat1).findall(str(html,"utf-8"))
result2 = re.compile(pat2).findall(str(html,"utf-8"))
result3 = re.compile(pat3).findall(str(html,"utf-8"))
result4 = re.compile(pat4).findall(str(html,"utf-8"))
result5 = re.compile(pat5).findall(str(html,"utf-8"))
result11.extend(result1)
result21.extend(result2)
result31.extend(result3)
result41.extend(result4)
result51.extend(result5)


j = 0
for i in range(0,len(result11)):
try:
zhiwei = result11[i]
wangzhi = result21[i]
gongzi = result31[i]
gongzuodidian = result41[i]
gongsimingcheng = result51[i]

sheet.write(i + 1, j, zhiwei)
sheet.write(i + 1, j + 1, wangzhi)
sheet.write(i + 1, j + 2, gongzi)
sheet.write(i + 1, j + 3, gongzuodidian)
sheet.write(i + 1, j + 4, gongsimingcheng)

except Exception as e:
print('出现异常:' + str(e))
continue

book.save('d:\\shujufenxishi.xls')

代码运行大概15~20second


推荐 18
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

29 个评论

辛苦了,写的很不错。后面多多出精品
感谢大哥支持!一定更加努力!
整的很可以的!!加油
大伟,成功晋级老司机行列,求上车。
配图,满分
感谢高哥!
哈哈
对爬虫有兴趣可以多交流~
出现 出现异常:list index out of range 该怎么解决啊..
这一般是爬虫抓到的地方为空,所以数组循环之类的操作越界报错,建议你先打印抓到的东西
智联招聘上面是一页显示60条职位信息,所以爬90页应该是5400条信息,有时候爬出来可能只有5300+,不知道为什么,希望有dalao可以指点。我对比了一下爬出来的信息和网页上显示的顺序,发现有些是不一致的,这个也搞不懂
你好 请问你加了错误异常处理么 可能遇到错误就跳过了
怎么配的图,在哪里可以自己生成图片?
直接粘贴图片进来就好了
执行的时候报错了。不知道为啥。
年轻人,这样写代码不如函数式。
白的不能再白的小白了,有问题要问,pat1-5的地址是怎么来的?
看网页结构写出来的正则表达式
为什么我用你的代码有excel但是没有一条数据
找到问题了 正则表达式要改
加油
偶然之间在一个微信群里找到了你讲的课程连接,于是开始学习python
哈哈 共勉
按照你的步骤执行完了,出来了个空的excel,不知道哪里出了问题,求指点
是不是爬出来的html有问题呢,我打印html,出来的是这样的
b'<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r\n<html xmlns="//www.w3.org/1999/xhtml">\r\n<head>\r\n \r\n <title>\xe5\x85\xa8\xe5\x9b\xbd\xe6\x95\xb0\xe6\x8d\xae\xe5\x88\x86\xe6\x9e\x90\xe5\xb8\x88\xe6\x8b\x9b\xe8\x81\x98\xef\xbc\x88\xe6\xb1\x82\xe8\x81\x8c\xef\xbc\x89 \xe6\x95\xb0\xe6\x8d\xae\xe5\x88\x86\xe6\x9e\x90\xe5\xb8\x88\xe6\x8b\x9b\xe8\x81\x98\xef\xbc\x88\xe6\xb1\x82\xe8\x81\x8c\xef\xbc\x89\xe5\xb0\xbd\xe5\x9c\xa8\xe6\x99\xba\xe8\x81\x94\xe6\x8b\x9b\xe8\x81\x98</title>\r\n<META
使用decode解码一下
文章很久之前写的 网页结构可能改变了 需要重新定位
谢谢
很不错呀

要回复文章请先登录注册