网页分析

url = https://www.lagou.com/jobs/list_python?

拉钩网中每块信息都是动态异步的 爬取方式
1.分析ajax接口(不推荐,因为拉钩网防爬手段很多)
2.selenium模拟浏览器爬取
这里采用selenium爬取

逻辑分析:
1.模拟打开列表页分析爬取列表页中所有职位url
2.模拟打开所有职位url获取源代码
3.解析源代码获取需要的数据
4.将一页数据存储到csv文件中
5.爬取完一页数据后点击列表页下一页按钮

定义init函数

因为这里使用类的方式,首先声明__init__

class LagouSpider(object):keyword = 'python'#这里输入查找关键字driver_path = r"C:\Downloads\driver\chromedriver.exe"#driver路径def __init__(self):self.driver=webdriver.Chrome(executable_path=LagouSpider.driver_path)#使用谷歌浏览器self.url = 'https://www.lagou.com/jobs/list_%s?labelWords=&fromSearch=true&suginput='%LagouSpider.keyword#列表页urlself.positions = []#存储一页信息的全局变量

实现循环爬取所有页

    def run(self):self.driver.get(self.url)#打开列表页num = 1while True:WebDriverWait(driver=self.driver, timeout=10).until(EC.presence_of_all_elements_located((By.XPATH, "//div[@class='pager_container']/span[last()]")))  # 显示等待页面加载完全source = self.driver.page_source#得到列表页源代码self.parse_list_page(source)#将源代码传入函数中分析self.story()#执行存储函数print('存储好'+str(num)+'页')try:next_btn=self.driver.find_element_by_xpath("//div[@class='pager_container']//span[@class='pager_next ']")#定位下一页点击按钮if "pager_next pager_next_disabled" in next_btn.get_attribute("class"):#如果到达最后一页则停止passelse:self.driver.execute_script("arguments[0].click();", next_btn)num+=1except:print(source)time.sleep(1)

定义run()方法实现循环爬取
模拟点击不是用click()而是用了self.driver.execute_script(“arguments[0].click();”, next_btn)
测试的时候报错说按钮被覆盖,所以这里用了js的方法来点击按钮

解析列表页源代码,获取所有职位url

   def parse_list_page(self,source):html = etree.HTML(source)links=html.xpath("//a[@class='position_link']/@href")for link in links:self.request_detail_page(link)time.sleep(1)

请求职位url

    def request_detail_page(self,url):# self.driver.get(url)self.driver.execute_script("window.open('%s')"%url)#在新标签中打开urlself.driver.switch_to.window(self.driver.window_handles[1])#切换到职位urlWebDriverWait(self.driver,timeout=10).until(EC.presence_of_all_elements_located((By.XPATH,"//h1[@class='name']")))#等待数据加载完全source = self.driver.page_sourceself.parse_detial_page(source)#将源代码传入下个函数self.driver.close()#关闭职位urlself.driver.switch_to.window(self.driver.window_handles[0])#切换回到列表页

分析职位url源代码,获取想要的数据

    def parse_detial_page(self,source):html = etree.HTML(source)position_name = html.xpath("//h1[@class='name']/text()")[0]job_request_spans = html.xpath('//dd[@class="job_request"]//span//text()')salary = job_request_spans[0].strip()city = job_request_spans[1].strip()city = re.sub(r"[\s/]", '', city)work_years = job_request_spans[2].strip()work_years = re.sub(r"[\s/]", '', work_years)eduction = job_request_spans[3].strip()eduction = re.sub(r"[\s/]", '', eduction)desc = " ".join(html.xpath("//dd[@class='job_bt']//text()")).strip()company_name = html.xpath("//h3[@class='fl']/em//text()")[0].strip()# print(desc)position = {'name':position_name,'company_name':company_name,'salary':salary,'city':city,'work_years':work_years,'eduction':eduction,'desc':re.sub('\n','',desc)}self.positions.append(position)#传入全局变量

存储方法

  def story(self):with open('position.csv','a',encoding='utf_8_sig') as fp:fileheaders = ['name','company_name','salary','city','work_years','eduction','desc']writer = csv.DictWriter(fp, fieldnames=fileheaders)writer.writeheader()writer.writerows(self.positions)

这里需要用encoding='utf_8_sig’可以即不报编码错误,也不会使csv文件中文出现乱码

定义执行方法

