本笔记写于2020年2月4日。Python版本为3.7.4,编辑器是VS code

主要参考资料有:

  1. B站视频av44518113

  2. Python官方文档

PS:如果笔记中有任何错误,欢迎在评论中指出,我会及时回复并修改,谢谢

问题描述

看B站学习视频的时候,老师讲得第一个实战也就是爬取拉勾网数据是怎么也爬取不下来,弹幕里的方法也都不管用。所以开始求助伟大的度娘,度娘中大部分的解决方法都是使用requests库来爬取的,但目前只学习的urllib库,所以没办法采用。

但是,我注意到了一个非常重要的细节,就是爬取不下来数据的原因。拉勾网的Cookie中使用了时间戳,简单的说,就是拉钩网的cookie中有一个cookie是专门设置时间值的

正常浏览器访问页面的时候,浏览器首先获取到了python职位页面对应的HTML文本,再根据HTML文本中的链接请求相应的各种其他数据,然后通过JS代码将其复原为完整页面。正常请求过程中,这个速度是非常快速的,时间值并不会过期。也就是说,时间值的设置对于拉勾网的正常访问不会有任何影响。

但如果按照老师的视频中所说的,我们直接去爬取保存着职位信息的json数据,就算是复制了所有的响应头也没有用,因为cookie中的时间值已经过期了。服务器接受到这种爬虫请求后,就会返回您操作太频繁,请稍后再访问这句话了。

解决办法

爬取拉勾网数据的关键就是快,只要时间戳没有超期就可以爬取成功。

我们这里分三个步骤:

  1. 爬取拉勾网的Python职位页面
  2. 提取上面爬取到页面的时间戳cookie
  3. 将时间戳cookie添加到请求头中,再请求保存着职位的json数据

获取python职位页面

这一步的目的只有一个,就是找到代表时间值的cookie。

首先通过程序,我们来看一下返回回来的响应头都有什么?

  1. from urllib import request
  2. import ssl
  3. # 去掉全局安全校验
  4. ssl._create_default_https_context = ssl._create_unverified_context
  5. url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
  6. req = request.Request(url, headers={
  7. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
  8. })
  9. # 开始请求
  10. response = request.urlopen(req)
  11. for header in response.getheaders():
  12. print(header)

结果如下:

可以看到共有4个Set-Cookie的响应头,其中我觉得可能表示时间值的响应头是user_trace_token,因为我从里面看到了时间信息20200204184124这个时间戳(但我也不确定)。

提取Cookie

既然找到了响应头,我们接下来就要提取cookie,并构造接下来请求头的cookie。

  1. cookie = ''
  2. for header in response.getheaders():
  3. if header[0] == 'Set-Cookie':
  4. print(header[1].split(';')[0])
  5. cookie = cookie + header[1].split(';')[0] + '; '
  6. cookie = cookie[:-1]
  7. print(cookie)

结果如下:

接下来和老师的代码就没什么区别了,就是要在我们构造的请求头里加上我们刚才提取的cookie

全代码示例

  1. # -*- coding: utf-8 -*-
  2. from urllib import request
  3. from urllib import parse
  4. import ssl
  5. # 去掉全局安全校验
  6. ssl._create_default_https_context = ssl._create_unverified_context
  7. # 先爬取首页python职位的网站以获取Cookie
  8. url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
  9. req = request.Request(url, headers={
  10. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
  11. })
  12. response = request.urlopen(req)
  13. # 从响应头中提取Cookie
  14. cookie = ''
  15. for header in response.getheaders():
  16. if header[0] == 'Set-Cookie':
  17. cookie = cookie + header[1].split(';')[0] + '; '
  18. # 去掉最后的空格
  19. cookie = cookie[:-1]
  20. # 爬取职位数据
  21. url = 'https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'
  22. # 构造请求头,将上面提取到的Cookie添加进去
  23. headers = {
  24. 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36',
  25. 'Cookie': cookie,
  26. 'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
  27. }
  28. data = {
  29. 'first': 'true',
  30. 'pn': 1,
  31. 'kd': 'python'
  32. }
  33. req = request.Request(url, data=parse.urlencode(data).encode('utf-8'), headers=headers)
  34. response = request.urlopen(req)
  35. print(response.read().decode('utf-8'))

