python爬虫爬猎聘网获取多条职责描述中有Linux需求的招聘信息

时间:2024-10-06 07:50:12

python爬虫爬猎聘网获取多条职责描述中有Linux需求的招聘信息

下列是我爬虫的作业

摘 要

随着现代化社会的飞速发展,网络上巨大信息量的获取给用户带来了许多的麻烦。由于工作和生活节奏的需求,人们需要更加高效便捷地提取出自己想要的信息。网络信息的筛选和过滤便成为重要的一个环节,从而衍生出网络爬虫这一技术来为大家提高互联网信息获取的高效性和准确性。本文的目的在于研究和探索如何通过爬虫技术的应用让用户高效地获取到特定的信息。

Abstract

With the rapid development of modern society, the huge amount of information on the network has brought many troubles to users. Because of the need of work and life rhythm, people need to extract the information they want more efficiently and conveniently. Screening and filtering of network information has become an important link, which derives the technology of network crawler to improve the efficiency and accuracy of Internet information acquisition. The purpose of this paper is to study and explore how to make users get specific information efficiently through the application of crawler technology.

前言

随着互联网的高速发展,网络上的信息量迅速增加,特别是近些年来,网络信息呈爆发式增长。有时候我们访问网页时,网页上出现太多的不必要的信息,比如各种垃圾广告和植入信息。页面分析的爬虫技术就是基于此产生的,用来获取更有价值的信息。
在互联网的发展中,用户体验占据了至关重要的作用。正是由于每天都有巨大的信息量通过互联网传递给我们,所以我们要通过工具对其进行筛选,对于我们所需要的信息,则可以借助关键字来获取我们所想要的信息。
从上个世纪九十年代开始,人们就已经开展和研究网络爬虫。爬虫这项技术在现在已经非常成熟了,同时它也是搜索引擎的重要组成成分。Nutch,Larbin,Heritrix都是网络上很有名的开源爬虫。对于网络爬虫来说,网页搜索策略和网页分析策略都是很重要的部分。
本文就是研究如何从招聘网站上筛选爬取自己想要的信息并统计。

一、 选题目的和意义

之所以选择爬虫筛选特定信息这个课题。首先我觉得很有意思,通过对网页源码的分析可以加强我对网页设计的了解,也可以加深我对之前学过标签的记忆。其次是因为其实用性强,爬虫真的很强大,我可以爬很多我想了解的网站情况,通过数据分析一统计,结果一目了然。还可以定时监控网站,真的省时省力。
爬虫在我以后的生活工作中也可以经常被用到,我可以了解我想知道的商城商品价格库存信息,也可以了解行业的风向。还可以通过爬虫在多个网站注册投递简历,提高时间效率。总的来说,爬虫,让生活更美好!

二、 研究内容及要求

(一) 研究内容
用Python或Java或C/C++等编写网络爬虫,获取1000条有Linux系统需求的招聘信息。
(二) 课题要求

  1. 确定招聘网站及组织结构;
  2. 爬取职位介绍的url、职位名称、公司名称、城市、发布时间、职责描述等信息;
  3. 检索出==“职责描述”==中有“Linux”的招聘信息。

三、 系统分析

本爬虫系统较为简洁,只需完成对网站中特定信息的筛选即可。

四、 概要设计

网页爬虫要实现更加人性化,就要从指定的URL地址抓取到特定的页面内容,接着解析出页面中的链接地址,然后再去访问这些URL,重复进行,直到得到的结果满意。
根据需求,应需要实现以下几个基本功能模块:

  1. 数据请求模块:主要实现的是通过从URL管理传获取 URL,进行地址析,通过 HTTP 协议访问URL指定的页面,同时接收服务器端传送的页面信息。
  2. 数据解析模块:主要是实现提取页面内容,提取的内容有Css 脚本,图片,视频,文本,链接,Js,等其他文件。
  3. 异常容错模块:主要是防止在爬取信息过程中被异常信息打断。
  4. 筛选汇总模块:主要是实现将提取的有效信息汇总写入文件。

五、 详细设计

(一) 数据请求模块
数据请求的方式一般有两种:GET方法和POST方法。本案例采用get
利用Python构建数据请求的方式有很多,在python3中,主要有urllib和requests两个类库可以实现该功能。

urllib是官方标准库,我用的是第三方库requests,它是基于urllib编写的,比urllib用起来更加便捷,可以节约时间。

requests安装方法:
pip install requests
由于我同时安装了python2,3:python2又不能随便删所以我要用如下命令
python3 –m pip install requests

利用requests构建数据请求主要方式:
import requests
req = request.get(url)
或者
import requests
req = (url)
其中,get()与post()中都可以添加headers、params等参数,以字典的形式传递即可。一般来说,简单的网页通过传入url数据即可成功请求数据。不过一些网站采用了反爬虫机制,需要传入headers及params等参数,以模拟浏览器访问、用户登陆等行为,才可以正常请求数据。
使用免费代理实例:
import requests

