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

    最后附上运行结果的截图

                         

  • 相关阅读:
    mysql 实战 or、in与union all 的查询效率
    转:手机流畅的决定性因素
    合批只是对CPU的优化,与GPU没有任何关系
    UNITY 打包时提示sdk tools 或 sdk build tools版本低时可以直接点update 按钮进行更新
    RGB ECT 4BIT 压缩后质量远高于RGB ETC2 4BIT
    Adreno GPU Profiler
    UNITY2018.3 在editor下运行时new memoryprofiler显示 shader占用内存很大的问题在安卓上并没有看到
    VS2017断点调试UNITY2018.3 经常卡住的问题
    一次UNITY闪退问题的定位心得
    UNITY2018 真机开启deepprofiling的操作
  • 原文地址:https://www.cnblogs.com/one-lightyear/p/6833545.html
Copyright © 2011-2022 走看看