准备找实习,写了一个爬虫。爬的内容是 牛课网-求职-实习广场 的职业内容。这个时间段,网页更新得比较快,建议用的时候自己爬。
点开一个链接:
爬取信息主要包括以上几个方面。
库方面用的是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可以去掉图中第一列的编号):