python爬虫——牛课实习广场

准备找实习,写了一个爬虫。爬的内容是 牛课网-求职-实习广场 的职业内容。这个时间段,网页更新得比较快,建议用的时候自己爬。

在这里插入图片描述点开一个链接:
在这里插入图片描述
爬取信息主要包括以上几个方面。
库方面用的是requests和beautifulsoup(主要数据在html上),以及pandas用来保存数据,还有os,multiprocessing。(p.s.后面演示浏览器为firefox).

import requests
from bs4 import BeautifulSoup
from multiprocessing import Pool
import os
import pandas as pd

先来看第一个页面:(https://www.nowcoder.com/job/center)。这里需要爬两个内容,工作信息链接,以及总页数。常规操作:

r = requests.get('https://www.nowcoder.com/job/center')
soup = BeautifulSoup(r.text, 'lxml')

总页数:拉到网页尾,“末页”处右键,查看元素。
在这里插入图片描述
现在,末页是63页,这个信息包含在一个class含“js-last-pager”(选择”txt-pager”会与上面的那个重复)的标签下面的a标签内。(还是select好用,告别find_all)
用法可参考css选择器(https://www.w3school.com.cn/cssref/css_selectors.asp)

pages = int(soup.select('.js-last-pager a')[0]['data-page'])

网址构成很简单,以第二页为例(经实验,第一页也满足): https://www.nowcoder.com/job/center?page=2.
写个循环就可以了。

接下来是工作信息链接。对着要爬的工作信息,右键,查看元素。(写的时候已经刷新了,第一条变为 “百度测试开发工程师”了):
在这里插入图片描述

jobs = soup.select('.reco-job-title')

在这里插入图片描述
主要爬的信息在这4个地方。仿照之前方法,分别查看,用代码抓取。抓得的数据用一个DataFrame记录,最后to_excel。

全部代码如下:

import requests
from bs4 import BeautifulSoup
from multiprocessing import Pool
import os
import pandas as pd


def get_onepage(i):
    print(i)
    baseurl = 'https://www.nowcoder.com/job/center?page='
    url = baseurl + str(i)
    r = requests.get(url)
    soup = BeautifulSoup(r.text, 'lxml')
    jobs = soup.select('.reco-job-title')
    
    d = {'at_page':[],
         'job':[],
         'company':[],
         'kind':[],
         'locate':[],
         'detail':[],
         'url':[],
         '岗位职责':[],
         '岗位要求':[]}
    
    baseurl_jobs = 'https://www.nowcoder.com'
    for job in jobs:
        try:
            url_jobs = baseurl_jobs + job['href']
            r_jobs = requests.get(url_jobs)
            soup_jobs = BeautifulSoup(r_jobs.text, 'lxml')
            
            company_name = soup_jobs.select('.js-company-name')[0].text
            locate = ""
            kind = soup_jobs.select('.rec-job-item')[0].text
            if len(soup_jobs.select('.rec-job-item')) > 1:
                locate += soup_jobs.select('.rec-job-item')[1].text.replace('\n', '') + ' '
            details = soup_jobs.select('.rec-job-detail p')[0].text.replace('\n', ' ').strip(' ')
            duty1 = soup_jobs.select('.js-duty-content')[0].text;
            duty2 = soup_jobs.select('.js-duty-content')[1].text
            
            d['at_page'].append(i)
            d['job'].append(job.text)
            d['company'].append(company_name)
            d['kind'].append(kind)
            d['locate'].append(locate)
            d['detail'].append(details)
            d['url'].append(url_jobs)
            d["岗位职责"].append(duty1)
            d['岗位要求'].append(duty2)
        except:
            print(job)
            
    return d
        
if __name__ == '__main__':
    r = requests.get('https://www.nowcoder.com/job/center')
    soup = BeautifulSoup(r.text, 'lxml')
    pages = int(soup.select('.js-last-pager a')[0]['data-page']) #获取总页数
    print("total_pages:" + str(pages))
    pool = Pool()
    lst = pool.map(get_onepage, range(1, pages + 1))
    
    for i in range(1, len(lst)):
        for k in lst[0].keys():
            lst[0][k] += lst[i][k]
    df = pd.DataFrame(lst[0])
    save_dir = './jobs/'
    if not os.path.exists(save_dir):
        os.mkdir(save_dir)
    df.to_excel(save_dir + 'j.xls', index = False)

输出Excel(最后一行index=False可以去掉图中第一列的编号):
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值