if __name__ == '__main__':spyder = LagouSpider()spyder.run()

最后附上完整代码

from selenium import webdriver
from lxml import etree
import re
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import csvclass LagouSpider(object):keyword = 'python'#这里输入查找关键字driver_path = r"C:\Downloads\driver\chromedriver.exe"#driver路径def __init__(self):self.driver=webdriver.Chrome(executable_path=LagouSpider.driver_path)#使用谷歌浏览器self.url = 'https://www.lagou.com/jobs/list_%s?labelWords=&fromSearch=true&suginput='%LagouSpider.keyword#列表页urlself.positions = []#存储一页信息的全局变量def run(self):self.driver.get(self.url)#打开列表页num = 1while True:WebDriverWait(driver=self.driver, timeout=10).until(EC.presence_of_all_elements_located((By.XPATH, "//div[@class='pager_container']/span[last()]")))  # 显示等待页面加载完全source = self.driver.page_source#得到列表页源代码self.parse_list_page(source)#将源代码传入函数中分析self.story()#执行存储函数print('存储好'+str(num)+'页')try:next_btn=self.driver.find_element_by_xpath("//div[@class='pager_container']//span[@class='pager_next ']")#定位下一页点击按钮if "pager_next pager_next_disabled" in next_btn.get_attribute("class"):#如果到达最后一页则停止passelse:self.driver.execute_script("arguments[0].click();", next_btn)num+=1except:print(source)time.sleep(1)def parse_list_page(self,source):html = etree.HTML(source)links=html.xpath("//a[@class='position_link']/@href")for link in links:self.request_detail_page(link)time.sleep(1)def request_detail_page(self,url):# self.driver.get(url)self.driver.execute_script("window.open('%s')"%url)#在新标签中打开urlself.driver.switch_to.window(self.driver.window_handles[1])#切换到职位urlWebDriverWait(self.driver,timeout=10).until(EC.presence_of_all_elements_located((By.XPATH,"//h1[@class='name']")))#等待数据加载完全source = self.driver.page_sourceself.parse_detial_page(source)#将源代码传入下个函数self.driver.close()#关闭职位urlself.driver.switch_to.window(self.driver.window_handles[0])#切换回到列表页def parse_detial_page(self,source):html = etree.HTML(source)position_name = html.xpath("//h1[@class='name']/text()")[0]job_request_spans = html.xpath('//dd[@class="job_request"]//span//text()')salary = job_request_spans[0].strip()city = job_request_spans[1].strip()city = re.sub(r"[\s/]", '', city)work_years = job_request_spans[2].strip()work_years = re.sub(r"[\s/]", '', work_years)eduction = job_request_spans[3].strip()eduction = re.sub(r"[\s/]", '', eduction)desc = " ".join(html.xpath("//dd[@class='job_bt']//text()")).strip()company_name = html.xpath("//h3[@class='fl']/em//text()")[0].strip()# print(desc)position = {'name':position_name,'company_name':company_name,'salary':salary,'city':city,'work_years':work_years,'eduction':eduction,'desc':re.sub('\n','',desc)}self.positions.append(position)#传入全局变量def story(self):with open('position.csv','a',encoding='utf_8_sig') as fp:fileheaders = ['name','company_name','salary','city','work_years','eduction','desc']writer = csv.DictWriter(fp, fieldnames=fileheaders)writer.writeheader()writer.writerows(self.positions)if __name__ == '__main__':spyder = LagouSpider()spyder.run()

存储方法写的不是很好,最好的效果应该是得到一条信息就写入一条信息,但是敲代码的时候脑袋没转过来,没想到好的方法去实现,就只能一页一页的写入。

有兴趣的大佬可以运行一下代码评论区指点一下

欢迎学习者评论区提问,共同进步

随手点赞是最大的支持

