Python爬虫:异步数据抓取并保存到Excel
标签(空格分隔): Python 爬虫 异步
环境:
Python 3.6
、Pycharm 2017.2.3
、Chrome 61.0.3163.100
======> 2018年3月3号 更新整理了一下代码 <======
- 修改了
post请求
中的form-data
没有生效的错误 - 修改为可直接从程序外部传入参数,可获得任意职位,任意地区的职位信息,并以职位-城市命名文件
前言
刚接触了一下异步数据的抓取,所以试一下如何实现异步数据的抓取。
这次需要实现的是,在招聘网站拉勾网【网站链接】中爬出Python
相关职位的一些基本信息,并且将基本信息保存至Excel
表格中。
需要的一些知识点
AJAX
:Asynchronous JavaScript and XML
(异步的JavaScript
和XML
)。它不是新的编程语言,而是一种使用现有标准的新方法。它采用的是AJAX
异步请求。通过在后台与服务器进行少量数据交换,AJAX
可以使网页实现异步更新。因此就可以在不重新加载整个网页的情况下,对网页的某部分进行更新,从而实现数据的动态载入。XHR
:XMLHttpRequest
对象用于和服务器交换数据。
开始动手吧
分析网页
打开拉勾网主页之后,我们在搜索框中输入关键字Python
,以用来查找和Python
相关的职位。在搜索结果的页面中,我们按照以下顺序操作可以发现。
–> 右键检查
–> 打开审查元素后默认打开的是Elements
–> 我们切换到Network
标签,刷新一下网页会出现各种条目的请求
–> 因为该网站是异步请求,所以打开Network
中的XHR
,针对JSON
中的数据进行分析。
–> 在审查元素中我们可以发现以下信息:
# 该页面的请求url
Request URL:https://www.lagou.com/jobs/positionAjax.json?city=%E5%B9%BF%E5%B7%9E&needAddtionalResult=false&isSchoolJob=0
# 该页面的请求方法,需要提交表单数据(Form-data)
Request Method:POST
Form-data: first: true
pn: 1
kd: python
--------------------------------
# Request Headers中的相关信息
包括Cookie、Referer、User-Agent等我们之后会用到的信息
代码
代码片段1-请求该网页
import requests # 导入请求模块
url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E6%88%90%E9%83%BD&needAddtionalResult=false&isSchoolJob=0'
form_data = {
'first': 'true',
'pn': '1',
'kd': 'python'}
def getJobList():
res = requests.post(
# 请求url
url=url,
# 填写表单数据
data = form_data
)
result = res.json() # 获取res中的json信息
print(result)
getJobList()
运行结果:
{
'success': False, 'msg': '您操作太频繁,请稍后再访问', 'clientIp': '113.14.1.254'}
出现这样他的结果,应该是拉钩网的反爬机制起了作用,所以此时就需要伪装成用户去访问,需要加入headers
信息。
代码片段2-加入headers
信息
import requests
url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E6%88%90%E9%83%BD&needAddtionalResult=false&isSchoolJob=0'
form_data = {
'first': 'true',
'pn': '1',
'kd': 'python'}
HEADERS = {
# User-Agent(UA) 服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。也就是说伪装成浏览器进行访问
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
# 用于告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。如果不加入,服务器可能依旧会判断为非法请求
'Referer': 'https://www.lagou.com/jobs/list_Python?px=default&gx=&isSchoolJob=1&city=%E5%B9%BF%E5%B7%9E'
}
def getJobs():
res = requests.post(url=url, headers=HEADERS, data=form_data)
result = res.json()
print(result)
getJobs()
运行结果:
{
'success': True, 'requestId': None, 'resubmitToken': None, 'msg': None, 'content': {
'pageNo': 1, 'pageSize': 15, 'hrInfoMap': {
'4067747': {
'userId': 1944019, 'phone': None, 'positionName': 'HR', 'receiveEmail': None, 'realName': 'zp', 'portrait': None, 'canTalk': True, 'userLevel': 'G1'}, '4170140': {
'userId': 7646331, 'phone': None, 'positionName': None, 'receiveEmail': None, 'realName': 'liuyaou', 'portrait': None, 'canTalk': True, 'userLevel': 'G1'}, '3887376': {