一.主要目的:

最近在玩Python网络爬虫,然后接触到了selenium这个模块,就捉摸着搞点有意思的,顺便记录一下自己的学习过程。

二.前期准备:

  • 操作系统:windows10

  • 浏览器:谷歌浏览器(Google Chrome)

  • 浏览器驱动:chromedriver.exe (我的版本—>89.0.4389.128 )

    • 浏览器驱动需要根据你自己当前浏览器的版本来进行下载
    • 链接 http://chromedriver.storage.googleapis.com/index.html
  • 程序中我使用的模块

    • import csv
      import os
      import re
      import json
      import timeimport requests
      from selenium.webdriver import Chrome
      from selenium.webdriver.remote.webelement import WebElement
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import ui
      from selenium.webdriver.support import expected_conditions
      from lxml import etreechrome = Chrome(executable_path='chromedriver')
      
    • 用的的第三方包均可用 pip install 进行安装

    • 上面代码中的最后一行表示创建一个浏览器对象

三.思路分析:

  1. 大致看了一下网站主页,需要先登录后才能进行信息的获取,所以只能先模拟登录。


进入登录页面的时候是显示二维码登录,我们不用这个,因为确实不怎么方便,我们通过模拟点击页面上的按钮进入到账号、密码登录的页面输入进行登录。下面是如何驱动浏览器进行上述的一系列操作⬇⬇⬇⬇⬇⬇

# 获取登录页面
chrome.get(url)
# 找出账号密码登录的页面
chrome.find_element_by_class_name('zppp-panel-qrcode-bar__triangle').click()
chrome.find_element_by_xpath('//div[@class="zppp-panel-normal__inner"]/ul/li[2]').click()
# 找到账户密码的交互接口并进行输入
user_name = chrome.find_elements_by_xpath('//div[@class="zppp-input__container"]/input')[0]
pass_word = chrome.find_elements_by_xpath('//div[@class="zppp-input__container"]/input')[1]
# 进行需要登录的账号密码输入
user_name.send_keys('**********')
pass_word.send_keys('***********')
# 输入完成后点击登录
chrome.find_element_by_class_name('zppp-submit').click()# 此处手动实现滑块验证
# 动动你的小鼠标
  1. 登陆后大致看了一下主页决定先从城市开始爬,在它的原文件中分析出它的位置,如图↓

我用的是requests请求获取到网页原文件,再使用正则匹配到我们需要的内容(就是上图中那一坨红色的↑),之后再进行一系列的解析获取到每个城市与其对应的url ⬇⬇⬇⬇⬇⬇

resp = requests.get(url, headers=headers)if resp.status_code == 200:html = resp.textjson_data = re.search(r'<script>__INITIAL_STATE__=(.*?)</script>', html).groups()[0]data = json.loads(json_data)cityMapList = data['cityList']['cityMapList']  # dictfor letter, citys in cityMapList.items():# print(f'-----{letter}-------')for city in citys:  # citys 是个列表,里面嵌套的字典'''{'name': '鞍山','url': '//www.zhaopin.com/anshan/','code': '601','pinyin': 'anshan'}'''city_name = city['name']city_url = 'https:' + city['url']

此处我们获取的是所有的城市和它url,如果都要进行爬取的话数据量略大,因此我们可以筛选出需要爬取的城市减轻工作量,反正爬取城市我们想怎么改就怎么改哈哈哈哈哈。

  1. 接下来我们就可以进行工作的查找了,既然我们用的是Python来爬取的,那就查询Python相关的工作吧。

    首先还是要找到输入搜索信息的框框并找出它的接口,然后进行输入(这里输入的是Python),输入完成后找到右边的搜索按钮(就是那个放大镜)进行点击操作,下面是模拟浏览器操作的代码实现⬇⬇⬇⬇⬇

    # 根据class_name 查询WebElement找出输入的位置
    input_seek: WebElement = chrome.find_element_by_class_name('zp-search__input')
    input_seek.send_keys('Python')  # 输入Python
    click: WebElement = # 找出搜索 按钮并点击chrome.find_element_by_xpath('//div[@class="zp-search__common"]//a')
    click.click()chrome.switch_to.window(chrome.window_handles[1])
    

    这里就有一个需要注意的地方了:在输入Python点击搜索按钮后会弹出一个新的窗口,而驱动浏览器的 程序还在第一个窗口,因此需要使用 swiitch_to_window(chrome.window_handles[n]) --<n表示目标窗口的 位置,最开始的第一个窗口是0> 方法进行窗口的切换。

    1. 数据的解析和提取

