专栏首页灯塔大数据技术 | Python的从零开始系列连载(三十七)

技术 | Python的从零开始系列连载(三十七)

导读

为了解答大家学习Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载,每周五准时推出,欢迎大家学积极学习转载~

观察网站结构

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

看看最后一页搜索结果

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

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

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

可能藏在json文件里了

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

这下总算有了

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

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

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

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

开始写爬虫程序

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

没时间解释了,快上车!

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

#!/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=[]

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

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

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

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

果然一样!!!

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

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

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

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文件中

结果如下图

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

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

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

查找替换

报错了额

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

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

完整代码

#!/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

好啦,这期的分享先到这里,大家可以按照上面的详细步骤进行练习。加油,我们下周五不见不散~

文章来源:Python爱好者社区

文章编辑:思加

本文分享自微信公众号 - 灯塔大数据(DTbigdata)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《深度学习Ng》课程学习笔记01week2——神经网络基础

    http://write.blog.csdn.net/mdeditor#!postId=77852727

    用户1621453
  • TensorFlow实战——CNN(LeNet5)——MNIST数字识别

    本文地址: http://blog.csdn.net/u011239443/article/details/72861591

    用户1621453
  • 一篇文章教会你理解Scrapy网络爬虫框架的工作原理和数据采集过程

    Scrapy是一个使用Python编程语言编写的爬虫框架,任何人都可以根据自己的需求进行修改,并且使用起来非常的方便。它可以应用在数据采集、数据挖掘、网络异常用...

    Python进阶者
  • Windows下安装Scrapy方法及常见安装问题总结——Scrapy安装教程

    这几天,很多朋友在群里问Scrapy安装的问题,其实问题方面都差不多,今天小编给大家整理一下Scrapy的安装教程,希望日后其他的小伙伴在安装的时候不再六神无主...

    Python进阶者
  • 《neural network and deep learning》题解——ch03 如何选择神经网络的超参数

    http://blog.csdn.net/u011239443/article/details/77748116

    用户1621453
  • Windows下安装Scrapy方法及常见安装问题总结——Scrapy安装教程

    这几天,很多朋友在群里问Scrapy安装的问题,其实问题方面都差不多,今天小编给大家整理一下Scrapy的安装教程,希望日后其他的小伙伴在安装的时候不再六神无主...

    Python进阶者
  • 在windows下如何新建爬虫虚拟环境和进行scrapy安装

    Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy吸引人的地方在于它是一个框...

    Python进阶者
  • 《neural network and deep learning》题解——ch03 再看手写识别问题题解与源码分析

    http://blog.csdn.net/u011239443/article/details/77649026

    用户1621453
  • Python中给函数添加元信息

    我们写好一个自定义函数之后,要告诉其他人其他人怎么用这个函数,可以利用->为函数添加一些元信息,比如这个函数具体参数以及参数类型

    致Great
  • python基础知识——控制语句

    其中,raw_input()用于获取控制台的输入,由于raw_input()返回的是字符串,则在比较的时候必须使用int()转换,若是不想转换,可以直接使...

    zhaozhiyong

扫码关注云+社区

领取腾讯云代金券