声明:本文由一位知名的不知名 Payne 原创,转载请注明出处! 首先说一下这个有啥用?要说有用也没啥用,要说没用吧,既然能拿到这些数据,拿来做数据分析。能有效的得到职位信息,薪资信息等。也能为找工作更加简单吧,且能够比较有选择性的相匹配的职位及公司 本章节源码仓库为:https://github.com/Payne-Wu/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 其基本原理就是在网页中插入异步触发的。说到底他还是在这个页面,并没有转到其他页面。只是需要特定条件触发即可插入本网页
- “`
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
- “`
1
2
3
4
5
6
7
* 万事俱备、只欠东风:请求Ajax_URL 即可得到以下![](https://qiniu.cuiqingcai.com/wp-content/uploads/2020/04/DemoPicture2-Ajax-1.png)
* 得到响应:经过以上操作已经请求完成了。并能够保障请求稳定性。(当然在此并没有做异常捕获,如果加上,将会更稳)
* ## 解析响应:如果上述步骤没有错的话,到此已经能得到网页数据了(如上图):
* * 我用的提取代码如下 :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
5
* 此时只需提取相关数据,即可。得到:![](https://qiniu.cuiqingcai.com/wp-content/uploads/2020/04/DemoPicture3-json.png)
* ## 保存数据:
* ## 常规保存:(保存到本地)
def save_message(item):
with open(‘lg3.csv’, ‘a+’, encoding=’gbk’) as f:
f.write(item + ‘\n’)
thread_lock.release()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
* ## 数据入库:(保存到数据库)
## 在这里我选择的为Mongo,接下来,那咱们操作一下吧。Mongo的安装便不在此处赘述。与mongo相关的文章,在这里比较推荐才哥和东哥的几篇文章(以本文来看,比较建议看看这几篇文章。并没说其他不好啊,不,我没有,我没说哦),地址如下:
* ### [如何学好 MongoDB](https://cuiqingcai.com/7121.html)
* ### [[Python3网络爬虫开发实战] 1.4.2-MongoDB安装](https://cuiqingcai.com/5205.html)
* ### [[Python3网络爬虫开发实战] 1.5.2-PyMongo的安装](https://cuiqingcai.com/5230.html)
## 前方高能预警,造!!!:(此时的你已安装了Mongo,并能正常使用mongo。剩下的交给我,我教你好了)
1. ### 安装pymongopip install pymongo
1
2
2. ### 建立连接:在原有的代码基础上改写,添加类似于如下的代码: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']
1
2
3
![](https://qiniu.cuiqingcai.com/wp-content/uploads/2020/04/Annotation-2020-04-23-101932.png)
3. ### 新增存储方法: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
![](https://qiniu.cuiqingcai.com/wp-content/uploads/2020/04/微信图片_20200423102245.png)
4. ### 调用此方法: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!
光看文章的话,就算是我自己写的文章单单仅仅看文章也是会云里雾里,建议与源码一起阅读。祝学习进步,心想事成。加油~
写到最后:既然能读到这儿,那么我相信不是白嫖成为习惯的人,说明也或多或少想自己搞一搞。整一整?下次也出来吹吹牛皮,拉钩晓得不,反爬难吧?我会了(虽然对于大佬来说,都可能算不上反扒,和玩似的,这个确实也是的。不过吧,对于新手来说,已经算很难了。)我也是搞过拉勾的男人。找工作就找我,啊哈哈哈。
单一的案例终究只会让你局限于本次案例,如果拉钩反爬又更新了。那么这个就会失效。虽然授之以渔了,但终究是 “这条小溪”,更大的海洋还需要更加刻苦努力的学习。个人比较建议学习一下
- 感谢阅读与支持,谢谢
来源:https://cuiqingcai.com/9160.html