爬虫抓取网页数据(产品运营人员处理数据和运用数据,基本是常态。)
优采云 发布时间: 2021-11-03 16:09爬虫抓取网页数据(产品运营人员处理数据和运用数据,基本是常态。)
作为产品运营商,在工作中处理数据、分析数据、使用数据基本是正常的。虽然不是数据分析岗位,但也是需要大量应用数据的岗位。如果没有获取数据的能力,其实很尴尬。
通常,数据的获取来自两个方面:内部数据和外部数据。
内部数据无非是根据分析的需要,在贵公司的数据库或数据统计平台中提取数据。如果要从数据统计平台中提取数据,一般的数据统计平台都会支持数据导出,您只需要导出需要的数据即可。如果要从公司数据库中提取数据,我们需要使用sql语言来获取数据。
使用sql从公司数据库中检索数据,主要是学习数据库“校验”的基本操作,包括特定情况下的数据抽取、数据的分组聚合、多表连接等,比较简单。您可以在以下列中参考这个文章:
当然,对于产品或者运维人员来说,我们有时候不一定有读取数据的权限,但是有句话说得好,有备无患。你已经掌握了一种技能,当你想使用它时,不能更好地使用它,但不是。
获取外部数据主要有两种方式:
一是获取外部公开的数据集。比如一些科研机构、企业、政府会公开一些数据。你需要去特定的网站下载这些数据。这些数据集通常比较完整,质量也比较高(如中国统计信息网)。
二是利用爬虫从网上爬取,比如从招聘网站获取某个职位的招聘信息,租房网站获取某个区域的租房信息,电子商务< @网站获取 基于爬取的数据,我们可以根据某个产品的产品信息进行数据分析。
我们要讲的是第二种外部获取数据的方式:使用python爬虫获取外部数据。
因此,默认情况下,本文的读者具有python语法基础知识和爬虫基础知识(如果没有这方面的知识,也不会妨碍对文章的理解。同时,作者会在文章末尾附上学习的时间我遇到了一个很好的python基础学习和爬虫基础知识学习博客)。
我们以最贴近生活求职者找工作为例,谈谈如何利用爬虫快速获取招聘中想要的数据网站,然后分析辅助决策——在此基础上制作。
先别着急,哦,不对,是代码,先从思路开始:
1. 作为求职者,要找到工作,至少要了解以下信息: 工作的市场情况,如工资范围:工作1到3年,工资是多少?应届毕业生的工资是多少?招聘公司的规模有多大?公司办公地址离居住地近还是远?有什么教育要求?整体市场情况如何?. . . . .
2、获取这些数据的方式,一般来说,要么直接从第三方平台获取,要么就是利用爬虫技术对数据进行爬取。显然这些招聘信息已经在招聘网站上了,不用去想了。批量获取数据的最佳方式是编写一个爬虫脚本,爬取一些求职职位的数据,并保存在一个excel电子表格中。在,把它留给下一个分析。
好的,思路流畅后,我们就开始做。这里以拉勾网的“产品运营”帖子为例。
使用环境:win10+python3+Juypter Notebook
第一步:分析网页
要抓取网页,首先要分析网页结构。
现在很多网站都使用了一种叫做Ajax(异步加载)的技术,就是在打开一个网页的时候,先给你展示上面的一些,然后慢慢加载剩下的。所以你可以看到很多网页,慢慢刷新,或者一些网站随着你的移动,很多信息慢慢加载。这种网页的优点是加载速度非常快(因为您不必一次加载所有内容)。
但是这种技术不利于爬行,所以这个时候我们就得花点功夫了。
幸运的是,牵开器使用了这种技术。异步加载信息,我们需要使用chrome浏览器小工具进行分析,按F12打开,点击Nerwork进入网络分析界面,界面如下:
此时,它是空白的。如果我们按F5刷新,我们可以看到一系列的网络请求。
然后我们开始寻找可疑的网络资源。首先,图片、css等可以跳过。一般来说,重点是xhr(什么是xhr,想了解更多可以参考这篇博客:深入理解ajax系列第一篇-XHR对象)这种类型的请求如下:
这种类型的数据一般都是json格式,我们也可以尝试在filter中输入json进行过滤查找。
上图发现了两个xhr请求。从字面意思来看,很可能就是我们需要的信息。右击在另一个界面打开:
这是什么?你在跟我开玩笑吗?嗯,这里有个坑。另外在写爬虫代码的时候,如果不在http请求中添加请求头信息,服务器返回同样的信息,但是我不明白是为什么,这里我直接用浏览器打开一个新窗口也是拒绝访问的接口。如果有大神知道,希望解惑,谢谢!
回到正题,新开的窗口虽然进不去,但是各大洲都通向罗马。我们可以在右侧的框中切换到“预览”,然后点击内容——位置结果进行查看,可以看到位置的信息。以键值对的形式呈现,这是json格式,特别适合网页数据交换。
第一步是分析网页,这是结束。下一步是构造请求 URL。
第二步、URL构建
在“Headers”中可以看到网页地址,通过观察网页地址可以发现: 这一段是固定的,其余我们发现有一个city=%E5%8C%97%E4%BA %AC&needAddtionalResult=false&isSchoolJob= 0
再次检查请求发送参数列表。这里我们可以确定city参数是city,pn参数是页数,kd参数是position关键字。
当然,这只是网页的内容。如何获取更多页面的内容?再来看看“产品运营”的位置。总共有30页,每页有15条数据,所以我们只需要构造一个循环来遍历每页的数据。
第三步写爬虫脚本,写代码
需要说明的是,因为这个网页的格式是json,所以我们可以很好的读取json格式的内容。这里我们切换到预览,然后点击内容——位置结果——结果,可以先找到一个列表,然后点击查看每个位置的内容。为什么要从这里看?一个好处是你知道这个json文件的层次结构,所以你可以很容易地等待编码。
具体代码显示:
也可以直接从作者的github下载:/banyanmo/lagou
<p>import requests,json
from openpyxl import Workbook
#http请求头信息
headers={
'Accept':'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding':'gzip, deflate, br',
'Accept-Language':'zh-CN,zh;q=0.8',
'Connection':'keep-alive',
'Content-Length':'25',
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie':'user_trace_token=20170214020222-9151732d-f216-11e6-acb5-525400f775ce; LGUID=20170214020222-91517b06-f216-11e6-acb5-525400f775ce; JSESSIONID=ABAAABAAAGFABEF53B117A40684BFB6190FCDFF136B2AE8; _putrc=ECA3D429446342E9; login=true; unick=yz; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=0; PRE_UTM=; PRE_HOST=; PRE_SITE=; PRE_LAND=https%3A%2F%2Fwww.lagou.com%2F; TG-TRACK-CODE=index_navigation; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1494688520,1494690499,1496044502,1496048593; Hm_lpvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1496061497; _gid=GA1.2.2090691601.1496061497; _gat=1; _ga=GA1.2.1759377285.1487008943; LGSID=20170529203716-8c254049-446b-11e7-947e-5254005c3644; LGRID=20170529203828-b6f*敏*感*词*c8e-446b-11e7-ba7f-525400f775ce; SEARCH_ID=13c3482b5dd*敏*感*词*bb7bfda721bbe6d71c7; index_location_city=%E6%9D%AD%E5%B7%9E',
'Host':'www.lagou.com',
'Origin':'https://www.lagou.com',
'Referer':'https://www.lagou.com/jobs/list_Python?',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
'X-Anit-Forge-Code':'0',
'X-Anit-Forge-Token':'None',
'X-Requested-With':'XMLHttpRequest'
}
def get_json(url, page, lang_name):
data = {'first': "true", 'pn': page, 'kd': lang_name,'city':"北京"}
#POST请求
json = requests.post(url,data,headers=headers).json()
list_con = json['content']['positionResult']['result']
info_list = []
for i in list_con:
info = []
info.append(i['companyId'])
info.append(i['companyFullName'])
info.append(i['companyShortName'])
info.append(i['companySize'])
info.append(str(i['companyLabelList']))
info.append(i['industryField'])
info.append(i['financeStage'])
info.append(i['positionId'])
info.append(i['positionName'])
info.append(i['positionAdvantage'])
# info.append(i['positionLables'])
info.append(i['city'])
info.append(i['district'])
# info.append(i['businessZones'])
info.append(i['salary'])
info.append(i['education'])
info.append(i['workYear'])
info_list.append(info)
return info_list
def main():
lang_name = input('职位名:')
page = 1
url = 'http://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
info_result=[]
title = ['公司ID','公司全名','公司简称','公司规模','公司标签','行业领域','融资情况',"职位编号", "职位名称","职位优势","城市","区域","薪资水平",'教育程度', "工作经验"]
info_result.append(title)
#遍历网址
while page