爬取成功后的结果:

Python爬虫实战(一) 使用urllib库爬取拉勾网数据的更多相关文章

  1. python爬虫学习之使用BeautifulSoup库爬取开奖网站信息-模块化

    实例需求:运用python语言爬取http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html这个开奖网站所有的信息,并且保存为txt文件和excel文件. 实 ...

  2. Python爬虫实战(2):爬取京东商品列表

    1,引言 在上一篇<Python爬虫实战:爬取Drupal论坛帖子列表>,爬取了一个用Drupal做的论坛,是静态页面,抓取比较容易,即使直接解析html源文件都可以抓取到需要的内容.相反 ...

  3. 吴裕雄--天生自然PYTHON爬虫:安装配置MongoDBy和爬取天气数据并清洗保存到MongoDB中

    1.下载MongoDB 官网下载:https://www.mongodb.com/download-center#community 上面这张图选择第二个按钮 上面这张图直接Next 把bin路径添加 ...

  4. python爬虫(三) 用request爬取拉勾网职位信息

    request.Request类 如果想要在请求的时候添加一个请求头(增加请求头的原因是,如果不加请求头,那么在我们爬取得时候,可能会被限制),那么就必须使用request.Request类来实现,比 ...

  5. Python爬虫实战(1):爬取Drupal论坛帖子列表

    1,引言 在<Python即时网络爬虫项目: 内容提取器的定义>一文我们定义了一个通用的python网络爬虫类,期望通过这个项目节省程序员一半以上的时间.本文将用一个实例讲解怎样使用这个爬 ...

  6. Python爬虫入门四之Urllib库的高级用法

    1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...

  7. 转 Python爬虫入门四之Urllib库的高级用法

    静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...

  8. 转 Python爬虫入门三之Urllib库的基本使用

    静觅 » Python爬虫入门三之Urllib库的基本使用 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器 ...

  9. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...

随机推荐

  1. Windows安装OpenSSH服务

    一.背景 在做国盛通项目的时候,有两套并行测试环境,因为基本架构采用的是供应商提供的程序,需要将两套banner图做同步,因为图片数量多,进GitLab版本控制进行分支策略管理,进而同步两套环境,意义 ...

  2. simplecheck

    环境:win10 工具:jadx .夜神模拟器.pycharm 下载好了之后加载到模拟器 输入正确的flag验证 加载到jadx.查看MainAtivity if语句进行验证是否正确,如果正确就输出y ...

  3. Linux远程上传文件

    #对拷文件夹 (包括文件夹本身) scp -r /home/slk root@192.168.1.5:/home # 对拷文件并重命名 scp /home/a.txt root@192.168.1.5 ...

  4. 主机ping虚拟机失败。虚拟机ping主机,可以ping通。

    原文:https://blog.csdn.net/ww1473345713/article/details/51490525 今天打开虚拟机,然后用Xshell远程连接,发现连接不上.按照以下顺序检查 ...

  5. Day7 - C - Saddle Point ZOJ - 3955

    Chiaki has an n × m matrix A. Rows are numbered from 1 to n from top to bottom and columns are numbe ...

  6. ios之开源

    a http://code.cocoachina.com b http://code4app.com c http://www.oschina.net/ios/codingList/ d github ...

  7. HTML<figure> <figcaption> 标签定义图文并茂

    本来想分两篇文章来解释说明figure.figcaption的,但是这俩个标签都是定义图文的,所以我们合起来讲解,大家更能容易接受. 大家在写xhtml.html中常常用到一种图片列表,图片+标题 或 ...

  8. 西门子 S7-200CN CPU 224CN EEPROM芯片

    拆下来了个 224CN 的EEPROM芯片

  9. SVPWM总结

    空间矢量算法 是以逆变器和电机作为一个整体来研究的.目标是产生电机定子的圆形磁场 模态选择, 上管导通 状态为1 下管导通 状态为0 那么状态为000 001 010 011 100 101 110 ...

  10. Kafka--生产者

    一个应用程序在很多情况下需要往Kafka写入消息:记录用户的活动(用于审计和分析),记录度量指标,保存日志消息,记录智能家电的信息,与其他应用程序进行异步通信,缓冲即将写入到数据库的数据,等等. 多样 ...