step1:首先剖析一下要抓取的页面信息
进行翻页操作的时候,post要求的参数紧张几个参数是city,pn,kd分别对应关键词城市,翻页数,职位。
step2:针对每个页面,根据自己的需求解析HTML页面内容,我利用的是python,推举beautifulsoup+re的组合模式来解析网页内容。本次爬取只是大略地爬取赤色框框里的信息,如果想爬取更多信息,可以进入每个职位的url页面爬取。

step3:将爬取的内容,导入数据库中,本次爬取利用的是开源postgresql数据库。
代码部分:
#!/usr/bin/env python
#coding:utf8
import urllib2
import requests
import json
import psycopg2
import re
import time
import codecs
import os
import traceback
from bs4 import BeautifulSoup
def writeLogs(filename,contents):
f=open(filename,'a')
f.write(contents)
f.close()
def crawler_lagou():
city_ls=['杭州','北京']
page_ls=range(1,31)
job_ls=['Java','PHP']
for job_city in city_ls:
for job in job_ls:
for page in page_ls:
try:
url=r'https://www.lagou.com/zhaopin/'+job+'/'
para={'city':job_city,'px':'default','kd':job,'pn':page}
print para
time.sleep(1)
html_content=requests.post(url,para).text
soup=BeautifulSoup(html_content,'lxml')
#当前城市
city=soup.find('a',class_=\"大众current_city current\公众).text
city=[city]15
#职位名称
job_name=soup.find_all('div',class_='p_top')
job_name=[i.find('a',class_=\"大众position_link\"大众).find('h2').text for i in job_name if i.find('a',class_=\"大众position_link\"大众)]
#薪水
salary=soup.find_all('div',class_='li_b_l')
salary=[i.find('span',class_=\公众money\公众).text for i in salary if i.find('span',class_=\公众money\"大众)]
#print salary,len(salary)
#履历
experience = soup.find_all('div',class_='li_b_l')
experience=[i.text for i in experience if i.find('span',class_=\公众money\"大众)]
experience=[i.split('\n')[2] for i in experience]
#公司名称
company=soup.find_all('div',class_=\公众company_name\公众)
company=[i.find('a',target=\公众_blank\"大众).text for i in company if i.find('a',target=\公众_blank\"大众)]
#公司性子
industry=soup.find_all('div',class_=\公众industry\"大众)
industry=[i.text.strip() for i in industry]
sql='insert into crawler.lagou_job_zh(city,job_name,salary,experience,company,industry) values (%s,%s,%s,%s,%s,%s)'
param=zip(city,job_name,salary,experience,company,industry)
cur.executemany(sql,param)
except:
print '{0}爬取失落败!
'.format(para)
continue
if __name__=='__main__':
conn=psycopg2.connect(host='10.0.21.227',port='5432',database='sample_db',user='postgres',password='OOoo0000')
cur=conn.cursor()
try:
crawler_lagou()
conn.commit()
cur.close()
conn.close()
print '程序实行成功!
'
except Exception,e:
print '程序实行发生非常:{0}!
'.format(e)
conn.rollback()
cur.close()
conn.close()
filename=r'lagou.log'
content = '-'30 + time.strftime('%Y-%m-%d %H:%M:%S') + '-'30 + '\n'
writeLogs(filename,content)
f=open(filename,'a')
traceback.print_exc(file=f)
f.flush()
f.close()
终极数据库数据:
step4:数据可视化
数据可视化部分,由于python的matplotlib包的还没入门,而R的可视化手段更加熟习也更加灵巧,我选择用的R进行可视化。
须要把稳的是,以下剖析结论的大条件是北京、杭州地区的Java、PHP职位比较,数据来源仅限于拉勾网。
4.1 杭州 vs 北京
4.1.1 起步价比较
从上图分布可以看出,北京的薪酬的起步价明显都集中在15k,而杭州地区很奇怪有两个峰值,一个集中在10k,一个集中在15k,可以思考这是不是杭州地区的java和php的起步价存在显著差异引起的?后面会给出结论。
从上图可以看出,杭州的起步价四分位数明显比北京低,须要把稳的是北京的第一分位数和中位数重合在15K的位置上,验证了上面的直方图结论,解释北京对15这个起步价的得到了广泛的认可,从侧面反响出15是Java、PHP工程师在北京的温饱线,哈哈~
4.1.2 天花板比较
从上图可以看出来,北京薪酬的天花板紧张集中在20K以上,而杭州的天花板很显然集中在20k以下,以是如果你在杭州已经拿了20,如果还想拿更多,那就去北京吸雾霾吧~
4.2 Java vs PHP
4.2.1 起步价比较
从上图分布的集中趋势可以看出,不论是Java还是PHP,起步价都是集中在15旁边,没有很显著的差异。
从上图四分位数可以看出,Java和PHP薪酬的起步价的分布无明显差异。
4.2.2 天花板比较
从上图天花板价分布来看,Java和PHP天花板都集中在20-30之间。
从小提琴图和分位数来看,从天花板价格来看,Java的还是要高于PHP。
4.3 城市与job
4.3.1 起步价比较
从上图可以看出,北京的java和PHP起步价无显著差异,但是杭州的Java和PHP确实存在显著差异,杭州的Java起步价明显高于PHP,这也回答了前面的第一个问题。
4.3.2 天花板比较
从上图看来,北京的java和PHP天花板无显著差异,但是杭州的Java天花板明显高于PHP。以是,在杭州的同学,如果你还在犹豫学Java还是PHP,果断入手Java吧~