年初大家可能是各种跳槽吧,看着自己身边的人也是一个个的要走了,其实是有一点伤感的。人各有志吧,不多评论。这篇文章主要是我如何抓取拉勾上面AI相关的职位数据,其实抓其他工作的数据原理也是一样的,只要会了这个,其他的都可以抓下来。一共用了不到100行代码,主要抓取的信息有“职位名称”,“月薪”,“公司名称”,“公司所属行业”,“工作基本要求(经验,学历)”,“岗位描述”等。涉及的工作有“自然语言处理”,“机器学习”,“深度学习”,“人工智能”,“数据挖掘”,“算法工程师”,“机器视觉”,“语音识别”,“图像处理”等几大类。
下面随便截个图给大家看下,我们想要的信息
然后看下我们要的信息在哪里
然后职位详细信息是的url就在那个href里面,所以关键是要取到那个href就OK了。
下面直接上代码
首先我们需要判断一个url是不是合法的url,就是isurl方法。
urlhelper方法是用来提取url的html内容,并在发生异常时,打一条warning的警告信息
importurllib.request
frombs4importBeautifulSoup
importpandasaspd
importrequests
fromcollectionsimportOrderedDict
fromtqdmimporttqdm,trange
importurllib.request
fromurllibimporterror
importlogging
logging.basicConfig(level=logging.WARNING)
defisurl(url):
ifrequests.get(url).status_code ==200:
return True
else:
return False
defurlhelper(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')
returnhtml
excepterror.URLErrorase:
logging.warning("{}".format(e))
下面就是爬虫的主程序了,里面需要注意的是异常的处理,很重要,不然万一爬了一半挂了,前面爬的又没保存就悲剧了。还有一个是想说BeautifulSoup这个类真的是十分方便,熟练使用能节省很多时间。
importurllib.request
frombs4importBeautifulSoup
importpandasaspd
importrequests
fromcollectionsimportOrderedDict
fromtqdmimporttqdm,trange
importurllib.request
fromurllibimporterror
importlogging
names = ['ziranyuyanchuli','jiqixuexi','shenduxuexi','rengongzhineng',
'shujuwajue','suanfagongchengshi','jiqishijue','yuyinshibie',
'tuxiangchuli']
fornameintqdm(names):
savedata = []
page_number =
forpageinrange(1,31):
page_number +=1
ifpage_number %5==:
print(page_number)
rooturl ='https://www.lagou.com/zhaopin/{}/{}/'.format(name,page)
if notisurl(rooturl):
continue
html = urlhelper(rooturl)
soup = BeautifulSoup(html,"lxml")
resp = soup.findAll('div',attrs={'class':'s_position_list'})
resp = resp[]
resp = resp.findAll('li',attrs={'class':'con_list_item default_list'})
foriintrange(len(resp)):
position_link = resp[i].findAll('a',attrs={'class':'position_link'})
link = position_link[]['href']
ifisurl(link):
htmlnext = urlhelper(link)
soup = BeautifulSoup(htmlnext,"lxml")
try:
#职位描述
job_bt = soup.findAll('dd',
attrs={'class':'job_bt'})[].text
except:
continue
try:
#工作名称
jobname = position_link[].find('h3').get_text()
except:
continue
try:
#工作基本要求
p_bot = resp[i].findAll('div',
attrs={'class':'p_bot'})[].text
except:
continue
try:
#月薪
money = resp[i].findAll('span',
attrs={'class':'money'})[].text
except:
continue
try:
#行业
industry = resp[i].findAll('div',
attrs={'class':'industry'})[].text
except:
continue
try:
#公司名字
company_name = resp[i].findAll(
'div',attrs={'class':'company_name'})[].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?这里想说一句我的领导说的一句话,“努力成为没有什么不会的”,哈哈哈,反正都学一点吧,年轻人不要把自己限制在一个圈子里面,这样可能你自己越走路子越窄,我是想着成为一名全栈工程师,恩,加油,共勉!!!
领取专属 10元无门槛券
私享最新 技术干货