这是一次失败的尝试 , 事情是这样的……

1.起因
前段时间刚刚学完爬虫,于是准备找个项目练练手。因为想要了解一下“数据挖掘”的职位招聘现状,所以我打算对‘智联招聘’下手了。网上当然也有很多教程,但是套路基本就是那几种情况,看起来也不是特别困难,我充满信心地开始了尝试。

2.分析网站数据
使用工具:谷歌浏览器、pycharm

首先利用谷歌浏览器查看网页源码,发现在源码里找不到职位信息,所以判断职位信息是通过AJAX方式动态加载的。

于是,我采用谷歌浏览器的开发者工具进行抓包分析数据。

找到动态加载的文件后,分析该数据请求浏览器是怎么完成的。查看数据请求头信息,可以找到请求的URL。再看请求方式,是Post请求。于是分析post请求提交的参数。

_v: 0.14465550
x-zp-page-request-id: 6eed1fcaea9c498bab35d6943c3de160-1584539231050-802211
x-zp-client-id: d09f083d-3339-4053-9687-34318fe5b0f6
MmEwMD: 5HFRnmn4UlsY9o8zY2_zIQ0p5dKimKzxXlr6pjGK……

很显然这是经过加密的几个参数,而且与时间戳有关。网上有关于解密的算法,但是如今的智联网站多了一层加密,就是‘MmEwMD:’参数。而且经过观察,这是几个参数是拼接在网址后面组合成数据请求的URL的,网上没有关于这方面的案例,因此强行爬取怕是不行,臣妾做不到啊!

3.终极爬取方式 - 无头浏览器
既然强攻不行,就不得不用爬虫的终极解决办法,就不信敲不开智联的“大门”。

“工欲善其事,必先利其器。”

因此,这里需要安装第三方库:selenium,并下载配置无头浏览器。有一个坑需要注意,就是pyhton已经不支持 phantomjs,所以我选择了Chromedriver(要与自己的谷歌浏览器版本相匹配)
万事俱备只欠东风,一切准备妥当后,开始爬取尝试。

数次尝试,发现总是报错,一番查看之后发现无头浏览器总是停留在初始页面,职位信息加载不出职位信息,我只好再次通过无头浏览器抓包查看问题出在哪一步。

于是,我发现了动态加载请求文件的方式错了,本该是POST请求,现在提交的是OPTIONS请求,所以返回状态码400的错误。无头浏览器本应于普通浏览器一样,但是这里无头浏览器的请求方式却有变化。

我猜想应该是智联网站采取了更严谨的反爬措施,能够识别无头浏览器。唉,费了老大劲,结果连职位信息的影子都没见着,技艺不精还需继续学习才好!

4.初次爬取,终于失败

从现在来看,要想爬取智联网站有两种方案可行:

1.破解网站加密算法,并模拟加密算法

2.修改无头浏览器请求数据方式,或者获得数据请求参数。

可是,不管哪一种方法,都很难实现。虽然这次没有爬取成功,但这是一次‘顺藤摸瓜’的探索的过程,等到技术精湛的时候再来尝试!

奉上这糟糕的代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC # 内置预期条件函数,具体API请参考此小节后API链接
from selenium.webdriver.common.by import By # 内置定位器策略集
#引入按键包
# from selenium.webdriver.common.keys import Keys
from lxml import etree
import time
import hashlib
# import ssl
# ssl._create_default_https_context = ssl._create_unverified_context
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
# 过滤出数据请求中的headers
def getHttpInfo(browser):for responseReceived in browser.get_log('performance'):try:response = json.loads(responseReceived[u'message'])[u'message'][u'params'][u'response']if 'ajaxUrl' in response['url']:# print(response)# print(response['url'])# print(response['headers'])# print(response['headersText'])return response['requestHeaders']except:passreturn None
# 请求页面 并设置headers到文件中
def setHeaders():d = DesiredCapabilities.CHROMEd['loggingPrefs'] = { 'performance':'ALL' }options=webdriver.ChromeOptions()options.set_headless()options.add_argument('--disable-gpu')driver=webdriver.Chrome(desired_capabilities=d,options=options)driver.get('http://www.baidu.com')sleep(20)headers = getHttpInfo(driver)driver.quit()# write headerhand = open('header.txt', 'w')hand.write(json.dumps(headers))hand.close()
chrome_options = Options()
#后面的两个是固定写法隐藏界面
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 构建浏览器对象
path = r'C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chromedriver.exe'
browser = webdriver.Chrome(executable_path=path,chrome_options=chrome_options)
# 获取网页文件,保存在文件中,page_source为JS动态加载后的页面
url = 'https://sou.zhaopin.com/?jl=765&kw=%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98&kt=3'
# 设置user-agent
user_ag='Win7+ie9:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; Tablet PC 2.0; .NET4.0E)'
chrome_options.add_argument('user-agent=%s'%user_ag)
# 隐式的等待
# browser.implicitly_wait(3)
browser.get(url)
# 找到弹窗并点击消除
elem = browser.find_element_by_xpath(r'//div[@class="risk-warning__content"]/button').click()
print(getHttpInfo(browser))
WebDriverWait(browser, 20, 0.5).until(EC.presence_of_all_elements_located((By.CLASS_NAME,'contentpile__content'))) #使用expected_conditions自带验证函数
browser.save_screenshot('zhilain.png')
js = 'document.documentElement.scrollTop=10000'
browser.execute_script(js)
time.sleep(3)
# 保存网页截图
html = browser.page_source
print(html)
browser.get_screenshot_as_file('test.png')
browser.quit()
''' #####解密########(来源于网络)
# 经过分析_v就是一个随机的8位小数
# x-zp-page-request-id 由三部分组成,32位随机数据通过md5简单加密得到+ 当前时间戳 + 随机数6位
# 想办法用python简单实现所谓的加密算法x-zp-page-request-id
# 1、生成一个随机32位数id
md5 = hashlib.md5()
id = str(random.random())
md5.update(id.encode('utf-8'))
random_id = md5.hexdigest()
#  2、生成当前时间戳
now_time = int(time.time() * 1000)
#  3、生成随机6位数
randomnumb = int(random.random() * 1000000)
# 组合代码生成x-zp-page-request-id
x_zp_page_request_id = str(random_id) + '-' + str(now_time) + '-' + str(randomnumb)
# print(x_zp_page_request_id)
# 生成_v
url_v = round(random.random(), 8)
# print(url_v)
'''

