python 爬虫之爬取大街网(思路)

因为须要,本人须要对大街网招聘信息进行分析,故写了个爬虫进行爬取。这里我将记录一下,本人爬取大街网的思路。程序员

附:爬取得数据仅供本身分析所用,并未用做其它用途。  ajax

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

 

首先,打开目标网址 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渲染,获得页面,我没有尝试过,这里也不作多述)cookie

 

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

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

的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)dom

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

 

找到了返回的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

最后附上运行结果的截图

相关文章
相关标签/搜索