保姆级爬虫教程:用python爬取“实习网”的信息,马上帮小伙伴们找到合适的实习工作??暑假快到了,很多小伙伴都在找暑期实习是吧?前几天朋友的弟弟想利用暑假找个实习锻炼一下自己,但是面对网上成千上万的实习招聘信息,简直是应接不暇。然后我的朋友给我发了一条“请求帮助”的信息。了解了大概情况后,我马上用爬虫爬了练习网的信息,发送了数据结果,分分钟解决了问题。请我吃顿饭也不过分吧?本爬虫实战教程不仅适合新手练习爬虫,也适合需要找实习资料的朋友!希望看完这篇文章,能够清晰的理解爬虫的整个过程,并独立完成。其次,我可以通过自己的爬虫实战获取自己想要的信息。好吧,事不宜迟,让我们开始吧!内容主要分为三部分:1.页面分析2.爬虫步骤详解1.目标页面分析首先,我们应该知道我们的爬虫目标是什么吧?俗话说,知己知彼,百战不殆。我们已经知道我们要爬取的页面是“练习网”,所以我们要先去练习网看看它有什么数据。实习网址:https://www.shixi.com/search/...页面如下:比如我们要找的职位是“品牌运营”职位的数据。所以直接在网页搜索框中输入品牌运营即可。你会发现url变了!注意:我们要爬取的页面是这个页面:https://www.shixi.com/search/...这个很重要,关系到后面的代码编写,可以帮你检查页面的所有信息是否都被爬取了。这时候要注意,我们所在的页面是“一级页面”。在浏览过程中,当我们点击任意一个帖子进入时,都会显示“二级页面”。这时候你也会发现url又出现了。变了。比如我们点击一??个品牌运营实习,二级页面会自动跳转到这个,生成一个新的链接。如图:你要爬取页面的哪些信息?在分析过程中,我们发现有的信息在一级页面,有的在二级页面。在一级页面上,我们可以获得哪些信息?如图:副页一共有5个有效数据:职位、公司名称、学历、薪水、地址,看看能得到哪些有效数据,字段和规模,阶段,如果你觉得重要,你也可以纳入爬虫的范畴,不过我个人认为这不影响实习。毕竟不是正式工作,所以影响不会很大。相反,招聘实习生的数量更为重要。这里没有显示招募人数,所以无法在图片上显示,可以稍后添加。至此,我们一共需要抓取7条数据,加上总共8条数据,就是我们爬虫最终的目标数据。爬取“静态”网页下面我们分析什么叫静态网页,什么叫动态网页。对于静态网页来说,随着html代码的生成,页面的内容和显示效果基本不会发生变化——除非你修改页面代码。这不是动态网页的情况。虽然页面代码没有改变,但是显示的内容会随着时间、环境或者数据库操作的结果而改变。它们的区别在于静态网页中的数据是一次性的,也就是说,它是一次性给你的。动态网页中的数据是随着页面的一步步加载而逐渐呈现的,即静态网页的爬虫技术无法获取其中的所有数据。值得强调的是,不要将动态网页与页面内容是否动态混淆。这里所说的动态网页与网页上的各种动画、滚动字幕等视觉动态效果没有直接关系。动态网页也可以是纯文本内容,也可以包含各种动画内容。不管网页是否具有动态效果,只要是利用动态网站技术生成的网页,都可以称为动态网页。点击“鼠标右键”,点击“查看网页源代码”,最终效果如图(部分截图):这就是最后反馈给你的数据。如果你发现你想要的所有数据都在里面,那么你可以说它是一个静态页面,如果不是它就被认为是一个“动态页面”。今天这里的案例是静态网页。大家知道,在写代码之前,首先要知道我们会使用哪些方法,哪些库,哪些模块来帮你解析数据。常用的解析数据的方法有:re正则表达式、xpath、beatifulsoup、pyquery等,我们需要用到的是xpath解析方法来解析定位数据。二、爬虫代码解释1、导入相关库的第一步是考虑在爬虫过程中需要哪些库。你必须知道python是一种依赖于许多库的语言。没有库的Python是不完整的。importpandasaspd#用于数据存储importrequests#用于请求网页importchardet#用于修改编码importre#用于从lxml中提取数据importetree#用于解析数据的库importtime#可以大致模拟人为请求网页的速度importwarnings#代码运行时忽略警告信息warnings.filterwarnings("ignore")2.请求一级页面源码url='https://www.shixi.com/search/index?key=brandoperation&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn'headers={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/71.0.3578.98Safari/537.36'}rqg=requests.get(url,headers=headers,verify=False)①rqg.encoding=chardet.detect(rqg.content)['encoding']②html=etree.HTML(rqg.text)这里要注意①②两个地方。①处有两个参数,一个是headers,一个是verify。其中headers是一种防破解措施,它让浏览器认为爬虫不是爬虫,而是人在用浏览器正常请求网页。verify是忽略安全证书的提示,有些网页会被认为是不安全的网页,会提示你,你只需要记住这个参数即可。在②处,我们得到了网页的源代码。但由于网页源代码的编码方式与您电脑的解析方式不一致,可能导致返回结果出现乱码。此时需要修改编码方式。chardet库可以帮你自动检测网页源代码的编码。(一个非常好用的检测文档编码的第三方库chardet)3.解析一级页面网页中的信息#1.公司名称company_list=html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')company_list=[company_list[i].strip()foriinrange(len(company_list))ifi%2!=0]#2.作业名称job_list=html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')job_list=[job_list[i].strip()foriinrange(len(job_list))ifi%2==0]#3.addressaddress_list=html.xpath('//div[@class="job-pannel-two"]//a/text()')#4.教育degree_list=html.xpath('//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()')#5.薪水salary_list=html.xpath('//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()')salary_list=[i.strip()foriinsalary_list]4.获取二级页面链接deep_url_list=html.xpath('//div[@class="工作-pannel-list"]//dt/a/@href')x="https://www.shixi.com"deep_url_list=[x+iforiindeep_url_list]此时可以看到我直接使用xpath对一级页面中的数据分析进行了逐条分析。代码最后可以看到:我们已经获取到了二级页面的链接,为我们后面爬取二级页面中的信息做准备。解析二级页面中的信息demand_list=[]area_list=[]scale_list=[]fordeep_urlindeep_url_list:rqg=requests.get(deep_url,headers=headers,verify=False)①rqg.encoding=chardet.detect(rqg.content)['encoding']②html=etree.HTML(rqg.text)③#6.招募人数需求=html.xpath('//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()')#7.公司域区域=html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()')#8.公司规模scale=html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()')demand_list.append(demand)area_list.append(area)scale_list.append(scale)需要注意的是二级页面它也是一个页面。爬取里面的数据的时候,还需要请求页面。因此,①②③处的代码完全相同。5.翻页操作https://www.shixi.com/search/...https://www.shixi.com/search/...https://www.shixi.com/search/...随意复制几个不同页面的url并观察差异。这里可以看出page参数后面的数字不一样,是第几页。x="https://www.shixi.com/search/index?key=dataanalysis&page="url_list=[x+str(i)foriinrange(1,21)]因为我们抓取了20个页面20个url在这里构造,它们都存在于url_list列表中。现在让我们看一下整个代码,我不再用文字描述,只写代码中的注释。importpandasaspdimportrequestsimportchardeimportrefromlxmlimportetreeimporttimeimportwarningswarnings.filterwarnings("ignore")defget_CI(url):#请求获取一级页面源码url='https://www.shixi.com/search/index?key=BrandOperations&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn'headers={'User-Agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/71.0.3578.98Safari/537.36'}rqg=requests.get(url,headers=headers,verify=False)rqg.encoding=chardet.detect(rqg.content)['encoding']html=etree.HTML(rqg.text)#获取一级页面的信息:一共有5条信息。#①公司名称company_list=html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')company_list=[company_list[i].strip()foriinrange(len(company_list))ifi%2!=0]#②岗位job_list=html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')job_list=[job_list[i].strip()foriinrange(len(job_list))ifi%2==0]#③地址address_list=html.xpath('//div[@class="job-pannel-two"]//a/text()')#④学历degree_list=html.xpath('//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()')#⑤薪酬salary_list=html.xpath('//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()')salary_list=[i.strip()foriinsalary_list]#⑥获得二级页面的内容deep_url_list=html.xpath('//div[@class="job-pannel-list"]//dt/a/@href')x="https://www.shixi.com"deep_url_list=[x+iforiindeep_url_list]demand_list=[]area_list=[]scale_list=[]#获取二级页面中的信息:fordeep_urlindeep_url_list:rqg=requests.get(deep_url,headers=headers,verify=False)rqg.encoding=chardet.detect(rqg.content)['encoding']html=etree.HTML(rqg.text)#①需要多少人demand=html.xpath('//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()')#②公司字段area=html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()')#③公司规模scale=html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()')demand_list.append(demand)area_list.append(area)scale_list.append(scale)#④将每个页面获取的所有数据存储在DataFrame中data=pd.DataFrame({'公司名称':company_list,'职位名称':job_list,'地址':address_list,"学历":degree_list,'薪资':salary_list,'职位需求':demand_list,'公司领域':area_list,'公司规模':scale_list})return(data)x="https://www.shixi.com/search/index?key=dataanalysis&page="url_list=[x+str(i)foriinrange(1,61)]res=pd.DataFrame(columns=['公司名称','岗位名称','地址',"学历",'薪资','职位需求','公司领域','公司size'])#这里是url_list中url的“翻页”操作:res0=get_CI(url)res=pd.concat([res,res0])time.sleep(3)#savedatares.to_csv('aliang.csv',encoding='utf_8_sig')这样设置之后,爬虫的思路是不是瞬间清晰了?眼睛:我会!手:我还是不会。需要更多的练习。初学者不要急于求成,项目不多,但要精。踏踏实实地了解一个,远比看十个有效。想要获取源码的朋友,点赞+评论,私聊~
