python爬虫urllib 数据处理_Python爬虫实战(一) 使用urllib库爬取拉勾网数据

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

主要参考资料有:

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'))

爬取成功后的结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值