根据协议类型,选择不同的代理
proxies = {
“http”: “http://12.34.56.79:9527”,
“https”: “http://12.34.56.79:9527”,
}
response = (“”, proxies = proxies)
print

用此链接查看浏览器请求头信息:
/detect/what-http-headers-is-my-browser-sending
有时一个请求头太少了,可以借用伪装头技术。自己可以写模块,也可以导入fake-useragent库。
不过对我的程序影响不大,还影响性能,所以我没用。

由于我这次是爬猎聘网,我先得了解他们链接之间的关系才能连续爬多个页面
我将缩小范围从计算机软件类中进行筛选
范围筛选
分析各链接去除缀码:
第一页实例:
/zhaopin/?init=-1&headckid=943dbbbe5676df58&fromSearchBtn=2&ckid=943dbbbe5676df58&degradeFlag=0&siTag=1B2M2Y8AsgTpgAmY7PhCfg~fA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_fp_nvbar&d_ckId=67086940ca35b80ca5927dfb150bc4f6&d_curPage=1&d_pageSize=40&d_headId=67086940ca35b80ca5927dfb150bc4f6&curPage=0
去缀码:
/zhaopin/?subIndustry=&init=-1&industryType=industry_01&headckid=&flushckid=1&fromSearchBtn=2&industries=010&ckid=&siTag=1B2M2Y8AsgTpgAmY7PhCfg~fA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_fp_nvbar&d_ckId=&d_curPage=0&d_pageSize=40&d_headId=

第二页实例:
/zhaopin/?init=-1&headckid=943dbbbe5676df58&fromSearchBtn=2&ckid=943dbbbe5676df58&degradeFlag=0&siTag=1B2M2Y8AsgTpgAmY7PhCfg~fA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_fp_nvbar&d_ckId=67086940ca35b80ca5927dfb150bc4f6&d_curPage=3&d_pageSize=40&d_headId=67086940ca35b80ca5927dfb150bc4f6&curPage=1

/zhaopin/?init=-1&headckid=5f6de0a58caab4d0&fromSearchBtn=2&ckid=7c1dcdc7f6549b8e&degradeFlag=0&subIndustry=&industryType=industry_01&industries=010&siTag=1B2M2Y8AsgTpgAmY7PhCfg~Uu4d3oMo-zE-ddoy0_BJog&d_sfrom=search_unknown&d_ckId=3b4e07bcb481232fba4958fd10328c91&d_curPage=0&d_pageSize=40&d_headId=58591b1cbefbd9bb3358d8c338eda4f4&curPage=1

去缀码后得出后面页面的规律链接
/zhaopin/?init=-1&headckid=&fromSearchBtn=2&ckid=&degradeFlag=0&subIndustry=&industryType=industry_01&industries=010&siTag=1B2M2Y8AsgTpgAmY7PhCfg~Uu4d3oMo-zE-ddoy0_BJog&d_sfrom=search_fp_nvbar&d_ckId=&d_curPage="+str(n-1)+"&d_pageSize=40&d_headId=&curPage="+str(n)

每个招聘具体页面:
/job/
由于存在多个 .shtml
用select筛选
我改掉了之前的:hrefbox=(‘a[href$=".shtml"]’)
换成:hrefbox=(‘a[href*=“com/job/1”]’)

(二) 数据解析模块

使用requests请求下来的数据,可以利用.text()方法或者.content()方法访问,对于文本请求,二者并无太大差别,主要在于编码问题。具体用法可以参考官方文档。

html类型数据解析
html语言即超文本标记语言,它是由一个个html标签构成的,是结构化的语言,因此很容易从中匹配提取信息。这种类型的数据解析的方法有很多,比如利用正则表达式,按照html标签的结构进行字符串匹配,或则利用lxml库中的xpath方法使用xpath路径定位到每一个节点、也有类似jQuery的PyQuery方法。我采用的是BeautifulSoup方法。

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间。该介绍来源于其官方中文文档。利用BeautifulSoup能够将html字符串转化为树状结构,并非常快速地定位到每一个标签。

目前版本是BeautifulSoup4,pip安装方法:
$ pip install BeautifulSoup4

利用BeautifulSoup解析html数据的关键步骤为:
from bs4 import BeautifulSoup
soup = BeautifulSoup(, “”)
如此,便将html数据转换成BeautifulSoup中的树状结构。然后利用BeautifulSoup中的find()、find_all()等方法即可定位到每一个节点。

json类型数据解析
json类型的数据已经是高度结构化的数据,跟Python中字典的表示形式一样,因此在解析上十分方便。可以通过:
import json
data = ()
直接读取json数据,且能够返回字典类型。

(三) 异常容错模块

对网站数据的频繁访问会给网站带来压力,且维护者担心爬客拿爬取数据做出不当用途。爬虫很容易被网站禁止。
在筛选过程中可能遇到少量异常信息。

