python用selenium爬取网页数据_Python项目实战:使用selenium爬取拉勾网数据
“ 一切不经过项目验证的代码都是耍流氓,今天我们就通过一个简单的招聘网站的数据归档进行当前热门岗位的大数据分析,最后以wordcloud进行显示。本文为数据爬取篇。”
项目准备:
这次我们来比较完整的抓取拉勾网上面“Python”相关招聘信息以及招聘要求详情。
能联网的电脑、搭建好Python3以上环境,如果环境没有配置,可以参考我原来的文章 Python的安装与配置。IDE这次我们采用Jupyter Notebook ,采集我们使用selenium+pyquery,为什么用这个?说起来都是泪,文末我再解释。数据分析使用pandas。
分析页面,寻找数据来源
打开拉勾网,搜索“Python”得到下面这个页面。最近疫情我被关在武汉了,我就以武汉站为目的地好了。共30页,每页展示15个职位[职位(368)]。
通过selenium采集比request采集的效率要低许多,因为是模拟浏览器方式进行抓取,所以每次都要对页面进行渲染。但是同样也有个好处,就是不用在意header和cookie问题。废话不多说,直接开始操作
按照以前我们的方法,在Notebook中新建Python 3文件:
引入各种模块:
import pyquery as pq
from selenium import webdriver
import pandas as pd
import time
import os
初始化一个浏览器:
driver = webdriver.Firefox()
driver.implicitly_wait(5)
driver.get("https://www.lagou.com/")
在打开的页面中,进行处理拉勾网的登陆状态
while True:
i = input("已登陆成功请输入“OK”:")
if i == 'OK':
break
elif i == 'quit':
print("取消执行,关闭!")
os._exit(1)
登陆成功后,在命令行输入窗输入“OK”,会进入下一步执行。
进入列表采集:
print("开始执行采集")
data = []
driver.get("https://www.lagou.com/jobs/list_Python/p-city_184?&cl=false&fromSearch=true&labelWords=&suginput=")
while True:
but_class = driver.find_element_by_css_selector(".pager_next").get_attribute('class')
if but_class == 'pager_next ':
driver.find_element_by_xpath("//span[@action='next']").click()
items = pq.PyQuery(driver.page_source).find(".con_list_item")
data += getPosition(items)
time.sleep(2)
else:
print('列表采集结束')
break
我们单独定义了一个采集方法,getPosition 这个方法接收一个pyquery的对象。
方法代码如下:
def getPosition(items):
datalist=[]
for item in items.items():
temp = dict()
temp['职位ID']= item.attr('data-positionid')
temp['职位名']= item.attr('data-positionname')
temp['薪资范围']= item.attr('data-salary')
temp['公司ID']= item.attr('data-companyid')
temp['公司名']= item.attr('data-company')
temp['职位链接']=pq.PyQuery(item).find(".position_link").attr("href")
temp['发布时间']=pq.PyQuery(item).find(".format-time").text()
temp['猎头名称']=pq.PyQuery(item).find(".hr_name").text()
temp['猎头ID']=pq.PyQuery(item).find(".target_hr").text()
temp['工作经验']=pq.PyQuery(item).find(".p_bot>.li_b_l").remove(".money").text()
temp['公司主页']=pq.PyQuery(item).find(".company_name>a").attr('href')
temp['公司描述']=pq.PyQuery(item).find(".industry").text()
temp['岗位亮点']=pq.PyQuery(item).find(".li_b_r").text()
datalist.append(temp)
return datalist
到这里,主要列表的采集和整理工作就结束了,我们把采集到的数据整合到pandas中,并保存到csv文件,以方便后面使用。
csv = pd.DataFrame(data)
csv.to_csv("lagou.csv")
截图为保存的DataFrame。可以看到,我们保存了二级页名,和公司相关的信息。
一共采集了368条数据。这个时候,我们开始进行第二步详情数据的完善采集。
我们先查看一个二级页面,看一下数据格式
在网页里面点击任意一个职位进入查看详情,例如https://www.lagou.com/jobs/4263258.html:
参照我们最开始的方法可以发现,我们需要的信息就在右键html网页源代码里面,就在一个class='job_bt'的dd标签里面:
我这里使用pyquery 来处理html内容:
text =pq.PyQuery(driver.page_source).find(".job-detail").text()
with open("./data/%s.txt" %row[1],"w+") as f:
f.write(text)
如果对JQuery熟悉的同学一定可以看出来,PyQuery的选择器实在是简单。。
最后别忘了测试一下存储的数据是否正确:
彩蛋:
最开始写这个文章时,我是打算使用request进行数据采集的,在代码实现的时候发现一个问题,拉勾网的防爬做得还是挺不错,在采集列表页面时,同一header的使用一旦超过5次就被判定为爬虫。在这个坑上足足花了二个小时。虽然这个坑大概是什么原因,但是我现在实在是太困,不想再花时间处理。(页面的COOKIE是经过页面Js调用生成的)如果以后有精力再说吧。
总结先分析页面,知道数据从哪里来、什么格式?(网页源代码html?Network面板的xhr请求到的json数据?),本项目使用的selenium,所以只用处理页面数据。
根据数据来源格式确定使用解析方式
处理防爬机制
利用def定义不同的函数处理单独的请求可以让代码更清晰
把获取的内容存储到文件(简单横竖列表数据存.csv),注意要转为字符串存储,注意文件名要唯一。
尽可能在必要的位置合理的使用time.sleep(1)延缓一下,特别是防爬高的站点,一定要加上
代码要一点点测试,Jupyter Notebook是一个神器。
如果需要项目源码,请关注,并私信明哥:"lagou"
最后:如果你正在学习Python的路上,或者准备打算学习Python、明哥会陪着你陪你一起共同进步!
手打不易,有用的话,请记得关注转发。
python用selenium爬取网页数据_Python项目实战:使用selenium爬取拉勾网数据相关推荐
- 怎么把python程序安装到别人电脑上_Python项目实战,如何用微信远程控制别人电脑,抓紧时间收藏...
今天带给大家一个非常有意思的 Python程序,基于 itchat 实现微信控制电脑.你可以通过在微信发送命令,来拍摄当前电脑的使用者,然后图片会发送到你的微信上.甚至你可以发送命令来远程关闭电脑. ...
- Python爬虫编程思想(133):项目实战--利用Appium抓取微信朋友圈信息
本文利用Appium实现一个抓取微信朋友圈信息的爬虫.在编写爬虫之前,先要启动Appium服务器. 编写基于Appium的爬虫,关键就是分析App每个界面相关元素的特征,也就是如何获取这些元素,然后在 ...
- Python项目实战:使用PySpark对大数据进行分析
Python项目实战:使用PySpark对大数据进行分析 大数据,顾名思义就是大量的数据,一般这些数据都是PB级以上.PB是数据存储容量的单位,它等于2的50次方个字节,或者在数值上大约等于1000个 ...
- Python项目实战 —— 01. 疾病预测结构化数据
Python项目实战 Python项目实战--目录 Python项目实战 -- 01. 疾病预测结构化数据 一.背景 二.解题思路 三.数据分析 3.1 数据清洗 3.2 数据分析 3.2.1 相关系 ...
- 学习推荐《精通Python网络爬虫:核心技术、框架与项目实战》中文PDF+源代码
随着大数据时代的到来,我们经常需要在海量数据的互联网环境中搜集一些特定的数据并对其进行分析,我们可以使用网络爬虫对这些特定的数据进行爬取,并对一些无关的数据进行过滤,将目标数据筛选出来.对特定的数据进 ...
- 《精通Python网络爬虫:核心技术、框架与项目实战》——1.3 网络爬虫的组成...
本节书摘来自华章出版社<精通Python网络爬虫:核心技术.框架与项目实战>一书中的第1章,第1.3节,作者 韦 玮,更多章节内容可以访问云栖社区"华章计算机"公众号查 ...
- layer output 激活函数_一文彻底搞懂BP算法:原理推导+数据演示+项目实战(下篇)...
在"一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)"中我们详细介绍了BP算法的原理和推导过程,并且用实际的数据进行了计算演练.在下篇中,我们将自己实现BP算法(不使用第 ...
- (转载)Android项目实战(二十七):数据交互(信息编辑)填写总结
Android项目实战(二十七):数据交互(信息编辑)填写总结 前言: 项目中必定用到的数据填写需求.比如修改用户名的文字编辑对话框,修改生日的日期选择对话框等等.现总结一下,方便以后使用. 注: 先 ...
- 一文彻底搞懂BP算法:原理推导+数据演示+项目实战(下篇)
在"一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)"中我们详细介绍了BP算法的原理和推导过程,并且用实际的数据进行了计算演练.在下篇中,我们将自己实现BP算法(不使用第 ...
最新文章
- 7 个日常实用的 Shell 拿来就用脚本实例!
- 浅谈Java/Android下的注解
- Java社区目前的现状——交易
- R语言对数线性模型loglm函数_R 对数变换 《回归分析与线性统计模型》page103
- JavaScript 读写 span标签的值 - 代码篇
- python的重点和难点_python知识点汇总-Go语言中文社区
- 写个类操作窗口(句柄操作)
- C语言:从键盘输入10个学生的成绩存储在数组中,求成绩最高者的序号和成绩
- 台式计算机怎么设置屏幕常亮,怎么设置电脑屏幕一直亮着
- 在c语言中是闰年的条件为,C语言如何判断是闰年,闰年判断条件?
- Captain Flint and Crew Recruitment
- 结巴分词有前空格_jieba英文空格分词问题
- 西门子PLC学习笔记十-(计数器)
- C语言:在屏幕输出如下图案(*/ )
- 1.2帮助软件Rstudio的下载与安装
- eigen库安装_四足机器人优化方法:Webots下Eigen与qpOASES非线性优化库环境搭建
- 信号完整性分析6——信号的振铃
- Git-2.12.0-64-bit .exe下载持续更新最新版下载
- zxx学习日报1110
- [MetalKit]33-Ambient-Occlusion-in-Metal环境光遮蔽
热门文章
- new File(String Path)加载资源问题
- Nginx HTTP负载均衡和反向代理配置
- android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题
- Linux 查看文件大小
- 10年Python大牛倾力打造系统Python学习流程图!
- matlab中的现代谱估计,请教一个Matlab关于现代功率谱估计的问题
- 软件质量保证计划_软件测试计划 笔记
- leetcode前缀树java_LeetCode 实现 Trie (前缀树)
- 左室短轴切面_4声窗7切面搞定急诊超声心动图:由浅入深学TTE急诊“心”事
- python编程之slice与indices函数用法