很明显可以看出需要的信息都在 class="positionlist "下,进一步分析可知数据都在 a标签下,接下来就可以使用Xpath进行数据的提取⬇⬇⬇⬇⬇

root = etree.HTML(html)divs = root.xpath('//div[@class="positionlist"]')  # element对象for div in divs:   # 岗位     # 里面对应的是一个个列表position = div.xpath('.//a//div[@class="iteminfo__line1__jobname"]/span[1]')  # 公司company = div.xpath('//a//div[@class="iteminfo__line1__compname"]/span/text()') # 薪资money = div.xpath('.//a//div[@class="iteminfo__line2__jobdesc"]/p/text()')  # 位置city = div.xpath('//a//div[@class="iteminfo__line2__jobdesc"]/ul/li[1]/text()') # 经验experience =                              div.xpath('.//a//div[@class="iteminfo__line2__jobdesc"]/ul/li[2]/text()') # 学历education =    div.xpath('.//a//div[@class="iteminfo__line2__jobdesc"]/ul/li[3]/text()')  # 规模scale = div.xpath('.//a//div[@class="iteminfo__line2__compdesc"]/span[1]/text()') # 人数people = div.xpath('.//a//div[@class="iteminfo__line2__compdesc"]/span[2]/text()')
  1. 获取下一页

    找到下一页按钮并模拟浏览器进行点击,获取到每一页所有的数据。

四.具体源代码

