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

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

附:本篇适合有一定 爬虫基础 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

最后附上运行结果的截图

                     

转载于:https://www.cnblogs.com/one-lightyear/p/6833545.html

python 爬虫之爬取大街网(思路)相关推荐

  1. Python爬虫深入 爬取当当网商品基本信息

    Python爬虫深入 爬取当当网商品基本信息 使用scrapy爬虫框架,创建爬虫项目. 基本命令: scrapy startproject dangdang scrapy genspider -l s ...

  2. python爬虫之--爬取当当网商品信息

                                    python爬虫之--爬取当当网图商品信息                                               ...

  3. python爬虫之爬取百度网盘

    爬虫之爬取百度网盘(python) #coding: utf8 """ author:haoning create time: 2015-8-15 "" ...

  4. Python爬虫 在线爬取当当网畅销书Top500的图书信息

    本实例还有另外的离线爬虫实现,有兴趣可点击离线爬取当当网畅销书Top500的图书信息 爬虫说明 1.使用requests和Lxml库爬取,(用BS4也很简单,这里是为了练习Xpath的语法) 2.爬虫 ...

  5. python爬虫案例-爬取当当网数据

    输入关键字,爬取当当网中商品的基本数据,代码如下: 1 # Author:K 2 import requests 3 from lxml import etree 4 from fake_userag ...

  6. Python爬虫 离线爬取当当网畅销书Top500的图书信息

    本实例还有另外的在线爬虫实现,有兴趣可点击在线爬取当当网畅销书Top500的图书信息 爬虫说明 1.使用requests和Lxml库爬取,(用BS4也很简单,这里是为了练习Xpath的语法) 2.爬虫 ...

  7. python爬虫之爬取掘金网首页存入mysql数据库

    博主是个前端小白,最近在学习爬虫,写个实战系列也是想记录自己学习的过程,以便后续回顾 欢迎大家一起交流学习.共同进步 这篇文章达成的效果是爬掘金网的首页的数据存到mysql数据库里 做这个实战你需要具 ...

  8. 简单python爬虫案例(爬取慕课网全部实战课程信息)

    技术选型 下载器是Requests 解析使用的是正则表达式 效果图: 准备好各个包 # -*- coding: utf-8 -*- import requests #第三方下载器 import re ...

  9. python爬虫爬取音乐_利用python爬虫实现爬取网易云音乐热歌榜

    利用python爬虫实现爬取网易云音乐热歌榜 发布时间:2020-11-09 16:12:28 来源:亿速云 阅读:102 作者:Leah 本篇文章给大家分享的是有关利用python爬虫实现爬取网易云 ...

最新文章

  1. 以人工智能的卖点,华为携Mate 10向苹果发起新一轮攻势
  2. 计算机病毒不可能侵入rom,2008年职称计算机考试计算机基础试题7
  3. c#(服务器)与java(客户端)通过socket传递对象_C#(服务器)与Java(客户端)通过Socket传递对象...
  4. pam_mysql模块安装
  5. idea debug只断点当前线程,不阻塞其他线程
  6. Vue组件多次点击报错Avoided redundant navigation to current location: “/profile“.
  7. boost::function模块右值的测试程序
  8. Go基础编程:命名、变量、常量
  9. java 什么是servlet_JavaWeb解释一下什么是 servlet?
  10. php 替换某个字符,php中如何替换字符串中的某个字符-PHP问题
  11. HTML5新增语义化标签(HTML5)
  12. python用pandas读取txt_python Pandas 读取txt表格的实例
  13. 女神:今天我3倍工资,放假半天 有法可依,我...
  14. 小学计算机课程听课记录,小学信息技术听课记录
  15. 1-7 Burpsuite 爬虫介绍
  16. STM32F1 HAL库实战开发——【实验1 点亮LED实验】
  17. 2010国家节假日安排
  18. linux c语言lzma,LZMA 算法简介
  19. 如何解决电脑C盘不能扩展问题
  20. Class-Aware Generative Adversarial Transformers for Medical Image Segmentation-用于医学图像分割的生成对抗网络

热门文章

  1. java怎么不安装到c盘的教程,帮您设置win10系统安装不了java的详细步骤
  2. 四级重点高频词汇表_四级为什么自己估分和真实成绩不一样……?
  3. Linux下往移动硬盘拷贝数据步骤方式
  4. linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递
  5. java 合并 set_【Java必修课】各种集合类的合并(数组、List、Set、Map)
  6. Zabbix实战之客户端自动发现
  7. [PPOPP 15] PoweSwitch: 基于同步异步切换的分布式大规模图处理系统 学习总结
  8. arduino下载库出错_arduino的I2C通讯 3:驱动1602液晶屏
  9. 计算机多媒体技术广泛应用于各个领域,多媒体技术发展前景计算机现状及
  10. spring中基础核心接口总结