Python爬取智联招聘职位信息相关推荐

  1. python爬取智联招聘职位信息(单进程)

    我们先通过百度搜索智联招聘,进入智联招聘官网,一看,傻眼了,需要登录才能查看招聘信息 没办法,用账号登录进去,登录后的网页如下: 输入职位名称点击搜索,显示如下网页: 把这个URL:https://s ...

  2. Python爬虫爬取智联招聘职位信息

    目的:输入要爬取的职位名称,五个意向城市,爬取智联招聘上的该信息,并打印进表格中 #coding:utf-8 import urllib2 import re import xlwtclass ZLZ ...

  3. 【Python爬虫案例学习20】Python爬虫爬取智联招聘职位信息

    目的:输入要爬取的职位名称,五个意向城市,爬取智联招聘上的该信息,并打印进表格中 ####基本环境配置: Python版本:2.7 开发工具:pycharm 系统:win10 ####相关模块: im ...

  4. 智联招聘python岗位_Python爬虫爬取智联招聘职位信息

    import urllib2 import re import xlwt '''遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!''' cl ...

  5. java爬取智联招聘职位信息

    第一次写爬虫,案例比较简单,就在智联招聘网站上爬取职位信息. 技术点:IO流,集合,Jsoup使用,以及前端的知识 代码如下: package com.wty.utils;import java.io ...

  6. 爬虫练习二:爬取智联招聘职位信息

    1. 简介 因为想要找到一个数据分析的工作,能够了解到市面上现有的职位招聘信息也会对找工作有所帮助. 今天就来爬取一下智联招聘上数据分析师的招聘信息,并存入本地的MySQL. 2. 页面分析 2.1 ...

  7. pythton爬取智联招聘职位信息

    前言 在智联招聘https://sou.zhaopin.com/时,发现无法直接去解析获得的html文本,它的数据是用js动态加载的,数据内容存储在json文件中,所以不能用以前的方法使用xpath. ...

  8. python爬取智联招聘网_python爬取智联招聘工作岗位信息

    1 # coding:utf-8 2 # auth:xiaomozi 3 #date:2018.4.19 4 #爬取智联招聘职位信息 5 6 7 import urllib 8 from lxml i ...

  9. selenium+PyQuery+chrome headless 爬取智联招聘求职信息

    最近导师让自己摸索摸索Python爬虫,好了就开始一发不可收拾的地步.正巧又碰到有位同学需要一些求职信息对求职信息进行数据分析,本着练练手的目的写了用Python爬取智联招聘网站的信息.这一爬取不得了 ...

最新文章

  1. navicat导数据速度_华为廊坊云数据中心二期1~3期主楼聚氨脂、聚脲防水隔热总承包工程...
  2. 主要几种通信协议的性能比较(转载)
  3. MyBatis——@Result注解column参数传递多个参数
  4. Asp.Net Core获取请求信息/获取请求地址
  5. Wannafly 挑战赛27 题解
  6. python构建二叉树_BinaryTree:学习二叉树的Python库
  7. java .net 3des_Java.net3DES差异及互通
  8. office组件导入导出常见异常记录
  9. ArcGIS pro 发布地图服务(一)动态地图服务
  10. 普通摄像头游戏——空中飞车
  11. 周杰伦一发新歌,服务器为什就挂掉了?
  12. ARM的商业模式和ARM各种版本号区分
  13. 软件领域专利申请的基本特点
  14. 将 Debian APT 引入 iPhone
  15. mysql aborted connection_mysql Aborted connection错误
  16. Wireshark 301: Finding the busiest computers on your network
  17. Python中Tkinter模块的Canvas控件绘制jpg图片到指定区域
  18. 计算机专业背景的大学,不要求专业背景的计算机专业!
  19. NFV和SDN之间到底有什么关系?
  20. linux系统查看日历

热门文章

  1. unity3d 更换项目字体
  2. 纯CSS导航栏下划线滑动效果
  3. Java8日期处理类
  4. 牛客题目——最长公共子串、最长回文子串、兑换零钱
  5. StarCitizen星际公民添加好友一起玩教程
  6. php添加网站ico图标,如何添加网站ICO图标,添加ico图标的方法
  7. 微信小程序遇到的坑系列---小程序上传图片线上失败
  8. 为什么你的拼多多店铺会被降权了
  9. [下载]JEB-2.2.7破解版 for macOS
  10. 仅记录deepin 安装 2007版本Microsoft Office Word/Powerpoint/Excel/Visio