2019-12-13 爬网页10-研究Boss直聘(selenium+动态ua+requests+bs4)

Boss直聘是学习爬网页不错的目标对象。

尝试连接

首先,它会验证cookie,通过selenium获得cookie是有反爬措施的。具体参见https://blog.csdn.net/weixin_42555985/article/details/103479002。

获得cookie后,就可以链接过去获得网页了。
这里最好还是用动态ua,免得再被反爬

def get_ua():
    first_num = random.randint(55, 76)
    third_num = random.randint(0, 3800)
    fourth_num = random.randint(0, 140)
    os_type = [ '(Windows NT 6.1; WOW64)',
                '(Windows NT 10.0; WOW64)',
                '(X11; Linux x86_64)',
                '(Macintosh; Intel Mac OS X 10_14_5)' ]
    chrome_version = 'Chrome/{}.0.{}.{}'.format(first_num, third_num, fourth_num)
    ua = ' '.join(['Mozilla/5.0', random.choice(os_type), 'AppleWebKit/537.36', '(KHTML, like Gecko)', chrome_version, 'Safari/537.36'] )
    return ua

def get_headers():
    # 构造请求头User-Agent
    headers = { 'accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
                'accept-encoding':'gzip, deflate, br',
                'accept-language':'zh-CN,zh;q=0.9',
                'cache - control': 'max - age = 0',
                'referer':'https://www.zhipin.com/',
                'sec-fetch-mode':'navigate',
                'sec-fetch-site':'same-origin',
                'sec-fetch-user':'?1',
                'upgrade-insecure-requests':'1',
                'user-agent': get_ua(),
                'X-Requested-With': 'XMLHttpRequest' }
    return headers

获得网页用requests模块,相对简单。

cookies_dict=get_cookie() #每页重新获得一次cookie

html = requests.get(url, headers=get_headers(), cookies=cookies_dict)

网页分析

每个网页上有30个职位,html代码格式如下

<div class="job-primary">
                                    <div class="info-primary">
                                        <h3 class="name">
                                            <a href="/job_detail/7f1f1599c6d56afe1Hx90925GVM~.html" data-jid="7f1f1599c6d56afe1Hx90925GVM~" data-itemid="1" data-lid="9mSIbKTrIvs.search.1" data-jobid="38780491" data-index="0" ka="search_list_1" target="_blank">
                                                <div class="job-title">Node JS</div>
                                                <span class="red">20-30K</span>
                                                
                                                <div class="info-detail"></div>
                                            </a>
                                        </h3>
                                        <p>上海 杨浦区 江湾<em class="vline"></em>1-3年<em class="vline"></em>本科</p>
                                    </div>
                                    <div class="info-company">
                                        <div class="company-text">
                                            <h3 class="name"><a href="/gongsi/9524c5904cc5a5d11nN_3NS9.html" ka="search_list_company_1_custompage" target="_blank">译筑科技</a></h3>
                                            <p>互联网<em class="vline"></em>天使轮<em class="vline"></em>20-99人</p>
                                        </div>
                                    </div>
                                    <div class="info-publis">
                                        <h3 class="name"><img src="https://img.bosszhipin.com/beijin/mcs/useravatar/20171009/6c96b651a1c7573238897ca2245ad0be00f6831d3d01838b68395b4d44c309c4_s.jpg?x-oss-process=image/resize,w_40,limit_0" />朱女士<em class="vline"></em>人事经理</h3>
                                        <p></p>
                                    </div>
                                    <a href="javascript:;" data-url="/wapi/zpgeek/friend/add.json?jobId=7f1f1599c6d56afe1Hx90925GVM~&lid=9mSIbKTrIvs.search.1" redirect-url="/web/geek/chat?id=426ac3dc0dfe30121HV83dS5ElA~" class="btn btn-startchat">立即沟通
                                    </a>
                                </div>

我是用bs4进行html解析。

岗位名称,公司名称,薪资获得比较容易。

工作地点,工作经验,教育程度这几个处理时候要注意,有2种情况。

  • 情况1,工作地点,工作经验,教育程度
<p>上海 浦东新区 花木<em class="vline"></em>3-5年<em class="vline"></em>本科</p>
  • 情况2,这种情况似乎专门针对实习生的。左边工作地点和右边教育程度和情况1一致,只是中间部分不再是应聘人员的工作经验,而是实习生工作时间。
<p>上海  <em class="vline"></em>4天/周<em class="vline"></em>4个月<em class="vline"></em>本科</p>

公司行业,融资情况,员工人数这几个也有2种情况,处理时候要注意。

  • 情况1,公司行业,融资背景,员工人数
<p>音乐/视频/阅读<em class="vline"></em>已上市<em class="vline"></em>1000-9999人</p>
  • 情况2,公司行业,员工人数。这种情况没有融资背景
<p>互联网<em class="vline"></em>0-20人</p>

岗位要求
鼠标移动到<h3 class=“name”>上去,可以弹出岗位要求。
在这里插入图片描述

开发者工具里可以看到,是另外一个链接请求。在网络或者XHR里可以筛选到。
有2个参数要送入,分别是网页上的data-lid和data-jid。
返回是json类型,html数据就在对象“html”的值中。

<div class="detail-bottom-text">        岗位职责<br/>1.负责公司产品PC端和移动端的前端开发,实现业务功能和交互效果;<br/>2.与UI、产品、后台开发人员沟通,落实开发需求,解决平台兼容性问题;<br/>3.优化产品性能和前端代码质量;<br/>4.持续改进产品的易用性与用户体验。<br/>职位要求:<br/>1.本科以上学历,两年以上WEB前端开发经验;<br/>2.精通JavaScript、HTML、CSS等WEB前端技术;<br/>3.精通JQuery,掌握React、Vue、AngularJS、Easyui框架至少一种;精通Easyui者优先<br/>4.熟悉各种跨浏览器兼容性技术,熟悉响应式布局和屏幕适配技术   </div>

翻页
如果不是最后一页,下一页的html代码

<a href="/c101020100/?query=js&amp;page=9" ka="page-next" class="next"></a>

如果是最后一页,下一页的html代码

<a href="javascript:;" ka="page-next" class="next disabled"></a>

知道应该如何判断是不是最后一页了吧。
也应该知道下一页的链接地址是什么了吧。
怎么循环就不用再介绍了吧。
有一点要提醒一下,每次翻页循环,最好重新获得一下cookie。不然循环太多,cookie会失效。

全代码参见https://download.csdn.net/download/weixin_42555985/12031444

发布了122 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42555985/article/details/103524569