网络爬虫项目实战 课件3-2 招聘Requests爬虫实战(项目实施)_第1页
网络爬虫项目实战 课件3-2 招聘Requests爬虫实战(项目实施)_第2页
网络爬虫项目实战 课件3-2 招聘Requests爬虫实战(项目实施)_第3页
网络爬虫项目实战 课件3-2 招聘Requests爬虫实战(项目实施)_第4页
网络爬虫项目实战 课件3-2 招聘Requests爬虫实战(项目实施)_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目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.rea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论