我们要对上述情况设置异常捕获处理。
对前者我们可以建立并使用IP代理池(由于免费的不可靠,难操作我就没用。我也没有使用付费的)

(四) 筛选汇总模块

本程序多采用CSS的选择器筛选所需标签信息
本程序采用了文件读写方式将所得信息汇总

分析文档格式利用BeautifSoup CSS选择器进行信息筛选

六、 实现

#!/usr/bin/python
#-*- coding: utf-8 -*-
import time
import sys
#正则表达式没用上
# import re
import socket
import requests
from bs4 import BeautifulSoup

#伪装请求头用处不大
# from fake_useragent import UserAgent
# ua = UserAgent()
# headers = {'User-Agent': }

#换成你的请求头
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13;???'}

def getHtml(url):
    try:
        socket.setdefaulttimeout(4)
        page = requests.get(url.format(),headers=headers)
        return page.text
    except socket.timeout:
        print("!!!")
        #raise Exception("频繁访问,网络假死")

n=0
count=0

#换成你将要写入信息的文本路径
f=open('/Users/XX/','a+',encoding='utf-8')

while n>=0:

    if n==0:
    #初始链接/每页四十条记录
    #去除每次初始化不同的缀码
        t="/zhaopin/?subIndustry=&init=-1&industryType=industry_01&headckid=&flushckid=1&fromSearchBtn=2&industries=010&ckid=&siTag=1B2M2Y8AsgTpgAmY7PhCfg%7EfA9rXquZc5IkJpXC-Ycixw&d_sfrom=search_fp_nvbar&d_ckId=&d_curPage=0&d_pageSize=40&d_headId="

    else:
        #后续链接
        t="/zhaopin/?init=-1&headckid=&fromSearchBtn=2&ckid=&degradeFlag=0&subIndustry=&industryType=industry_01&industries=010&siTag=1B2M2Y8AsgTpgAmY7PhCfg%7EUu4d3oMo-zE-ddoy0_BJog&d_sfrom=search_fp_nvbar&d_ckId=&d_curPage="+str(n-1)+"&d_pageSize=40&d_headId=&curPage="+str(n)


    html=getHtml(t)
    soup = BeautifulSoup(html, 'lxml')  #声明BeautifulSoup对象

    #hrefbox=('a[href$=".shtml"]')
    hrefbox=soup.select('a[href*="com/job/1"]')

    links = [];
    for i in range(0,len(hrefbox)):
        links.append(hrefbox[i].get("href"));#拼接链接


    for link in links:
        try:
            html = getHtml(link)
            soup = BeautifulSoup(html, 'lxml')  #声明BeautifulSoup对象

            hah=soup.select(".job-description")#职责描述
            if ("Linux" in hah[0].div.text):#筛选描述中有Liunx的页面链接
                print(link)

                f.write("******************************************************")

                describe=soup.select(".title-info")
                f.write("\n"+"公司名称:"+describe[0].h3.text+"\n"+"职位:"+describe[0].h1.text+"\n")

                message=soup.select(".basic-infor")
                f.write("公司地点:"+message[0].span.text+"\n"+"发布时间:"+message[0].time.text+"\n")

                f.write(hah[0].div.text)

                #达到10条记录时,退出程序
                count=count+1
                if count>=10:
                    f.close()
                    sys.exit(1)
                    #用于主线程的退出,可捕获异常作出处理

                time.sleep(2)
            
            #当职责描述中没有Linux时将跳过该页面信息
            else:
                continue
        
        #单个总页面后面有几个异常链接,将其跳过。
        #当我的筛选方式修正之后这个错误捕捉似乎没有必要了,可以去掉!
        except IndexError:
            break
    
    #跳到下一个总页面链接
    n=n+1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

七、 测试

由于网站对IP的限制,一千条跑完需要较长的时间
后续我会学习运用多线程,还有调用免费IP池
测试结果

八、 收获和体会(问题及难点描述)

收获:
我在入门的时候看了一些博客,由于python版本还有库选择的不同而走了不少弯路,建议直接看官方文档,末尾有链接
对信息的筛选是一个学习的过程,可以用多种方法。可以加深对标签及标签之间关系的学习。
通过这次爬虫体验也初步了解了爬虫的流程与简单技巧,我以后可以利用爬虫节约时间了,不用再天天盯着商品是否降价,爬虫轻松实现监控数据化。
难点:
网站对IP的访问限制加大了筛选一千条有效数据的难度。我的IP都被禁了好多次了,心累。稳的代理IP又要钱。接下来要认真学习多线程和IP池模块的编写!

参考文献

request快速上手:
/zh_CN/latest/user/
request高级用法:
/zh_CN/latest/user/
Beautiful Soup 4.2.0中文文档:
/software/BeautifulSoup/bs4/

/u014108004/article/details/84141807
/zhusongziye/article/details/84477355
招聘网站爬取实例
/hellowooorld/p/
爬虫论文写作
/1/