前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[编程经验] 基于bs4的拉勾网AI相关工作爬虫实现

[编程经验] 基于bs4的拉勾网AI相关工作爬虫实现

作者头像
用户1622570
发布2018-04-11 16:14:43
6360
发布2018-04-11 16:14:43
举报

年初大家可能是各种跳槽吧,看着自己身边的人也是一个个的要走了,其实是有一点伤感的。人各有志吧,不多评论。这篇文章主要是我如何抓取拉勾上面AI相关的职位数据,其实抓其他工作的数据原理也是一样的,只要会了这个,其他的都可以抓下来。一共用了不到100行代码,主要抓取的信息有“职位名称”,“月薪”,“公司名称”,“公司所属行业”,“工作基本要求(经验,学历)”,“岗位描述”等。涉及的工作有“自然语言处理”,“机器学习”,“深度学习”,“人工智能”,“数据挖掘”,“算法工程师”,“机器视觉”,“语音识别”,“图像处理”等几大类。

下面随便截个图给大家看下,我们想要的信息

然后看下我们要的信息在哪里

然后职位详细信息是的url就在那个href里面,所以关键是要取到那个href就OK了。

下面直接上代码

首先我们需要判断一个url是不是合法的url,就是isurl方法。

urlhelper方法是用来提取url的html内容,并在发生异常时,打一条warning的警告信息

代码语言:javascript
复制
import urllib.request
from bs4 import BeautifulSoup
import pandas as pd
import requests
from collections import OrderedDict
from tqdm import tqdm, trange
import urllib.request
from urllib import error
import logging

logging.basicConfig(level=logging.WARNING)


def isurl(url):
    if requests.get(url).status_code == 200:
        return True
    else:
        return False


def urlhelper(url):
    try:
        req = urllib.request.Request(url)
        req.add_header("User-Agent",
                       "Mozilla/5.0 (Windows NT 6.1; WOW64)"
                       " AppleWebKit/537.36 (KHTML, like Gecko) "
                       "Chrome/45.0.2454.101 Safari/537.36")
        req.add_header("Accept", "*/*")
        req.add_header("Accept-Language", "zh-CN,zh;q=0.8")
        data = urllib.request.urlopen(req)
        html = data.read().decode('utf-8')

        return html
    except error.URLError as e:
        logging.warning("{}".format(e))

下面就是爬虫的主程序了,里面需要注意的是异常的处理,很重要,不然万一爬了一半挂了,前面爬的又没保存就悲剧了。还有一个是想说BeautifulSoup这个类真的是十分方便,熟练使用能节省很多时间。

代码语言:javascript
复制
import urllib.request
from bs4 import BeautifulSoup
import pandas as pd
import requests
from collections import OrderedDict
from tqdm import tqdm, trange
import urllib.request
from urllib import error
import logging
代码语言:javascript
复制
names = ['ziranyuyanchuli', 'jiqixuexi', 'shenduxuexi', 'rengongzhineng',
         'shujuwajue', 'suanfagongchengshi', 'jiqishijue', 'yuyinshibie',
         'tuxiangchuli']
for name in tqdm(names):
    savedata = []
    page_number = 0
    for page in range(1, 31):
        page_number += 1
        if page_number % 5 == 0:
            print(page_number)
        rooturl = 'https://www.lagou.com/zhaopin/{}/{}/'.format(name, page)
        if not isurl(rooturl):
            continue
        html = urlhelper(rooturl)
        soup = BeautifulSoup(html, "lxml")
        resp = soup.findAll('div', attrs={'class': 's_position_list'})
        resp = resp[0]
        resp = resp.findAll('li', attrs={'class': 'con_list_item default_list'})
        for i in trange(len(resp)):
            position_link = resp[i].findAll('a', attrs={'class': 'position_link'})
            link = position_link[0]['href']
            if isurl(link):
                htmlnext = urlhelper(link)
                soup = BeautifulSoup(htmlnext, "lxml")
                try:
                    # 职位描述
                    job_bt = soup.findAll('dd', 
                                          attrs={'class': 'job_bt'})[0].text
                except:
                    continue
                try:
                    # 工作名称
                    jobname = position_link[0].find('h3').get_text()
                except:
                    continue
                try:
                    # 工作基本要求
                    p_bot = resp[i].findAll('div', 
                                            attrs={'class': 'p_bot'})[0].text
                except:
                    continue
                try:
                    # 月薪
                    money = resp[i].findAll('span', 
                                            attrs={'class': 'money'})[0].text
                except:
                    continue
                try:
                    # 行业
                    industry = resp[i].findAll('div', 
                                               attrs={'class': 'industry'})[0].text
                except:
                    continue
                try:
                    # 公司名字
                    company_name = resp[i].findAll(
                        'div', attrs={'class': 'company_name'})[0].text
                except:
                    continue
                rows = OrderedDict()
                rows["jobname"] = jobname.replace(" ", "")
                rows["money"] = money
                rows["company_name"] = company_name.replace("\n", "")
                rows["p_bot"] = p_bot.strip().replace(" ", ""). \
                    replace("\n", ",").replace("/", ",")
                rows["industry"] = industry.strip().\
                    replace("\t", "").replace("\n", "")
                rows["job_bt"] = job_bt
                savedata.append(rows)
    # 保存到本地
    df = pd.DataFrame(savedata)
    df.to_csv("./datasets/lagou/{}.csv".format(name), index=None)

然后,整个爬虫运行的还是有点慢的,到现在我这边还没运行完,等运行完了以后,可以大致分析一下什么工作最适合自己,找到和自己最匹配的工作,大家也可以去试试,我是觉得挺有意思的,今天还写了一个抓取百度百科的爬虫,下次拿出来和大家分享。最近写爬虫上瘾,越写感觉越有意思,爬虫就是这么神奇,你不会的时候,就觉得很牛逼,其实会了的话,也没啥了。

最后,最近都是爬虫的文章,感觉我的这个号越写越乱了,什么都有了,不知道大家看的是否happy?这里想说一句我的领导说的一句话,“努力成为没有什么不会的”,哈哈哈,反正都学一点吧,年轻人不要把自己限制在一个圈子里面,这样可能你自己越走路子越窄,我是想着成为一名全栈工程师,恩,加油,共勉!!!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-03-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习和数学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档