版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
项目3招聘Requests爬虫项目网络爬虫应用项目式教程《网络爬虫项目实战》入门篇3.1项目介绍3.2任务分解3.3项目实施目录Content3.4课后练习3.5能力拓展3.1.1
项目目标爬取某招聘网站北京公司发布的招聘信息,统计不同公司类型的招聘岗位占比,统计结果以饼图显示。如下图所示。3.1.2学习目标技能目标1.能够使用Requests+XPath采集数据2.能够使用Pandas清洗数据3.能够使用Pandas分析数据4.能够使用ECharts可视化数据知识目标1.熟悉数据采集过程2.熟悉数据清洗常见方法3.熟悉数据分析特点4.了解数据可视化形式素质目标1.培育项目管理能力2.培育解决实际问题能力实训目标实训项目爬取某招聘网站,分析和可视化北京地区公司招聘岗位分布实操内容1.定位网页元素XPath2.编写Requests爬虫3.编写数据清洗代码4.编写数据分析代码5.设计和实施可视化图表3.2任务分解3.1项目目标3.3项目实施目录Content3.4课后练习3.5能力拓展3.2
任务分解从数据采集到可视化,本项目包括以下任务。数据采集职位名称公司名称公司属性发布属性数据清洗删除重复行抽取公司类型抽取发布时间数据分析按照公司类型分组统计岗位量数据可视化各类型公司招聘岗位比例饼图项目3招聘Requests爬虫项目网络爬虫实战项目式教程《网络爬虫项目实战》入门篇3.2任务分解3.1项目介绍3.3项目实施目录Content3.4课后练习3.5能力拓展3.3.1项目实施->数据采集(1)访问,显示网站首页,代表网站运行正常。如下图所示。:50001/findjob/index1.html3.3.1项目实施->数据采集(2)创建PyCharm项目jobvis,手工填写项目路径,选择Anaconda编译器。如下图所示。3.3.1项目实施->数据采集(3)访问网站首页,右键打开检查->Network,查看User-Agent、cookie、referer属性值。如下图所示。3.3.1项目实施->数据采集(4)创建findjob_spider.py,定义get_page函数。importcsvimportreimportrequestsfromlxmlimportetreefromrequests.utilsimportget_encodings_from_contentlist_base_url=":50001/findjob/index1.html"defget_page(url):#从chrome开发者工具复制User-Agent和cookie值(如果有的话)
headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36'}#发送GET请求
res=requests.get(url,headers)
#查看编码方式
enconding=get_encodings_from_content(res.text)#打印网页内容
html_doc=res.content.decode(enconding[0])returnhtml_doclist_base_url指向网站首页,headers的“User-Agent”值使用上面RequestHeaders复制过来的内容。3.3.1项目实施->数据采集RequestsRequests是基于urllib的HTTP库,爬虫通过Requests库完成发起请求和获取相应。(1)请求参数(2)响应参数3.3.1项目实施->数据采集(5)选择“检查”,在右边“Elements”窗口查找div元素,对照左边窗口的显示,找到各岗位div对应的页面元素。(6)停留在第1个岗位的职位名称,然后点击鼠标右键后,选择“检查”,查找职位名称的XPath路径。3.3.1项目实施->数据采集(7)鼠标停留在左面窗口的单位名称,然后点击鼠标右键后,选择“检查”,找到单位名称的XPath路径。(8)类似上述步骤,查找单位属性和发布时间的XPath路径。单位属性XPath相对路径:div[@class=‘er’]/p[@class=‘dcat’]/text()发布时间对应XPath相对路径:a/p/span[@class='time']/text()。3.3.1项目实施->数据采集(9)findjob_spider.py中增加parse_page。defparse_page(url):#解析页面到html树
page_content=get_page(url)response=etree.HTML(page_content)#提取岗位属性
node_list=response.xpath("//div[@class='j_joblist']/div[@class='e']")fornodeinnode_list:#职位名称
span_value=node.xpath("./a/p/span[@class='jnameat']/text()")iflen(span_value)>0:jobName=re.sub("\s+","",span_value[0])else:jobName="“#单位名称
a_value=node.xpath("./div[@class='er']/a/text()")companyName=a_value[0]iflen(a_value)>0else""
#单位属性,例:['国企|500-1000人']p_value=node.xpath("./div[@class='er']/p[@class='dcat']/text()")iflen(p_value)>0:companyAttr=re.sub("\s+","",p_value[0])else:companyAttr=""#发布时间,例:06-14发布
span_value=node.xpath("./a/p/span[@class='time']/text()")pubTime=span_value[0]iflen(span_value)>0else""#保存职位信息
withopen('findjob_raw.csv','a',newline="",encoding='utf-8')asf:csv_write=csv.writer(f)csv_write.writerow([jobName,companyName,companyAttr,pubTime])3.3.1项目实施->数据采集defwebsite_crawl():current_page_url=list_base_urlparse_page(current_page_url)
if__name__=='__main__':website_crawl()(10)findjob_spider.py定义website_crawl函数。(11)findjob_spider.py定义主函数。运行findjob_spider.py,结果如下图所示。嵌入式硬件工程师,上海大唐移动通信设备有限公司,国企|500-1000人,06-14发布模拟电路工程师,上海磐诺仪器有限公司,民营公司|150-500人,06-14发布……电气工程技术员,北京中治赛瑞科技有限责任公司,民营公司|少于50人,06-14发布硬件工程师,北京宝盈科技发展有限公司,民营公司|少于50人,06-14发布3.3.1项目实施->数据采集(12)回到网站首页,滑动页面到最底端,鼠标停留在最后一页的页码“5”,然后点击鼠标右键后,选择“检查”,查看页码“5”的XPath路径。从下图看出,页码“5”对应的XPath路径为“//div[@class="p_in"]/ul/li[last()-1]/a/text()”,“//”代表任意路径,“last()”代表最后一个li子结点,“last()-1”代表倒数第2个li子结点。3.3.1项目实施->数据采集(13)修改findjob_spider.py,定义list_base_url和offset,start_urls改变为可替换的模板,完善website_crawl函数,使爬虫具有翻页爬取功能。importrandomfromtimeimportsleeplist_base_url=":50001/findjob/index#offset#.html"defwebsite_crawl():#获取首页内容
start_url=list_base_url.replace("#offset#",str(1))first_page_doc=get_page(start_url)first_page_tree=etree.HTML(first_page_doc)#找到总页数
page_num=first_page_tree.xpath('//div[@class="p_in"]/ul/li[last()-1]/a/text()')
page_num=(int)(page_num[0])iflen(page_num)>0else0#访问所有页面
foriinrange(1,page_num+1)::current_page_url=list_base_url.replace("#offset#",str(i))#sleep(seconds)随机间隔5~10秒爬取页面,防止目标网站拦截
sleep(random.randint(5,10)+random.random())print("爬取第{}页".format(i))parse_page(current_page_url)3.3.1项目实施->数据采集(14)运行findjob_spider.py,结果如下图所示。嵌入式硬件工程师,上海大唐移动通信设备有限公司,国企|500-1000人,06-14发布模拟电路工程师,上海磐诺仪器有限公司,民营公司|150-500人,06-14发布……嵌入式硬件工程师,上海大唐移动通信设备有限公司,国企|500-1000人,06-14发布模拟电路工程师,上海磐诺仪器有限公司,民营公司|150-500人,06-14发布……模拟电路资深设计工程师,辰芯半导体(深圳)有限公司,民营公司|少于50人,06-14发布FAE现场应用工程师,北京维信诺光电技术有限公司,民营公司|50-150人,06-14发布3.3.2项目实施->数据清洗(1)创建data_clean.py,读入findjob_raw.csv到DataFrame类型。(2)删除重复记录。(3)从“单位属性”列抽取出单位类型和规模。importpandasaspdlabels=["职位名称","单位名称","单位属性","发布时间"]df=pd.read_csv('findjob_raw.csv',names=labels,encoding='utf-8')print(df.head())#去重df=df.drop_duplicates()print("去重后记录行数:{}".format(df.shape[0]))#字段“单位属性”裂变成二列:单位类型,规模。pattern="(?P<单位类型>.+)\|(?P<规模>.+)"compdesc_df=df["单位属性"].str.extract(pattern)df["单位类型"]=compdesc_df["单位类型"]df["规模"]=compdesc_df["规模"]df.drop(["单位属性"],axis=1,inplace=True)print(df[["单位类型","规模"]].head())3.3.2项目实施->数据清洗(4)删除“发布时间”列的“发布”后缀。(5)保存清洗后的数据。打开findjob_clean.csv,结果如下图。#字段“发布时间”去掉“发布”后缀。df["发布时间"]=df["发布时间"].str.replace("发布","")print(df["发布时间"].head())#保存清洗后的数据df.to_csv("findjob_clean.csv",index=False)3.3.3项目实施->数据分析(1)创建data_analysis.py,读入findjob_clean.csv到DataFrame类型。(2)按照单位类型分组后,统计招聘岗位数量。运行结果如下图所示。importpandasaspd#读入csv文件到Dataframe对象df=pd.read_csv("findjob_clean.csv",header=0,encoding="utf-8")print(df.head())#按单位类型统计岗位数量stats_stats=df.groupby(["单位类型"]).count()[["职位名称"]].reset_index().rename(columns={"职位名称":"岗位数量"})print(stats_stats)3.3.4项目实施->数据可视化(1)在项目根目录New->Directory,创建app目录。(2)在app目录下New->Directory,创建目录static,然后把echarts.min.js复制到app/static目录。(3)在app目录下New->Directory,创建templates目录。3.3.4项目实施->数据可视化(4)在templates目录下NewHTMLFile,创建single_chart.html。3.3.4项目实施->数据可视化(5)在single_chart.html中引入依赖的JS文件。3.3.4项目实施->数据可视化(6)定义div元素和编写JS代码。JS代码中引用数据分析产生的数据,实例化ECharts图表对象,然后传给div元素显示。项目3招聘Requests爬虫项目网络爬虫实战项目式教程《网络爬虫项目实战》入门篇3.2任务分解3.1项目介绍3.4课后练习目录Content3.3项目实施3.5能力拓展3.4课后练习1.选择题1.Requests是基于()的HTTP库。A.HTTPB.HTTPSC.ScrapyD.urllib2.request.get(timeout=0.5)中,timeout=0.5表示()。A.客户端最大连接时间等于0.5秒。B.客户端最大连接时间等于0.5分。C.客户端最大连接时间等于0.5毫秒。D.客户端最大连接时间等于0.5小时。3.Requests请求设置User-Agent、cookie、referer的原因是( )。A.默认参数。B.个人习惯。C.服务器要求。D.非空参数。3.4课后练习1.选择题4.执行splited_df=df["单位属性"].str.extract("(?P<单位类型>.+)\|(?P<规模>.+)")后,splited_df最多包含()列。A.0B.1C.2D.35.cypher_text=re.sub("\d+","*","电话)中,\d+代表()。A.0到多个数字。B.1到多个数字。C.0到多个字母。D.1到多个字母。3.4课后练习2.填空题(1)技术人员想从news.html中爬取新闻信息后保存到news_raw.csv,请完善代码。#encoding=utf-8importcsvfromlxmlimportetree#数据采集html=etree.parse('news.html',etree.HTMLParser(encoding="UTF-8"))items=html.xpath(
)3.4课后练习fori,iteminenumerate(items):print("第{}条新闻".format(i+1))data_url=item.xpath("
")[0]print("新闻链接={}".format(data_url))title=item.xpath("
")[0]print("新闻标题={}".format(title))pub_date=item.xpath("
")[0]print("发布时间={}".format(pub_date))withopen('news_raw.csv','a',newline="",encoding='utf-8')asf:csv_write=csv.writer(f)csv_write.writerow([data_url,title,pub_date])3.4课后练习2.填空题(2)生成的news_raw.csv中,“新闻链接”保存的是相对URL地址,技术人员想转到绝对地址(前面加前缀),也想把“发布时间”的时间连接符“-”删除,最后保存到news_clean.csv。请根据注释中的要求完善代码。#encoding=utf-8importpandasaspdlabels=["新闻链接","新闻标题","发布时间"]df=pd.read_csv('news_raw.csv',names=labels,encoding='utf-8')print(df.head())3.4课后练习#新闻链接中的”./"替换成"/",注意"."是一个通配符,需要用"\."表示符号"."。df["新闻链接"]=___________
pri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学消防安全教育说课稿
- 小学学习方法主题班会说课稿2025
- 第十节无人机编队表演说课稿2025学年初中信息技术甘教版2022八年级下册-甘教版2022
- 小学生文明礼仪培养主题班会说课稿
- 高产玉米种子生产基地可行性研究报告
- 2026年郑州游泳说课稿
- 小学中年级安全出行说课稿
- 2026中学教资形成性评价考点解析课件
- 高中2025年废物利用说课稿
- 初中语文整本书阅读说课稿2025
- 英语北京市西城区2026年高三年级统一测试试卷(西城高三一模)(4.7-4.10)
- (2025年)急性缺血性脑卒中静脉溶栓的护理常规考核试题及答案
- AI在教育课堂互动中的应用:场景、策略与评估
- 2026年报关员通关实务培训
- 电线电缆生产安全制度
- 文件控制程序培训
- 江苏省高职单招《职测》考试题库(附答案)
- 药明康德研发生产制度
- 建筑国企合规管理培训
- 供应链物流环节运输成本精细化管理降本增效方案
- 光伏电力调度考试题库及答案
评论
0/150
提交评论