Python爬虫实战(一) 使用urllib库爬取拉勾网数据
本笔记写于2020年2月4日。Python版本为3.7.4,编辑器是VS code
主要参考资料有:
B站视频av44518113
Python官方文档
PS:如果笔记中有任何错误,欢迎在评论中指出,我会及时回复并修改,谢谢
问题描述
看B站学习视频的时候,老师讲得第一个实战也就是爬取拉勾网数据是怎么也爬取不下来,弹幕里的方法也都不管用。所以开始求助伟大的度娘,度娘中大部分的解决方法都是使用requests
库来爬取的,但目前只学习的urllib
库,所以没办法采用。
但是,我注意到了一个非常重要的细节,就是爬取不下来数据的原因。拉勾网的Cookie中使用了时间戳,简单的说,就是拉钩网的cookie中有一个cookie是专门设置时间值的。
正常浏览器访问页面的时候,浏览器首先获取到了python职位页面对应的HTML文本,再根据HTML文本中的链接请求相应的各种其他数据,然后通过JS代码将其复原为完整页面。正常请求过程中,这个速度是非常快速的,时间值并不会过期。也就是说,时间值的设置对于拉勾网的正常访问不会有任何影响。
但如果按照老师的视频中所说的,我们直接去爬取保存着职位信息的json
数据,就算是复制了所有的响应头也没有用,因为cookie中的时间值已经过期了。服务器接受到这种爬虫请求后,就会返回您操作太频繁,请稍后再访问这句话了。
解决办法
爬取拉勾网数据的关键就是快,只要时间戳没有超期就可以爬取成功。
我们这里分三个步骤:
- 爬取拉勾网的Python职位页面
- 提取上面爬取到页面的时间戳cookie
- 将时间戳cookie添加到请求头中,再请求保存着职位的
json
数据
获取python职位页面
这一步的目的只有一个,就是找到代表时间值的cookie。
首先通过程序,我们来看一下返回回来的响应头都有什么?
from urllib import request
import ssl
# 去掉全局安全校验
ssl._create_default_https_context = ssl._create_unverified_context
url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
req = request.Request(url, headers={
'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'
})
# 开始请求
response = request.urlopen(req)
for header in response.getheaders():
print(header)
结果如下:
可以看到共有4个Set-Cookie
的响应头,其中我觉得可能表示时间值的响应头是user_trace_token
,因为我从里面看到了时间信息20200204184124
这个时间戳(但我也不确定)。
提取Cookie
既然找到了响应头,我们接下来就要提取cookie,并构造接下来请求头的cookie。
cookie = ''
for header in response.getheaders():
if header[0] == 'Set-Cookie':
print(header[1].split(';')[0])
cookie = cookie + header[1].split(';')[0] + '; '
cookie = cookie[:-1]
print(cookie)
结果如下:
接下来和老师的代码就没什么区别了,就是要在我们构造的请求头里加上我们刚才提取的cookie
全代码示例
# -*- coding: utf-8 -*-
from urllib import request
from urllib import parse
import ssl
# 去掉全局安全校验
ssl._create_default_https_context = ssl._create_unverified_context
# 先爬取首页python职位的网站以获取Cookie
url = 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
req = request.Request(url, headers={
'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'
})
response = request.urlopen(req)
# 从响应头中提取Cookie
cookie = ''
for header in response.getheaders():
if header[0] == 'Set-Cookie':
cookie = cookie + header[1].split(';')[0] + '; '
# 去掉最后的空格
cookie = cookie[:-1]
# 爬取职位数据
url = 'https://www.lagou.com/jobs/positionAjax.json?city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false'
# 构造请求头,将上面提取到的Cookie添加进去
headers = {
'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',
'Cookie': cookie,
'Referer': 'https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput='
}
data = {
'first': 'true',
'pn': 1,
'kd': 'python'
}
req = request.Request(url, data=parse.urlencode(data).encode('utf-8'), headers=headers)
response = request.urlopen(req)
print(response.read().decode('utf-8'))
爬取成功后的结果:
Python爬虫实战(一) 使用urllib库爬取拉勾网数据的更多相关文章
- python爬虫学习之使用BeautifulSoup库爬取开奖网站信息-模块化
实例需求:运用python语言爬取http://kaijiang.zhcw.com/zhcw/html/ssq/list_1.html这个开奖网站所有的信息,并且保存为txt文件和excel文件. 实 ...
- Python爬虫实战(2):爬取京东商品列表
1,引言 在上一篇<Python爬虫实战:爬取Drupal论坛帖子列表>,爬取了一个用Drupal做的论坛,是静态页面,抓取比较容易,即使直接解析html源文件都可以抓取到需要的内容.相反 ...
- 吴裕雄--天生自然PYTHON爬虫:安装配置MongoDBy和爬取天气数据并清洗保存到MongoDB中
1.下载MongoDB 官网下载:https://www.mongodb.com/download-center#community 上面这张图选择第二个按钮 上面这张图直接Next 把bin路径添加 ...
- python爬虫(三) 用request爬取拉勾网职位信息
request.Request类 如果想要在请求的时候添加一个请求头(增加请求头的原因是,如果不加请求头,那么在我们爬取得时候,可能会被限制),那么就必须使用request.Request类来实现,比 ...
- Python爬虫实战(1):爬取Drupal论坛帖子列表
1,引言 在<Python即时网络爬虫项目: 内容提取器的定义>一文我们定义了一个通用的python网络爬虫类,期望通过这个项目节省程序员一半以上的时间.本文将用一个实例讲解怎样使用这个爬 ...
- Python爬虫入门四之Urllib库的高级用法
1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Headers 的属性. 首先,打开我们的浏览 ...
- 转 Python爬虫入门四之Urllib库的高级用法
静觅 » Python爬虫入门四之Urllib库的高级用法 1.设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我 ...
- 转 Python爬虫入门三之Urllib库的基本使用
静觅 » Python爬虫入门三之Urllib库的基本使用 1.分分钟扒一个网页下来 怎样扒网页呢?其实就是根据URL来获取它的网页信息,虽然我们在浏览器中看到的是一幅幅优美的画面,但是其实是由浏览器 ...
- Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺
更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...
随机推荐
- Slim安装以及使用
最近在用backbone.js 做东西,因为牵扯到REST services 所以需要后台支持,此处选择了php.Slim 是php的一个框架. 貌似国内文章对此的介绍比较少,在安装Slim的过程中出 ...
- VS 右键属性闪一下啥也打不开问题
unity项目,从vs项目右键属性闪一下啥也打不开的问题这个是因为工程是unity管理的,里面有个插件默认设定不可查看修改属性修改:vs中打开“工程”->"选项"中(修改后这 ...
- swoole之建立 tcp server
一.swoole的安装 参照官网:https://wiki.swoole.com/wiki/page/6.html 二.代码部分 服务端: <?php $host = "127.0.0 ...
- pygame库的学习
第一天:我学习了如何设置窗口和加载图片,以及加载音乐.这个库真的很有意思啊,打算py课设就拿这个写了. 代码: import pygamefrom sys import exit pygame.ini ...
- 第1节 IMPALA:7、impala的安装以及配置过程
6.制作本地yum源 镜像源是centos当中下载相关软件的地址,我们可以通过制作我们自己的镜像源指定我们去哪里下载impala的rpm包,这里我们使用httpd这个软件来作为服务端,启动httpd的 ...
- Java Math.round()函数小结
Math类中提供了三个与取整有关的方法:ceil,floor,round,这些方法的作用于它们的英文名称的含义相对应,例如:ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(1 ...
- android中的简单animation(一)shake
1.shake animation_1.xml: <?xml version="1.0" encoding="utf-8"?> <Linear ...
- https://blog.csdn.net/yyoinge/article/details/81557604
https://blog.csdn.net/yyoinge/article/details/81557604 http://www.mamicode.com/info-detail-2346464.h ...
- leetcode102 Binary Tree Level Order Traversal
""" Given a binary tree, return the level order traversal of its nodes' values. (ie, ...
- IDEA maven 项目报警告解决(自己的maven配置记录)
IDEA maven 项目报警告解决 应该是JDK版本太低 虽然你装的高但是默认使用maven 默认的 这里要配一下JDK版本 理解不深入只为 自己记录使用 1 配置 仓库为阿里云 配置本地储存j ...