python3小项目——爬取招聘信息(智联招聘)

2017年6月,花了大概一周的时间学习了以下内容,并基于此写了一个小项目。这里对其进行总结,说明其中遇到的问题和解决方案以及下一步计划。

学习的内容和网址:

斯巴达网站

斯巴达视频

python零基础爬虫实战

参考的网站:

Beautiful Soup文档

python3 urllib

需要知道的知识:

网页的基本构成,

一些数据包的安装,

python的语法,

网页下载与解析,

Beautiful Soup的使用,

urllib的使用,

利用pandas将字典保存成矩阵并存储成csv格式等。

遇到的问题及解决方法

1、所爬取的网页需要登录或验证码等:利用模拟登陆的方法。具体方法视频中都有。

2、网页出现乱码:原因是有的网页返回的格式是字节,需要利用contents=contents.decode('utf-8')转成万国码。

3、模拟登陆过程中为了避免服务器知道请求方是机器,选择多个请求终端随机选取。random_header = random.choice(headers)

4、网址中含有中文,复制过来后变成ascii码。利用quote(url, safe=string.printable)只对中文进行ascii码转换

5、将爬取的数据保存成.csv格式:利用pandas方法,将字典转成矩阵的形式

   data = get_link_info(url)  
            df = df.append(data,ignore_index=True)        
            df.to_csv('嵌入式开发工程师.csv')

写在代码前面的话:

@智联招聘职位搜索与数据获取
@拉勾网 专注于互联网招聘的网站:https://www.lagou.com/ 
@拉勾网 招聘的公司较少,且大部分需要有经验的公司
@拉勾网 查找限制选择性强
@BOSS直聘 查找限制选择性强 对象大众化 http://www.zhipin.com
@猎聘 更专业的招聘网站 有专门面向学生的招聘通道 https://campus.liepin.com/
@应届生网 页面布局太烂,不建议爬取。不过有专门针对应届生的招聘会论坛等信息,确实不错 http://www.yingjiesheng.com/
@由于拉钩和猎聘职位较少,而且可以满足高精确查找,这里只提供网址,自行搜索。

@ python3.5


代码如下:看不懂的地方可以留言,每天和电脑打交道,会及时回复。

# -*- coding: utf-8 -*-
"""
Created on Wed Jun  7 09:21:52 2017

@author: qiu
"""
'''
@智联招聘职位搜索与数据获取
@拉勾网 专注于互联网招聘的网站:https://www.lagou.com/ 
@拉勾网 招聘的公司较少,且大部分需要有经验的公司
@拉勾网 查找限制选择性强
@BOSS直聘 查找限制选择性强 对象大众化 http://www.zhipin.com
@猎聘 更专业的招聘网站 有专门面向学生的招聘通道 https://campus.liepin.com/
@应届生网 页面布局太烂,不建议爬取。不过有专门针对应届生的招聘会论坛等信息,确实不错 http://www.yingjiesheng.com/
@由于拉钩和猎聘职位较少,而且可以满足高精确查找,这里只提供网址,自行搜索。
***********************@智联招聘职位搜索与数据获取***************************
'''

import urllib
from urllib.parse import *
from bs4 import BeautifulSoup
import string
import random
import pandas as pd


headers=["Mozilla/5.0 (Windows NT 6.1; Win64; rv:27.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
         "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:27.0) Gecko/20100101 Firfox/27.0"
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
         "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:10.0) Gecko/20100101 Firfox/10.0"
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/21.0.1180.110 Safari/537.36"
         "Mozilla/5.0 (X11; Ubuntu; Linux i686 rv:10.0) Gecko/20100101 Firfox/27.0"
         "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/34.0.1838.2 Safari/537.36"
         "Mozilla/5.0 (X11; Ubuntu; Linux i686 rv:27.0) Gecko/20100101 Firfox/27.0"
         "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
         ]
def get_content(url,headsers):
    '''
    @url:需要登录的网址
    @headers:模拟的登陆的终端
    *********************模拟登陆获取网址********************
    '''
    random_header = random.choice(headers)
    req = urllib.request.Request(url)
    req.add_header("User-Agent",random_header)
    req.add_header("Get",url)
    req.add_header("Host","sou.zhaopin.com")
    req.add_header("refer","http://sou.zhaopin.com/")
    html = urllib.request.urlopen(req)
    contents = html.read()
    #判断输出内容contents是否是字节格式
    if isinstance(contents,bytes):
        #转成字符串格式
        contents=contents.decode('utf-8')
    else:
        print('输出格式正确,可以直接输出')
##输出的是字节格式,需要将字节格式解码转成’utf-8‘
    return (contents)
    
def get_content1(url,headsers):
    '''
    @url:需要登录的网址
    @headers:模拟的登陆的终端
    *********************模拟登陆获取网址********************
    '''
    random_header = random.choice(headers)
    req = urllib.request.Request(url)
    req.add_header("User-Agent",random_header)
    req.add_header("Get",url)
    req.add_header("Host","jobs.zhaopin.com")
    req.add_header("refer","http://sou.zhaopin.com/jobs/searchresult.ashx")
    html = urllib.request.urlopen(req)
    contents = html.read()
    #判断输出内容contents是否是字节格式
    if isinstance(contents,bytes):
        #转成字符串格式
        contents=contents.decode('utf-8')
    else:
        print('输出格式正确,可以直接输出')