import csv
import os
import re
import json
import timeimport requests
from selenium.webdriver import Chrome
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.common.by import By
from selenium.webdriver.support import ui
from selenium.webdriver.support import expected_conditions
from lxml import etreechrome = Chrome(executable_path='chromedriver')# 模拟登录
def login(url):# 获取登录页面chrome.get(url)# 找出账号密码登录的页面chrome.find_element_by_class_name('zppp-panel-qrcode-bar__triangle').click()chrome.find_element_by_xpath('//div[@class="zppp-panel-normal__inner"]/ul/li[2]').click()# 找到账户密码的交互接口并进行输入user_name = chrome.find_elements_by_xpath('//div[@class="zppp-input__container"]/input')[0]pass_word = chrome.find_elements_by_xpath('//div[@class="zppp-input__container"]/input')[1]# 此处输入登录智联招聘的账号密码user_name.send_keys('***********')pass_word.send_keys('**********')# 输入完成后点击登录chrome.find_element_by_class_name('zppp-submit').click()# 此处手动实现滑块验证# 动动手指滑一划完成登录time.sleep(10)get_allcity('https://www.zhaopin.com/citymap')# 在登录状态下进行所有城市信息的获取def get_allcity(url):resp = requests.get(url, headers=headers)if resp.status_code == 200:html = resp.textjson_data = re.search(r'<script>__INITIAL_STATE__=(.*?)</script>', html).groups()[0]data = json.loads(json_data)cityMapList = data['cityList']['cityMapList']  # dictfor letter, citys in cityMapList.items():# print(f'-----{letter}-------')for city in citys:  # citys 是个列表,里面嵌套的字典'''{'name': '鞍山','url': '//www.zhaopin.com/anshan/','code': '601','pinyin': 'anshan'}'''city_name = city['name']city_url = 'https:' + city['url']# 筛选城市query_citys = ('成都')if city_name in query_citys:print(f'正在获取{city_name}的信息')get_city_job(city_url)time.sleep(3)else:# print(f'{city_name} 不在搜索范围内!')passelse:print('网页获取失败')def get_city_job(url):chrome.get(url)  # 打开城市信息# 根据class_name 查询WebElement找出输入的位置input_seek: WebElement = chrome.find_element_by_class_name('zp-search__input')input_seek.send_keys('Python')  # 输入Pythonclick: WebElement = chrome.find_element_by_xpath('//div[@class="zp-search__common"]//a')  # 找出搜索按钮并点击click.click()# 切换到第二个页面chrome.switch_to.window(chrome.window_handles[1])time.sleep(1)time.sleep(1)# 等待class_name为“sou-main__list” div元素出现ui.WebDriverWait(chrome, 30).until(expected_conditions.visibility_of_all_elements_located((By.CLASS_NAME, 'sou-main__list')),'查找的元素一直没有出现')# 判断当前查询结果是否不存在no_content = chrome.find_elements_by_class_name('positionlist')if not no_content:print('当前城市未查找到Python岗位')else:# 提取查找结果parse(chrome.page_source)def parse(html):root = etree.HTML(html)divs = root.xpath('//div[@class="positionlist"]')  # element对象items = {}for div in divs:# 岗位position = div.xpath('.//a//div[@class="iteminfo__line1__jobname"]/span[1]')  # 公司company = div.xpath('//a//div[@class="iteminfo__line1__compname"]/span/text()') # 薪资money = div.xpath('.//a//div[@class="iteminfo__line2__jobdesc"]/p/text()')  # 位置city = div.xpath('//a//div[@class="iteminfo__line2__jobdesc"]/ul/li[1]/text()') # 经验experience =  div.xpath('.//a//div[@class="iteminfo__line2__jobdesc"]/ul/li[2]/text()')  # 学历education =  div.xpath('.//a//div[@class="iteminfo__line2__jobdesc"]/ul/li[3]/text()')  # 规模scale = div.xpath('.//a//div[@class="iteminfo__line2__compdesc"]/span[1]/text()') # 人数people = div.xpath('.//a//div[@class="iteminfo__line2__compdesc"]/span[2]/text()') for position_, company_, money_, city_, experience_, education_, scale_, people_ in zip(position, company,money, city, experience,education, scale,people):# title="python爬虫工程师" 获取它的title属性值string = position_.attrib.get('title')  items['position'] = stringitems['company'] = company_items['money'] = money_.strip()items['city'] = city_items['experience'] = experience_items['education'] = education_items['scale'] = scale_items['people'] = people_itempipeline(items)# 获取下一页next_page()def itempipeline(items):has_header = os.path.exists(save_csv)  # 文件头with open(save_csv, 'a', encoding='utf8') as file:writer = csv.DictWriter(file, fieldnames=items.keys())if not has_header:writer.writeheader()  # 写入文件头writer.writerow(items)def next_page():# 找到下一页按钮time.sleep(0.5)button = chrome.find_elements_by_xpath('//div[@class="soupager"]/button[@class="btn soupager__btn"]')if not button:print(f'获取完毕,请在 {save_csv} 里查看!!')exit()else:button[0].click()  # 点击下一页time.sleep(1)parse(chrome.page_source)if __name__ == '__main__':n = 0headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3823.400 QQBrowser/10.7.4307.400','Cookie': 'aQQ_ajkguid=B4D4C2CC-2F46-D252-59D7-83356256A4DC; id58=e87rkGBclxRq9+GOJC4CAg==; _ga=GA1.2.2103255298.1616680725; 58tj_uuid=4b56b6bf-99a3-4dd5-83cf-4db8f2093fcd; wmda_uuid=0f89f6f294d0f974a4e7400c1095354c; wmda_new_uuid=1; wmda_visited_projects=%3B6289197098934; als=0; cmctid=102; ctid=15; sessid=E454865C-BA2D-040D-1158-5E1357DA84BA; twe=2; isp=true; _gid=GA1.2.1192525458.1617078804; new_uv=4; obtain_by=2; xxzl_cid=184e09dc30c74089a533faf230f39099; xzuid=7763438f-82bc-4565-9fe8-c7a4e036c3ee'}save_csv = 'chengdu-python.csv'login('https://passport.zhaopin.com/login?bkUrl=%2F%2Fi.zhaopin.com%2Fblank%3Fhttps%3A%2F%2Fwww.zhaopin.com%2Fbeijing%2F')

五.部分成果展示

六.总结

个人认为智联的反爬还是比较友好的,为什么呢?因为之前在测试程序的时候模拟登录了好几十次,都是在短时间内,而且一开始比较担心IP被封但是最后也没出什么问题。还有就是selenium受网速影响比较大,等待时间设置过长吧,会影响程序速度,但是时间过短吧又会损数据。

