selenium&mitmproxy实现智联招聘数据爬取

本文主要是介绍爬取智联招聘岗位信息的方法。目前网络上的爬取以requests库爬取和API接口解析为主,尝试后发现均不可行。本篇文章介绍的方法在2020年6月25日成功爬取相应数据。由于爬虫具有时效性,希望各位在该方法不可用时予以提醒,作者再进行更新。

1 智联招聘数据爬取难点

1.1 动态网页

智联招聘网站目前采用动态网页,即网页源码与页面展示不同。所以目前使用requests库实现爬取的代码均不可用

1.2 复杂的API接口

通过对智联招聘网站分析,发现数据源自于某个API接口,API接口中包含了大量的变量,人工解析基本不可行。目前针对智联招聘通过解析API接口的方式均不可行

1.3 selenium

作者尝试使用selenium爬取,发现该动态网页使用selenium不可行

2 智联招聘数据爬取的简便路径

首先需要确定想要爬取的岗位数据,隐藏在数据包中,查看该数据包的方法如下:

  1. 在智联招聘搜索某个城市某个岗位
  2. 打开开发者工具
  3. 切换至网络、选择XHR
  4. 找到以sou?开头的链接,response中包含想要爬取的数据
    操作流程1
    操作流程2
    针对response中的数据,可以通过复制粘贴至txt文件实现数据收集。针对某个城市的某个岗位数据,智联招聘提供90*12条数据记录,共12个分页,只需要12次复制粘贴即可采集1080条数据记录。该方法适用于小数据量采集。大批量数据不可行。

3 mitmproxy的抓包操作

首先将赋值粘贴数据包的操作自动化,也就是实现抓吧。mitmproxy的更多介绍参考使用mitmproxy+python做拦截代理

3.1 mitmproxy的安装

系统环境如下:

操作系统:Windows10 家庭中文版 64bit        
Python:anaconda、Python3.7.7

mitmproxy的安装比较简单,在Anaconda Prompt中使用

pip install mitmproxy

即可实现安装。安装完成后,使以下代码验证

mitmweb --version

可以看到相应的版本信息

Mitmproxy: 5.1.1
Python:    3.7.7
OpenSSL:   OpenSSL 1.1.1g  21 Apr 2020
Platform:  Windows-10-10.0.18362-SP0

如果显示

'mitmweb' 不是内部或外部命令,也不是可运行的程序

则需要在mitmproxy官网下载安装mitmproxy软件,按照正常安装exe文件方式进行,并将安装后的软件添加到系统环境变量。再次测试是否安装成功即可。
mitmproxy在Windows系统下可用的是mitmweb和mitmdump,mitmweb以web形式展示各种flow,mitmdump则为静默模式。

3.2 mitmproxy实现数据抓包

使用mitmproxy实现抓包,主要有三步:一是启用mitmproxy实现对浏览器的监听;二是以特定的方式打开谷歌浏览器;三是访问相应的网页。

mitmproxy监听
启用mitmproxy的方式比较容易,在Anaconda Prompt中使用mitmweb即可。但是单纯的监听无法实现数据包抓取,所以需要加载自定义的python代码。
启动代码

mitmweb -s addons.py

addons.py即是自定义的python脚本,实现对数据包的抓取。通过对智联招聘数据包链接的分析,建立了如下的python脚本

import mitmproxy.http
from mitmproxy import ctx

url_paths = '/c/i/sou?_v='
class Jobinfo:
    def response(self, flow: mitmproxy.http.HTTPFlow):
        if flow.request.path.startswith(url_paths):
            text = flow.response.get_text()
            file_handle=open('0624.txt',mode='a')
            file_handle.write(text)
            file_handle.write('\n')
            file_handle.write('\n')
            file_handle.close()
        return
    
addons = [
    Jobinfo()
]

关于代码的更多介绍,参考智联招聘数据爬取(基础篇)

以特定方式打开浏览器
启用mitmweb后,会在默认浏览器打开网页实现对谷歌浏览器的监听,为了方便后续观察,必须使用非谷歌浏览器进行观看。且在以特定方式打开谷歌浏览器以前,必须完全关闭谷歌浏览器
具体的打开方式是在cmd中使用如下代码打开

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=127.0.0.1:8080 --ignore-certificate-errors --user-data-dir=D:\\360Downloads\\AutomationProfile

上述代码的第一部分是谷歌浏览器的可执行文件在电脑中的路径;--proxy-server=127.0.0.1:8080 是以8080端口打开,这也是mitmproxy的默认监听端口;--ignore-certificate-errors 是忽略证书错误,使用mitmproxy监听后,谷歌浏览器直接与mitmproxy之间交互,存在证书问题,忽略证书错误,保证后续流程的正常进行;--user-data-dir是指定一个空文件夹(该文件夹名字是AutomationProfile)用于记录谷歌浏览器的设定信息,该选项在selenium操作浏览器时有用。

访问相应页面
在第2步打开的浏览器中,访问智联招聘的网站,搜索“数据分析师”等岗位信息,则可以将数据包的岗位信息保存在指定的txt文档中。
爬取数据棘突
随着逐步翻页,所浏览页面的岗位数据将被下载至指定txt文件。

3.3 selenium与mitmproxy实现自动化数据爬取

在3.2中存在的问题是,仍然需要自己访问各个页面,现在使用selenium实现自动化页面访问。

selenium的安装
selenium的安装比较简单,主要是下载合适webdriver与谷歌浏览器相适配,博客较多,不多赘述。