##输出的是字节格式,需要将字节格式解码转成’utf-8‘
    return (contents)    

def get_links_from(job, city, page):
    '''
    @job:工作名称
    @city:网址中城市名称
    @page:表示第几页信息
    @urls:所有列表的超链接,即子页网址
    
    ****************此网站需要模拟登陆**********************
    '''
    urls=[]
    for i in range(page):
        url = "http://sou.zhaopin.com/jobs/searchresult.ashx?jl={}&kw={}&p={}".format(str(city),str(job),i) 
        url = quote(url, safe=string.printable)
        info = get_content(url,headers)
        soup = BeautifulSoup(info,"lxml")#设置解析器为“lxml”
        link_urls = soup.select('td.zwmc a')
        for url in link_urls:      
            urls.append(url.get('href'))
    return (urls)
    

#url = "http://s.yingjiesheng.com/result.jsp?keyword=%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98&city=217&start=0&period=0&sort=score&jobtype=1"    
#get_links_from('南京','数据挖掘', 5)
def get_link_info(url):
    '''
    @爬取的地址
    *****************得到此网站的有用信息****************
    '''    
    info = get_content1(url,headers)
    soup = BeautifulSoup(info,"lxml")#设置解析器为“lxml”
    occ_name = soup.select('div.fixed-inner-box h1')[0]
    com_name = soup.select('div.fixed-inner-box h2')[0]
    welfare = soup.select('div.welfare-tab-box')[0]
    wages = soup.select('div.terminalpage-left strong')[0]
    date = soup.select('div.terminalpage-left strong')[2]
    exper = soup.select('div.terminalpage-left strong')[4]
    num = soup.select('div.terminalpage-left strong')[6]
    area = soup.select('div.terminalpage-left strong')[1]
    nature = soup.select('div.terminalpage-left strong')[3]
    Edu = soup.select('div.terminalpage-left strong')[5]
    cate = soup.select('div.terminalpage-left strong')[7]
    com_scale = soup.select('ul.terminal-ul.clearfix li strong')[8]
    com_nature = soup.select('ul.terminal-ul.clearfix li strong')[9]
    com_cate = soup.select('ul.terminal-ul.clearfix li strong')[10]
    com_address = soup.select('ul.terminal-ul.clearfix li strong')[11]

    data = {
    "拉勾网":'https://www.lagou.com/', 
    "猎聘":"https://campus.liepin.com/",
    "应届生":"http://www.yingjiesheng.com/",
    "网址":url,
    "工作名称":occ_name.text.strip(),
    "公司名称":com_name.text,
    "福利":welfare.text.strip(),
    "月工资":wages.text.strip(),
    "发布日期":date.text.strip(),
    "经验":exper.text.strip(),
    "人数":num.text.strip(),
    "工作地点":area.text.strip(),
    "工作性质":nature.text.strip(),
    "最低学历":Edu.text.strip(),
    "职位类别":cate.text.strip(),
    "公司规模":com_scale.text.strip(),
    "公司性质":com_nature.text.strip(),
    "公司行业":com_cate.text.strip(),
    "公司地址":com_address.text.strip()
        }
    return (data)
#url = "http://jobs.zhaopin.com/145913042250065.htm"
#get_link_info(url)
    
def get_links_all_info(job, city, page):
    urls = get_links_from(job, city, page)
    df = pd.DataFrame({
                         
    "网址":[],
    "工作名称":[],
    "公司名称":[],
    "福利":[],
    "月工资":[],
    "发布日期":[],
    "经验":[],
    "人数":[],
    "工作地点":[],
    "工作性质":[],
    "最低学历":[],
    "职位类别":[],
    "公司规模":[],
    "公司性质":[],
    "公司行业":[],
    "公司地址":[],
    "拉勾网":[], 
    "猎聘":[],
    "应届生":[]
                      })
    links = []
    for url in urls:
        if "xiaoyuan" in url:
            links.append(url)
            columns = ['校园招聘地址']
            labeled_df = pd.DataFrame(columns=columns, data=links)
            labeled_df.to_csv('校园招聘嵌入式开发工程师地址.csv')
        else:
            data = get_link_info(url)
            #print (data)
            df = df.append(data,ignore_index=True)
            #print (df)
            df.to_csv('嵌入式开发工程师.csv')
   
get_links_all_info('嵌入式开发工程师', '南京', 3)

总结:

当然这种爬虫方式还是最简单的,用的是最基础的方法。如果数据量大,可以考虑使用爬虫框架scrapy。

我学爬虫主要是为了在网上获取一些资源方便不打算作为以后的工作。所以框架也不打算学习了,如果以后工作需要,以后再学习。

学爬虫还有一个目的,就是学习python语言,算是python的一个小的应用了。

下一步,我可能会去爬取招聘会,面经等信息,便于以后找工作吧。

最后,祝每位走在自己梦想路上的人,一帆风顺,早日成功!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值