selenium实现zhilian招聘的爬取相关推荐

  1. seleniummitmproxy实现智联招聘数据爬取

    目录 1 智联招聘数据爬取难点 1.1 动态网页 1.2 复杂的API接口 1.3 selenium 2 智联招聘数据爬取的简便路径 3 mitmproxy的抓包操作 3.1 mitmproxy的安装 ...

  2. 招聘数据爬取、数据处理与可视化(v2--解析JS渲染页面)

    招聘数据爬取.数据处理与可视化(v2--解析JS渲染页面) 更新说明 程序说明 数据爬取 观察网页结构 页面解析 将数据写入csv文件中 通过观察页面链接,爬取所有页面 爬虫程序完整代码 爬取数据结果 ...

  3. 【2020-10-27】 scrapy爬虫之猎聘招聘信息爬取

    声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! scrapy爬虫之猎聘招聘信息爬取 1.项目场景 目标网址:https://www.liepin.com/zhao ...

  4. 前程无忧招聘信息爬取

    爬取前程无忧招聘信息 本文是关于招聘数据爬取,我们选取的网站是前程无忧. 百度直接搜索前程无忧,或者51job.我们将看到搜索栏,在搜索栏中输入"数据分析师"将可以看到工作信息. ...

  5. Selenium解决动态渲染页面----爬取网易云音乐全部评论

    爬取网易云音乐全部评论,我们先随便找一首歌,这里以毛不易的水乡为例.毛不易–水乡 一.常规方法 1. 尝试直接爬取 先直接用歌曲链接直接爬取 import requests#URL url = 'ht ...

  6. Python爬虫【三】爬取PC网页版“微博辟谣”账号内容(selenium单页面内多线程爬取内容)

    专题系列导引   爬虫课题描述可见: Python爬虫[零]课题介绍 – 对"微博辟谣"账号的历史微博进行数据采集   课题解决方法: 微博移动版爬虫 Python爬虫[一]爬取移 ...

  7. Python+Selenium动态网页的信息爬取

    录 一.Selenium 1.1 简介 1.2 配置 二.对百度进行自动化测试 2.1 进入百度搜索界面 2.2 自动填充百度网页的查询关键字并完成自动搜索 三.爬取指定网页的名言 3.1 找到元素 ...

  8. python拉勾网招聘信息爬取(单线程,最新)

    一.任务描述 爬取拉勾网发布的关于"会计"岗位的招聘信息,通过查询相关文章发现,普遍都是使用单线程对网站信息进行爬取,且拉勾网经过多次维护更新,对简单的爬取代码有反爬虫机制,例如不 ...

  9. 手把手Selenium安装使用及实战爬取前程无忧招聘网站(一)

    目录 一.安装浏览器驱动器 1. 下载驱动器 2. 启动驱动器 二 .selenium的使用 1. 启动驱动器加载网页 2. 八大元素定位 (1)id 定位 (2)name定位 (3)link_tex ...

最新文章

  1. 【Java8新特性】关于Java8的Stream API,看这一篇就够了!!
  2. 页面导航的两种方式——声明式导航、编程式导航||vue-router编程式导航||router.push() 方法的参数规则
  3. SilverLigth的Chart不要图例(Legend)的方法
  4. python从random生成列表_Python 学习DAY 17 列表生成式,生成器,迭代器,time模块,random模块...
  5. PyTorch | torch.tensor使用方法,如何使用torch.tensor
  6. visual stdio打开之后与屏幕尺寸不匹配_柔和点亮桌面,让眼睛更舒服,雷神屏幕挂灯L1体验...
  7. java控制硬件_厨师都开始用Python和Java了,现在C语言还值得我们学习吗?
  8. 2021年C++项目中的十大Bug:乍一看都正确的代码,实则暗藏玄机
  9. 9.linux ntp服务器搭建
  10. HTML5本地存储与会话存储
  11. 一道计算时间的机试题
  12. 【洛谷P1282】多米诺骨牌
  13. ASP.NET Web Pages - WebGrid 帮助器
  14. 基于树莓派的人脸识别门禁系统
  15. lavaral中文手册_Laravel5.3手册下载
  16. 苏宁金科CTO肖军:如何让1000人+的团队持续打胜仗,从找人,到育人,到用人具体怎么做?...
  17. Java 打开资源管理器
  18. 一篇文章带你理清宽带、带宽、网速、吞吐量与宽带上下行
  19. Android项目实践(四)——音乐播放器APP
  20. 手工选出的股票池和量化选股模型选出的股票池有哪些区别?

热门文章

  1. 深圳市怎么样 官田学校介绍
  2. Java中的集合---------Collections 类---集合的工具类 Comparator比较器
  3. windows 11 安装jdk1.8
  4. com.android.ut是什么文件,妙用UT数据文件夹%AppData%\uTorrent
  5. mediasoup transport dtls
  6. 电动汽车蓄电池你了解多少?
  7. 医疗保险前台系统数字字典
  8. 一文彻底理解:训练集,验证集,测试集,交叉验证
  9. 【 微信小程序 】behaviors
  10. firebird嵌入版数据使用