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 LanguageStandard 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()

 

在这里我选择的为Mongo,接下来,那咱们操作一下吧。Mongo的安装便不在此处赘述。与mongo相关的文章,在这里比较推荐才哥和东哥的几篇文章(以本文来看,比较建议看看这几篇文章。并没说其他不好啊,不,我没有,我没说哦),地址如下:

  前方高能预警,造!!!:(此时的你已安装了Mongo,并能正常使用mongo。剩下的交给我,我教你好了)

  1. 安装pymongo

     

    安装pymogo

    Python

     

    1

    pip install pymongo

     

  2. 建立连接:在原有的代码基础上改写,添加类似于如下的代码:

     

    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']

  3. 新增存储方法:

     

    定义存储入数据库的方法

    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)

  4. 调用此方法:

     

     

    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!

 

 

光看文章的话,就算是我自己写的文章单单仅仅看文章也是会云里雾里,建议与源码一起阅读。祝学习进步,心想事成。加油~

写到最后:既然能读到这儿,那么我相信不是白嫖成为习惯的人,说明也或多或少想自己搞一搞。整一整?下次也出来吹吹牛皮,拉钩晓得不,反爬难吧?我会了(虽然对于大佬来说,都可能算不上反扒,和玩似的,这个确实也是的。不过吧,对于新手来说,已经算很难了。)我也是搞过拉勾的男人。找工作就找我,啊哈哈哈。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python网络爬虫在爬取数据时,常常会遇到反爬机制。为了防止被爬虫程序大量访问,站会采取一些措施来限制爬虫的访问。以下是一些常见的反爬机制和对应的应对方法: 1. 验证码:站可能会在登录、提交表单或访问频率过高时出现验证码。爬虫需要通过识别验证码来继续访问站。常见的验证码识别方法有使用第三方库(如Tesseract、Pillow)进行图像处理和识别,或者使用打码平台(如云打码、超级鹰)进行自动识别。 2. User-Agent检测:站可能会通过检测请求头中的User-Agent字段来判断是否为爬虫。为了应对这种反爬机制,可以使用随机的User-Agent来模拟不同的浏览器和操作系统,使爬虫看起来更像是真实用户的访问。 3. IP封禁:站可能会根据IP地址来限制爬虫的访问。为了应对IP封禁,可以使用代理IP来隐藏真实IP地址,或者使用动态IP池来定期更换IP地址。 4. 请求频率限制:站可能会限制同一IP地址的请求频率,如果请求过于频繁,可能会被封禁或返回错误信息。为了应对频率限制,可以在爬虫程序中设置合理的请求间隔时间,或者使用分布式爬虫来分散请求。 5. 页面解析:站可能会对页面结构进行加密或混淆,使爬虫难以解析页面内容。为了应对这种情况,可以使用第三方库(如BeautifulSoup、Scrapy)来解析页面,或者使用正则表达式来提取所需数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值