python爬虫百度文库,爬虫python实例
学习笔记
拿x光招聘的小岗位写个小案例。我们希望在X射线招聘网站的第1级页面上显示职位名称,在第2级页面上显示工作职责和工作要求。因为这个x光招聘网站是动态加载的,所以我们需要抓取与网站交互时产生的数据包。
攀爬步骤确定x光招聘的URL地址(https://careers.tencent.com/search.html)
抓取一级页面中的包,获取一级页面中的json地址。
(3)抓取二级页面中的包,获取二级页面中的json地址。
抓取数据,存储在mysql数据库中。
一级页面捕获
我们打开x光招聘网站后,右键打开审核元素——点击网络——点击XHR(我们想要的包主要在这里)——刷新网页,获取多个包——点击预览,依次确定哪个包包含我们想要的数据——确定我们想要的包。
经过所有这些步骤,我找到了想要的数据包。
对应于参数RecruitPostName的值就是我们要攀登的职位名称:
让我们单击Headers,检查数据包的报头信息,获取JSON文件的URL地址(请求URL ),并查询参数:
JSON文件的URL地址:
https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1587432663964 country id=city id=bgids=product id=categoryid=parent categoryid=attrid=keyword=pageindex=1 pagesize=10 language=zh-cn area=cn查询参数:
时间戳:1587432663964
国家Id:
城市Id:
bgIds:
产品Id:
categoryId:
parentCategoryId:
属性:
关键词:
页面索引:1
页面大小:10
语言:中文
Area:cn我们看到pageIndex可能代表什么页面;页面大小可以指示页面中有多少工作信息;时间戳应该是时间戳。我们知道每次发送请求时,时间戳肯定是不同的。如果服务器需要查询参数timestamp,那么我们需要用python自己生成它。如果没有,我们可以从URL中删除这个查询参数,或者只写一个整数(比如1)。
二级页面捕获
按照与上面类似的步骤,我们在第2级页面中捕获了所需的数据包。
与参数要求和责任相对应的值是我们想要提升的工作要求和工作责任:
单击Headers获取JSON文件的URL地址(请求URL)和查询参数:
JSON文件的URL地址:
https://careers.tencent.com/tencentcareer/api/post/ByPostId?timestamp=158743434600 PostID=1188745462794948608 Language=zh-cn查询参数:
时间戳:1587434334600
postId:1188745462749448608
语言:zh-cn我们看到有一个查询参数叫postId,应该是我们需要的。关键是,我们如何获取这个查询参数的值,或者找到这个查询参数的规律?
与前面的pageIndex查询参数不同,我们知道它一目了然地表明了页数,但这个postId参数似乎没有规律可循……deadlocked.jpg。
如何做到这一点?
不要慌!这个值不可能凭空出现。此时,我们可以回顾一下之前获得的新信息,看看是否有关于这个查询参数的线索。什么新信息?你从哪里得到的新信息?是的,它是在一级页面中捕获的JSON文件。
此时,我们可以返回到第1级页面,看看在第1级页面中捕获的JSON文件中是否有关于这个查询参数的任何线索:
{
Id: 0,
PostId:“1188745462794948608”,
招聘启事Id: 54633,
RecruitPostName: 21557-音视频流媒体传输中的算法工程师(深圳),
国名:“中国”,
位置名称:深圳,
BGName: CSIG ,
产品名称:“腾讯云”,
类别名称:“技术”,
职责:负责实时音视频通话、直播、视频会议等场景的流媒体网络传输算法的前期研发,包括但不限于:1。负责流媒体传输中网络状态的实时检测和算法选择与集成;2.负责受损网络下网络拥塞算法的研究和优化;3.负责受限网络下多路流媒体分布式传输算法的设计与实现;4.负责流媒体传输中音视频QOE/QOS的实现和优化。
最后更新时间:“2020年4月21日”,
http://careers.tencent.com/jobdesc.html?postId=1188745462794948608 ,
SourceID: 1,
IsCollect: false,
IsValid: true
},有了!PostId:“1188745462794948608”和我们的邮编查询参数值一毛一样!
所以,我们拿到一级页面的数据文件时,除了要获取每一个职位的RecruitPostName,还需要获取每一个职位的邮编
开始敲代码吧
首先我们创建一个关系型数据库数据表用于存储数据:
创建表腾讯_职业生涯(id int NOT NULL AUTO _ INCREMENT
recruitpostname varchar(50)不为空,
要求varchar(500)不为空,
责任varchar(500)不为空,
主键(id));敲大蟒代码:
# -*-编码:utf-8 -*-
导入请求
导入数据
导入时间
随机导入
导入已安装
班级职业选手:
def __init__(self):
自我。标题=自我。headers={ Accept : application/JSON,text/javascript,*/*;q=0.01 ,
用户代理: Mozilla/5.0}
自我。URL 01= https://careers . Tencent . com/Tencent career/API/post/Query?国家id=城市id=bgIds=产品id=categoryId=parentCategoryId=attrId=keyword=page index={ } pageSize=10 language=zh-cn area=cn
自我。URL 02= https://careers . Tencent . com/Tencent career/API/post/ByPostId? postId={} language=zh-cn
自我。db=pymysql。连接(host= 127。0 .0 .1 ,
端口=3306,
user=root ,
密码=19970928 ,
database=datacup ,
charset=utf8 )
self.cur=self.db.cursor()
#请求函数
def get_page(self,url):
res=requests.get(url,headers=self.headers)
#res.encoding=utf-8
#将得到的数据类型的字符串,转换成大蟒数据类型
打印(状态代码:,资源状态代码)
#打印( url:,res.url)
返回json.loads(资源文本)
def get_data(self,json_dict):
job_data=[]
job _ list=JSON _ dict[ Data ][ Posts ]
对于作业列表中的项目:
recruit post name=item[ recruit post name ]
打印(招聘职位名称)
postId=item[PostId]
url02=self.url02.format(postId)
责任,要求=self.get_data_two(url02)
作业数据。追加([招聘职位名称,要求,责任])
自我.写_数据(作业数据)
def get_data_two(self,url):
json_dict=self.get_page(url)
责任=json_dict[数据][责任]
requirement=json_dict[数据][需求]
回报(责任、要求)
def write_data(self,data_list):
SQL= insert into Tencent _ career(招聘职位名称、要求、责任)\
值(%s,%s,% s);
尝试:
self.cur.executemany(sql,data_list)
self.db.commit()
例外情况为e:
self.db.rollback()
打印(错误信息:,e)
定义主(自身):
对于范围(1,3)中的索引:
url01=self.url01.format(索引)
one _ JSON _ dict=self。获取_页面(URL 01)
self.get_data(one_json_dict)
时间.睡眠(随机。均匀(0.5,1.5))
self.cur.close()
self.db.close()
if __name__==__main__ :
start=time.time()
spider=CareerSpider()
spider.main()
end=time.time()
打印(执行时间:% . 2f“%(结束-开始))
控制台部分输出(共20条):
状态代码:200
32032电脑客户端高级工程师(深圳)
状态代码:200
15573-天天爱消除动画设计师(上海)
状态代码:200
执行时间:8.40
查询关系型数据库数据库
我们先检验一下数据是否导入到腾讯_职业表里:
选择*来自腾讯_职业语句执行记录:
11:33:17选择*来自腾讯_职业限制0,1000 20行返回0.000秒/0.000秒查询的部分结果:
# id,招聘职位名称,要求,责任
1”、“35595-信息流内容策略高级产品经理”、“1)三年以上信息流内容推荐策略经验;\n2)有数据分析和信息流产品推荐经验者优先;\n3)推进能力强,责任心强,有上进心。‘1)分析腾讯信息流产品内容现状,在内容建设和推荐策略方向寻找优化空间;\n2)问题驱动的内容和推荐全链路分析优化,包括内容构建、内容理解、用户画像等环节;\n3)分析挖掘不同用户场景、不同用户群体的内容需求,建立可行的产品和内容策略并推进落地;\n4)负责跟踪内容策略的数据效果并持续分析,为大盘核心指标的正向增长提供内容端支持;\n5)定期评估竞品的内容策略,输出有价值的内容策略优化方案和建议,负责推动落地。\n
2 , 30361-SLAM算法工程师, 1。熟悉单目、双目或深度的SLAM算法;\n2。具有较强的工程开发能力,能够独立完成算法移植和优化;\n3。发SLAM或计算机视觉方向的高质量论文优先;\n4。熟悉Android/IOS开发者优先。\n5。良好的敬业精神和团队合作精神,善于分析和解决问题,富有想象力和学习能力。 , 1.负责移动增强现实引擎的开发和优化\n2。负责SLAM前沿技术的研发和相关产品实现‘很好!所有20项职务信息都已输入数据库。
此时此刻,我想查看职位要求中带有“Master”字样的职位信息:
select * from Tencent _ career where requirement regexp master ;查询的部分结果:
# id,招聘职位名称,要求,责任
3 , TEG16-高级秘书(深圳),硕士学历,英语能力强,有一定海外工作经验者优先;\n本科有3-7年大型企业助理工作经验的也可以考虑;\n有组织大型项目或活动的经验,沟通协调能力强;\n实用、稳健、灵活、服务导向、整体导向。为总经理提供高效、专业的助理支持服务,协助高管进行日常工作管理,安排和实施高管参加的内外部会议、活动和出差;\n跟进领导交办的任务,确保事务的顺利实施;\n业务方面,协助高管推广业务或项目,协调维护内外公关;\n协助安排和组织高级管理团队的会议和活动;\n负责组织活动和文化,活跃部门组织气氛;以及组织系统一级的节日和外联活动;\n作为部门内各种行政人员工作的接口,包括行政、人事、资产、费用、合同、文档、数据管理等。\n部门财务预算的制定和管理;协助制定和实施部门的管理规章制度和各项流程;\n组织和维护秘书团队的日常事务和大型项目活动。
11 、 WXG10-企业微信音视频引擎开发(成都)、音视频相关专业硕士及以上学历;\n熟悉c\\c、网络、信号处理和深度学习技能;\ n年以上音视频引擎优化工作经验;‘负责企业内微信的音频或视频功能的引擎研发;\ n音频方向主要负责语音编解码性能优化、降噪rnn算法优化、语音fec优化、会议室回声处理、语音网络策略算法优化等算法工作;\n视频方向主要负责H265视频会议算法优化、超分辨率算法优化、高清会议室视频算法优化等;很好,我找到了。好像一个职位是高级秘书,一个是发动机研发人员。
后记:在写这个案例的过程中,有
第二个小意外:起初,在创建mysql数据表时,我将requirement和responsibility字段设置为varchar(200),报告了错误消息‘data too long for column requirement at row 8’。由于rollback的设置,报告错误之前的所有位置信息都不会存储在数据库中,只有报告错误之后的位置信息会存储在数据库中。后来我设置了varchar(500)就没有这个问题了。
转载请联系作者获得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。