selenium以特定方式打开谷歌浏览器
在3.2节中,首先要以特定的方式打开谷歌浏览器,然后访问具体页面,相应的代码如下

from selenium import webdriver

options = webdriver.ChromeOptions() #获取谷歌浏览器选项
options.add_argument('--proxy-server=127.0.0.1:8080') # 以8080端口启动谷歌浏览器
options.add_argument('--ignore-certificate-errors') # 忽略证书错误
options.add_argument('--user-data-dir=D:\\360Downloads\\AutomationProfile') #指定用户文件夹
driver = webdriver.Chrome(chrome_options=options) #使用修改后的浏览器选项启动浏览器

以特定方式打开谷歌浏览器后,然后访问相应的页面,代码如下

url = 'https://sou.zhaopin.com/?jl=530&kw=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88&kt=3'
driver.get(url)
time.sleep(random.randint(10,30))
base_url_1 = 'https://sou.zhaopin.com/?p='
base_url_2 = '&jl=530&kw=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88&kt=3'
for i in range(2,13):
    true_url = base_url_1+str(i)+base_url_2
    print(i)
    driver.get(true_url)
    time.sleep(random.randint(10,30))
driver.close()

以上代码是实现对智联招聘12页数据的自动化访问。

两个反爬虫技巧

  1. 智联招聘禁止selenium的访问
    针对禁止访问情况,主要是借鉴移除Selenium中的window.navigator.webdriver的内容,代码如下
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
  1. 智联招聘只对未登录用户开放前6页数据
    简单方案就是登录就可以了,这就体现了设置--user-data-dir的好处了,可以将登录信息保存在这个文件夹中。具体操作是,首先使用以下代码启动谷歌浏览器,然后打开智联招聘网站手动登录。
    登录以后,相应的信息会保存在AutomationProfile文件夹中,然后使用selenium控制浏览器访问相应页面即可。
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=127.0.0.1:8080 --ignore-certificate-errors --user-data-dir=D:\\360Downloads\\AutomationProfile

通过上述设定,就可以实现对12页数据的爬取。需要说明的是,登录以后的数据包链接会发生变化,相应的addons.py的url也需要进行更新。

4 爬虫全流程梳理

4.1 准备工作

  1. 下载安装anaconda
  2. 在Anaconda Prompt中使用pip install mitmproxy安装mitmproxy
  3. 安装谷歌浏览器并设置为默认浏览器
  4. 使用下述代码在cmd中打开谷歌浏览器,并打开智联招聘网站,手动登录
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --proxy-server=127.0.0.1:8080 --ignore-certificate-errors --user-data-dir=D:\\360Downloads\\AutomationProfile

4.2 python脚本

  1. mitmproxy使用的下载网页岗位数据的python脚本(下述代码一
import mitmproxy.http
from mitmproxy import ctx
#下面的url_paths每个人都是不同的,可以参考具体链接的requests更新
url_paths = '/c/i/sou?at=1cf9e6c0fa534c7bb12550a4901dbbbd&rt=a9aa0b7d87c74cf1811b1e9d34f6826b&_v='
class Jobinfo:
    def response(self, flow: mitmproxy.http.HTTPFlow):
        if flow.request.path.startswith(url_paths):
            text = flow.response.get_text()
            file_handle=open('0625.txt',mode='a')
            file_handle.write(text)
            file_handle.write('\n')
            file_handle.write('\n')
            file_handle.close()
        return
    
addons = [
    Jobinfo()
]
  1. selenium操作浏览器的脚本(下述代码二
from selenium import webdriver
import time
import random

options = webdriver.ChromeOptions()
# 下面代码为设置端口、忽略证书错误以及指定文件夹
options.add_argument(('--proxy-server=127.0.0.1:8080'))
options.add_argument("--ignore-certificate-errors")
options.add_argument('--user-data-dir=D:\\360Downloads\\AutomationProfile')
# 下面代码为避免网站对selenium的屏蔽
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})
# 以设定好的方式打开谷歌浏览器
driver = webdriver.Chrome(chrome_options=options)

#依次访问各网页,访问后关闭浏览器
url = 'https://sou.zhaopin.com/?jl=530&kw=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88&kt=3'
driver.get(url)
time.sleep(random.randint(10,30))
base_url_1 = 'https://sou.zhaopin.com/?p='
base_url_2 = '&jl=530&kw=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90%E5%B8%88&kt=3'
for i in range(2,13):
    true_url = base_url_1+str(i)+base_url_2
    print(i)
    driver.get(true_url)
    time.sleep(random.randint(10,30))
driver.close()

4.3 爬虫操作

  1. 在Anaconda Prompt中使用如下代码启用mitmweb,并指定自定义python脚本,addons0625.py即代码一。
mitmweb -s 'D:\\360Downloads\\addons0625.py'
  1. 在Spyder中运行代码二
  2. 等待运行完成,爬虫成功
  3. 解析爬取的数据。由于数据包是json文件,需要用python对数据进行解析,相应解析代码参考智联招聘数据爬取(踩坑篇)

总结

本篇文章对爬取智联招聘网站数据进行简单描述,部分细节可能介绍不到位,关于智联招聘数据爬取的详细介绍版本可参考公众号内的智联招聘数据爬取系列文章。
在这里插入图片描述

posted @ 2020-06-28 17:44  数据匠  阅读(1044)  评论(0)    收藏  举报