zoukankan      html  css  js  c++  java
  • python 爬虫之爬取大街网(思路)

    由于需要,本人需要对大街网招聘信息进行分析,故写了个爬虫进行爬取。这里我将记录一下,本人爬取大街网的思路。

    附:爬取得数据仅供自己分析所用,并未用作其它用途。  

    附:本篇适合有一定 爬虫基础 crawler 观看,有什么没搞明白的,欢迎大家留言,或者私信博主。

    首先,打开目标网址 www.dajie.com ,在职位搜索中 输入所需职业或关键信息 (我这演示的是 程序员),然后可得到新的链接地址 https://so.dajie.com/job/search?keyword=%E7%A8%8B%E5%BA%8F%E5%91%98&from=job

    我们可以看到 ,数据的排序方式有2种,一种是 默认 ,一种是 时间 ,当你点击的时候你可以看到 数据的排序方式发生了变化,但是网页链接却没有变化,而且点击 下一页 的时候页面的链接也没有发生变化,其原因是 当你对其操作时,它通过

    JS获取ajax数据进行变换填充,所以如果你要获取所需数据,你只能通过获取其ajax数据。(当然还有模拟JS渲染,得到页面,我没有尝试过,这里也不做多述)

    那么如何获取到其数据呢?

    当你单击 下一页 等操作时,通过抓包(XHR中)可以查看到ajax数据的来源,查看的时候可以看到其返回的是200(所需的数据),但当你在新的页面打开时,却发现返回的是299,不是你想要的结果。如一下这个链接就是对其进行时间排序所得

    的ajax(https://so.dajie.com/job/ajax/search/filter?keyword=%E7%A8%8B%E5%BA%8F%E5%91%98&order=1&city=&recruitType=&salary=&experience=&page=1&positionFunction=&_CSRFToken=&ajax=1)

    但是如果你是单独打开它的时候,它返回的是一个错误的页面,这应该是 大街网 反爬虫的一种手段。  

    找到了返回的ajax地址链接,我们该如何正确的打开这个链接呢?

    当我们打开这个 链接时(https://so.dajie.com/job/search?keyword=%E7%A8%8B%E5%BA%8F%E5%91%98&from=job)会发现服务器端回返回一个 Cookie

    因此 当你访问 (https://so.dajie.com/job/ajax/search/filter?keyword=%E7%A8%8B%E5%BA%8F%E5%91%98&order=1&city=&recruitType=&salary=&experience=&page=1&positionFunction=&_CSRFToken=&ajax=1)

    链接时,你必须要传入服务器返回的cookie 才能够获取到正确的结果。

    下面附上本人写的代码,仅供参考。

    其中需要注意的是:这些代码仅提供一个思路,里面的很多变量、类都是我项目里面的。

    这里统一做一下解释

    #from myproject.dajie import Jobs, IpAgentPool   指引入 Ip 池,Jobs所需要爬取得 关键字集合.(下面演示时用不到的)
    #from myproject import agentPool          引入 Agent池, 用作伪装浏览器使用

     1 from myproject.dajie import Jobs, IpAgentPool
     2 from myproject import agentPool
     3 import http.cookiejar
     4 import urllib.request
     5 import urllib.parse
     6 import random
     7 import re
     8 #import pymssql
     9 
    10 class dj():
    11 
    12     def __init__(self):
    13         # -----BASEURL  为目标网站的URL
    14         # -----ToSearchJob  为需要搜寻的工作
    15         # -----Agent  为Agent池,用于伪装浏览器
    16         # -----opener 为自己建造的一个opener,配合cookiejar可用于存储cookies
    17         def Myopener(self):
    18                 cookie = http.cookiejar.CookieJar()
    19                 return urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cookie))
    20 
    21         self.BASEURL = "https://www.dajie.com/"
    22         # self.ToSearchJob=Jobs.TheJobNeedToSearch
    23         self.AgentPool = agentPool.userAgent
    24         self.IpPool = IpAgentPool.ipPool
    25 
    26         self.opener = Myopener(self=self)
    27 
    28         pass
    29 
    30     def getContext(self):
    31         url="https://so.dajie.com/job/search?keyword=%E7%A8%8B%E5%BA%8F%E5%91%98&from=job"
    32 
    33         header=
    34             {
    35                 "User-Agent":agentPool.userAgent[int(random.random()*4)],
    36                 "Referer":"https://so.dajie.com/job/search?keyword=%E7%A8%8B%E5%BA%8F%E5%91%98&from=job"
    37             }
    38 
    39         head=[]
    40 
    41         for key,value in header.items():
    42             head.append((key,value))
    43 
    44         self.opener.addheaders=head
    45 
    46         #session_cookie用于保存服务器返回的cookie,并将其保存
    47         #
    48         #其实只需要保存  session_cookie["SO_COOKIE_V2"]  即可,其余的是多余的。服务器在进行验证的时候,只会验证 SO_COOKIE_V2
    49         #
    50         session_cookie={}
    51         session=self.opener.open("https://so.dajie.com/job/search?keyword=%E7%A8%8B%E5%BA%8F%E5%91%98&from=job")
    52         print((session.info()))
    53 
    54         session_cookie["DJ_RF"]= re.findall(r"DJ_RF=.+?;",str(session.info()))[0].split("=")[1]
    55         session_cookie["DJ_EU"]=re.findall(r"DJ_EU=.+?;",str(session.info()))[0].split("=")[1]
    56         session_cookie["DJ_UVID"] = re.findall(r"DJ_UVID=.+?;", str(session.info()))[0].split("=")[1]
    57         session_cookie["SO_COOKIE_V2"] = re.findall(r"SO_COOKIE_V2=.+?;", str(session.info()))[0].split("=")[1]
    58 
    59         #data 包含的是所需要传入的 cookie
    60         data=
    61             {
    62                 "DJ_RF":session_cookie["DJ_RF"].strip(";"),
    63                 "DJ_EU":session_cookie["DJ_EU"].strip(";"),
    64                 "DJ_UVID":session_cookie["DJ_UVID"].strip(";"),
    65                 "SO_COOKIE_V2":session_cookie["SO_COOKIE_V2"].strip(";"),
    66                 "__login_tips":1,
    67             }
    68         #将 数据解析为传入数据的格式
    69         _data=urllib.parse.urlencode(data,"utf-8")
    70         print("______________")
    71         print(_data)
    72         #
    73         #_url 指的是ajax的链接地址
    74         _url="https://so.dajie.com/job/ajax/search/filter?keyword=%E7%A8%8B%E5%BA%8F%E5%91%98&order=1&city=&recruitType=&salary=&experience=&page=1&positionFunction=&_CSRFToken=&ajax=1"
    75         req=self.opener.open(_url,data=_data.encode("utf-8"))
    76 
    77         print("-----------------")
    78         print(req.read().decode("utf-8"))
    79 
    80         #print(req.read().decode("utf-8"))
    81 
    82 
    83 
    84 if __name__=="__main__":
    85     _dj=dj()
    86     _dj.getContext()
    View Code

    最后附上运行结果的截图

                         

  • 相关阅读:
    EXTJS 4.2 资料 控件之checkboxgroup的用法(静态数据)
    EXTJS 4.2 资料 控件之Window窗体相关属性的用法
    EXTJS 4.2 资料 控件之textfield文本框加事件的用法
    Entity Framework 学习笔记(一)之数据模型 数据库
    EXTJS 4.2 资料 控件之checkboxgroup的用法(动态数据)
    EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示
    Entity Framework 学习笔记(二)之数据模型 Model 使用过程
    EXTJS 4.2 资料 控件之radiogroup 的用法
    EXTJS API
    vue移动端弹框组件,vue-layer-mobile
  • 原文地址:https://www.cnblogs.com/one-lightyear/p/6833545.html
Copyright © 2011-2022 走看看