最近小编参加了学校的爬虫比赛,由于我是比赛开始后一天我才知道有这个比赛,这个比赛不止需要做爬数据,还需要做数据分析,因此时间比较紧。
本次比赛的主题是围绕着大数据工程师进行数据的爬取和分析。
本次的受害者
aHR0cHMlM2ElMmYlMmZ3d3cubGFnb3UuY29tL2pvYnMvbGlzdF8lRTUlQTQlQTclRTYlOTUlQjAlRTYlOEQlQUU/bGFiZWxXb3Jkcz0mZnJvbVNlYXJjaD10cnVlJnN1Z2lucHV0PQ==
目录:
1、环境
2、分析网站
3、实现爬取
1、环境
Python3.7、requests、selenium
2、分析网站
先打开开发者工具,再在搜索栏中输入大数据
图1
图2
筛选XHR请求很容易就可以发现目标数据所在的请求如图3
图3
找到了请求,第二步就是分析请求是否有加密,我的习惯是直接看最下面的请求参数
图4
很明显没有加密参数,直接请求这个数据的接口,得到如图5,没有得到数据,肯定有什么地方是加密了的,估计就是cookie加密了
图5
看一下cookie,如图6
图6
我看了一下背后的逻辑,是经过混淆的如图7
由于比赛时间比较紧,我就直接用selenium获取cookie,拿到数据进行数据分析再说。
图7
3、实现爬取
用selenium爬取就基本没有难点,用selenium运行js代码得到cookie即可
def get_cookie(url):
browser.get(url)
js = 'var c = document.cookie;return c' # js语句
return browser.execute_script(js) # 执行js
这里是post请求,需要改变参数已达到请求不同页码的数据
def get_json(content):
a = content.get('content').get('positionResult').get('result')
city, jod_year, experience, XL, ave_money, business = [], [], [], [], [], []
for i in a:
city.append(i.get('city'))
jod_year.append(i.get('workYear'))
XL.append(i.get('education'))
ave_money.append((i.get('salary')))
business.append(i.get('industryField'))
for i in range(len(city)):
data = {'ave_money': ave_money[i], 'HY': business[i], 'job_year': jod_year[i], 'XL': XL[i], 'zone': city[i]}
print(data)
def main():
cookie = get_cookie(url=goal_url)
headers['cookie'] = cookie
for i in range(1):
data = {
'first': 'true',
'pn': f'{i+1}',
'kd': 'python'
}
# allow_redirects=True, verify=False
response = requests.post(url='https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false',
headers=headers, data=data)
# 休眠随机时间
sleep_time = random.uniform(0, 5)
time.sleep(sleep_time)
get_json(response.json())
图8
我需要的数据:工资、工资经验、地区、学历、行业,构成字典直接存入MongoDB中
def get_json(content):
a = content.get('content').get('positionResult').get('result')
city, jod_year, experience, XL, ave_money, business = [], [], [], [], [], []
for i in a:
city.append(i.get('city'))
jod_year.append(i.get('workYear'))
XL.append(i.get('education'))
ave_money.append((i.get('salary')))
business.append(i.get('industryField'))
for i in range(len(city)):
data = {'ave_money': ave_money[i], 'HY': business[i], 'job_year': jod_year[i], 'XL': XL[i], 'zone': city[i]}
print(data)
在这挖个坑,之后我会更新如何逆向出cookie的生成逻辑。