Python突破拉钩反爬机制,采集各类招聘数据
首先说一下这个有啥用?要说有用也没啥用,要说没用吧,既然能拿到这些数据,拿来做数据分析。能有效的得到职位信息,薪资信息等。也能为找工作更加简单吧,且能够比较有选择性的相匹配的职位及公司
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:101677771
本章节源码仓库为:https://github.com/Mr2753/PythonScrape
一言不合直接上代码!具体教程及思路总代码后!
所用解释器为Python3.7.1,编辑器为Pycharm 2018.3.5.
本着虚心求学,孜孜不倦,逼逼赖赖来这里虚心求学,孜孜不倦,逼逼赖赖,不喜勿喷,嘴下手下脚下都请留情。
本节所涉:Request基本使用、Request高级使用-会话维持、Cookies、Ajax、JSON数据格式
Request更多详情请参考Request官方文档:
轻松入门中文版
高级使用中文版
Cookie:有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息
具体Cookies详情请参考:https://baike.baidu.com/item/cookie/1119?fr=aladdin
Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式、快速动态网页应用的网页开发技术,无需重新加载整个网页的情况下,能够更新部分网页的技术。
通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
JSON(JavaScript Object Notation): 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition – December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
首先介绍一下关于本章代码的基本思路:
四步走(发起请求、得到响应、解析响应得到数据、保存数据)
四步中准确来说是三步,(发起请求,得到响应、解析响应,提取数据、保存数据)
请求网页(在搜索框中输入所查询的岗位<例如:Python>,得到BASE_URL,)
- BASE_URL:https://www.lagou.com/jobs/list_Python?labelWords=&fromSearch=true&suginput=
- 加入请求头(注意加Cookies),请求BASE_URL
- 观察响应信息以及本网页源码观察浏览器网页源码,对比发现其中并没有我们所需要的信息:发现Ajax的痕迹。
- 经过一系列操作发现Ajax网页地址(在这里直接请求此链接并不能访问):
- 多次请求过后,发现错误。错误的缘由是由于Cookies限制,并且网页以动态检测,且时间间隔小。
- 经过前言的学习,已经学会了。会话维持。动态得到Cookies,这样不就可以把这个“反爬”彻底绕过了呢?答案肯定是滴
- 哪让我们做一下会话维持,并动态提取Cookies吧。
- 易混淆点:cookies的维持为什么是维持BASE_URL的而不是Ajax_URL?下面按照个人理解对于本Ajax给出以下解释:结合Ajax原理可知,Ajax其基本原理就是在网页中插入异步触发的。说到底他还是在这个页面,并没有转到其他页面。只是需要特定条件触发即可插入本网页
1
2
3
4
5
6
7
8
9
10
11
def Get_cookies(header):
"""
Get cookies
@param header:
@return: cookies
"""
with requests.Session() as s:
s.get(cookies_url, headers=header)
cookies = s.cookies
# cookies = requests.get(cookies_url, headers=header).cookies
return cookies
- 万事俱备、只欠东风:请求Ajax_URL 即可得到以下
- 得到响应:经过以上操作已经请求完成了。并能够保障请求稳定性。(当然在此并没有做异常捕获,如果加上,将会更稳)
解析响应:如果上述步骤没有错的话,到此已经能得到网页数据了(如上图):
- 我用的提取代码如下 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def parse(message):
industryField = message['industryField']
# company_message
positionName = message['positionName']
companyFullName = message['companyFullName']
companySize = message['companySize']
financeStage = message['financeStage']
# companyLabelList = message['companyLabelList']
companyLabelList = '|'.join(message['companyLabelList'])
Type = "|".join([message['firstType'], message['secondType'], message['thirdType']])
Address = ''.join([message['city'], message['district'], ])
salary = message['salary']
positionAdvantage = message['positionAdvantage']
# limitation factor
workYear = message['workYear']
jobNature = message['jobNature']
education = message['education']
items = f"{positionName}, {companyFullName}, {companySize}, {financeStage}, {companyLabelList}, {industryField}, " \
f"{Type}, {salary}, {jobNature}, {education}"
# items = "".join(str(
# [positionName, companyFullName, companySize, financeStage, companyLabelList, industryField, Type, salary,
# jobNature, education]))
if items:
# print(items)
logging.info(items)
# return items.replace('[', '').replace(']', '')
return items.replace('(', '').replace(')', '')
- 此时只需提取相关数据,即可。得到:
- 我用的提取代码如下 :
保存数据:
常规保存:(保存到本地)
1 2 3 4 |
def save_message(item): with open('lg3.csv', 'a+', encoding='gbk') as f: f.write(item + '\n') thread_lock.release() |
数据入库:(保存到数据库)
本源码地址:https://github.com/Mr2753/PythonSpider/blob/master/%E8%81%8C%E4%BD%8D%E6%8B%9B%E8%81%98/Demo_Mongo.py
在这里我选择的为Mongo,接下来,那咱们操作一下吧。Mongo的安装便不在此处赘述。与mongo相关的文章,在这里比较推荐才哥和东哥的几篇文章(以本文来看,比较建议看看这几篇文章。并没说其他不好啊,不,我没有,我没说哦),地址如下:
如何学好 MongoDB
[Python3网络爬虫开发实战] 1.4.2-MongoDB安装
[Python3网络爬虫开发实战] 1.5.2-PyMongo的安装
前方高能预警,造!!!:(此时的你已安装了Mongo,并能正常使用mongo。剩下的交给我,我教你好了)
安装pymongo
安装pymogo
Python
1
pip install pymongo
建立连接:在原有的代码基础上改写,添加类似于如下的代码:
Client MongoClian
Python
1
2
3
4
5
6
7
MONGO_CONNECTION_STRING = 'mongodb://localhost:27017'
# MONGO_DB_NAME = 'Jobs'
# MONGO_COLLECTION_NAME = 'Jobs'
client = pymongo.MongoClient(MONGO_CONNECTION_STRING)
db = client['Jobs']
collection = db['Jobs']
新增存储方法:
定义存储入数据库的方法
Python
1
2
3
4
5
6
7
8
9
10
11
def save_data(self, date):
"""
save to mongodb
:param date:
:return:
"""
collection.update_one({
'name': date.get('companyShortName')
}, {
'$set': date
}, upsert=True)
调用此方法:
1
2
3
4
5
6
def main():
p = LaGou()
for page in range(1, 31):
content = p.scrape(page)
data = p.parseResponse(content)
download = p.save_data(data)
注意:由于mongo的存储格式为key :value形式,所以咱们提取到的数据返回也必须是key :value形式:
看我看我,怎么搞的,我是这样搞的:
左手叉腰,右手摇,Over!
光看文章的话,就算是我自己写的文章单单仅仅看文章也是会云里雾里,建议与源码一起阅读。祝学习进步,心想事成。加油~
写到最后:既然能读到这儿,那么我相信不是白嫖成为习惯的人,说明也或多或少想自己搞一搞。整一整?下次也出来吹吹牛皮,拉钩晓得不,反爬难吧?我会了(虽然对于大佬来说,都可能算不上反扒,和玩似的,这个确实也是的。不过吧,对于新手来说,已经算很难了。)我也是搞过拉勾的男人。找工作就找我,啊哈哈哈。
Python突破拉钩反爬机制,采集各类招聘数据相关推荐
- 爬取拉钩 破解拉钩反爬机制
破解拉钩反爬 实现爬取内容 拉钩的反爬很厉害 没毛病 老铁!! 我们现在来研究一下拉钩的请求头先 导入的有一个ip池(get_ip) ip池可以不写 用自己的也不会被封掉还有我是第一次写这些文章 给个 ...
- 抓取设了CSS反爬机制的大众点评数据(下)
该篇实现大众点评爬虫操作代码,所有原理都在(上)篇均已详细阐述,让我没想到的是大众点评不仅设置了CSS反爬,在ip限制方面也是十分的凶狠,不得已花了10块钱买了一天代理ip. 大众点评究的反爬竟有多恶 ...
- Python破解百度翻译反爬机制---自制翻译器
欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答.求职一站式搞定! 对商业智能BI.大数据分析挖掘.机器学习,python,R等数据领域感兴趣的同学 ...
- python爬虫进阶,突破反脚本机制(反爬机制)
前言 相信大家在做爬虫或者自动化脚本时或多或少的都能遇到反爬机制(或者说反脚本机制),最常见的反脚本机制都是在登录时进行验证,据本人大量实战(帮粉丝写脚本)发现,基本上只要有点水平的网站都会有反脚本的 ...
- 网站有反爬机制就爬不了数据?那是你不会【反】反爬!道高一尺魔高一丈啊!
不知道你们在用爬虫爬数据的时候是否有发现,越来越多的网站都有自己的反爬机制,抓取数据已经不像以前那么容易,目前常见的反爬机制主要有以下几种: 数据是通过动态加载的,比如微博,今日头条,b站 需要登录, ...
- 从入门到入土:Python爬虫学习|实例练手|爬取百度翻译|Selenium出击|绕过反爬机制|
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
- Python爬虫实战——反爬机制的解决策略【阿里】
这一次呢,让我们来试一下"CSDN热门文章的抓取". 话不多说,让我们直接进入CSND官网. (其实是因为我被阿里的反爬磨到没脾气,不想说话--) 一.URL分析 输入" ...
- python实战:利用chrome抓包插件HTTP间谍分析有道翻译反爬机制
本次实战目标站点:http://fanyi.youdao.com/?keyfrom=fanyi-new.logo ,主要利用HTTP间谍抓包插件分析有道翻译反爬机制,该抓包能帮我们过滤掉一些不需要的常 ...
- 爬全景网壁纸(反爬机制Referer)
url以及参数: https://www.quanjing.com/Handler/SearchUrl.ashx?t=1509&callback=searchresult&q=%E5% ...
最新文章
- Error:(39, 13) Failed to resolve: com.android.support:appcompat-v7:26.0.0 [duplicate]
- 三分钟黑了阿里?马云下死命令留他?吴翰清辟谣:我没黑过阿里
- IIS配置网站定时任务必设参数图文教程
- Java JDK 学习笔记:File类
- AVPlayer 之avcore模块
- 使用反射处理protobuf数据结构
- python调用百度智能云API请求(以自然语言处理——词法分析为例)
- 比较ipv6有状态与无状态地址分配工作特点_IPv6环境获取IPV6地址,无状态地址分配,一分钟了解下...
- python 秒数转化为时分秒
- CKFinder 2.0.2 破解小计
- 如何进行Tuxera NTFS的挂载卷设置?
- Linux 简单教程
- HTML制作qq空间主页
- jlink接口定义(jlink接口定义 swd4线)
- SQL中日期函数的运用
- 咕泡p5人工智能深度学习高薪就业5期学习
- 暗影精灵 官方恢复出厂系统镜像HP Cloud Recovery Tool
- Windows10中,安卓模拟器与docker环境要求的虚拟技术冲突导致电脑蓝屏的解决办法
- C语言bmp图片读写,画点,画线
- Android ConstraintLayout 约束布局