(二)使用selenium爬取拉钩招聘网信息并存入csv文件相关推荐

  1. python爬取2019年计算机就业_2019年最新Python爬取腾讯招聘网信息代码解析

    原标题:2019年最新Python爬取腾讯招聘网信息代码解析 前言 初学Python的小伙们在入门的时候感觉这门语言有很大的难度,但是他的用处是非常广泛的,在这里将通过实例代码讲解如何通过Python ...

  2. 网络爬虫爬取拉勾招聘网

    网络爬虫爬取拉勾招聘网 搭配好环境 复制以下代码 # -*- coding: utf-8 -*- """ Created on Mon Sep 7 21:44:39 20 ...

  3. python 爬取拉钩招聘数据

    上一篇介绍在linux 搭建jupter lab,本文将介绍python数据接口的爬取以及提取建模分析的数据 导入依赖的包 import requests import time from urlli ...

  4. python爬虫兼职-python爬虫爬取拉勾招聘网

    # -*- coding: utf-8 -*- """ Created on Mon Sep 7 21:44:39 2020 @author: ASUS "&q ...

  5. python + selenium 爬取猎聘招聘网

    Selenium 本是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,模拟用户操作.而这一特性为爬虫开发提供了一个选择及方向,由于其本身依赖于浏览器,所以使用Python的s ...

  6. 腾讯python招聘_2019年最新Python爬取腾讯招聘网信息代码解析

    前言 初学Python的小伙们在入门的时候感觉这门语言有很大的难度,但是他的用处是非常广泛的,在这里将通过实例代码讲解如何通过Python语言实现对于腾讯招聘网站信息的抓取废话不多说,各位小伙伴们一起 ...

  7. 用request模块爬取拉钩招聘信息

    from urllib import request from urllib import parse# url = "https://www.lagou.com/jobs/list_pyt ...

  8. python+selenium爬取智联招聘信息

    python+selenium爬取智联招聘信息 需求 准备 代码 结果 需求 老板给了我一份公司名单(大概几百家如下图),让我到网上看看这些公司分别在招聘哪些岗位,通过分析他们的招聘需求大致能推断出我 ...

  9. python 爬取拉钩数据

    Python通过Request库爬取拉钩数据 爬取方法 数据页面 建表存储职位信息 解析页面核心代码 完整代码 结果展示 爬取方法 采用python爬取拉钩数据,有很多方法可以爬取,我采用的是通过Re ...

  10. 从入门到入土:Python爬虫学习|实例练手|详细讲解|爬取腾讯招聘网|一步一步分析|异步加载|初级难度反扒处理|寻找消失的API来找工作吧

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

最新文章

  1. C语言的 32个关键之和9个控制语言之关键字
  2. asp.net实现下载
  3. 算法与数据结构--数组和链表的区别
  4. 关系数据库的设计理论
  5. 南通儒通软件上机面试题
  6. php超星查课接口,这是一个可以查询超星课程的接口,请教一下该怎么用啊
  7. 设计模式(2)--Singleton(单例模式)--创建型
  8. ModuleNotFoundError: No module named ‘torch.utils.serialization‘
  9. 面试官系统精讲Java源码及大厂真题 - 42 常用的 Lambda 表达式使用场景解析和应用
  10. raft算法mysql主从复制_mysql主从复制原理
  11. 牛客网编程题——字符串_空格替换
  12. 实战HCNA1:华为设备快速记忆生成树的角色及选举规则,实施基本的VLAN间路由和基础的VRRP协议...
  13. 树莓派红外避障小车python_基于树莓派的环保“捡垃圾”机器人小车(避障、摄像、红外、WIFI)...
  14. JS实现各种页面的刷新
  15. CF1041D Glider
  16. 巴菲特致股东的信pdf_股神巴菲特发布致股东公开信,接班人仍是个谜
  17. [codeforces 760B]Frodo and pillows
  18. 数据结构课程设计——逆波兰表达式的计算
  19. 小米路由器开启DDNS并支持二级路由
  20. Code Project精彩系列二

热门文章

  1. 带你快速入门AXI4总线--汇总篇
  2. 超帅的C核心相关总结
  3. android按钮悬停吸附,Android简单实现悬浮吸附的FloatingView
  4. 天善智能8月18日上海线下沙龙分享主题— 金融领域的客户洞察与标签体系构建...
  5. 台式计算机怎么查是32位还是64位,Win7系统怎么看电脑是32位还是64位?
  6. php实现智能音箱播放内容,智能音箱应用分析 智能音箱五大功能介绍
  7. 服务器主控芯片,物联网主控芯片6大架构分析 谁能独当一面
  8. 人脑词典、亡者归来……来看库兹韦尔对于未来的四个疯狂预测
  9. ICP域名备案查询 分享一个可以快速批量查询域名备案信息的平台
  10. win7无声音显示“未插入扬声器或耳机” 怎么解决