当前位置: 首页 > 后端技术 > PHP

Python爬虫框架Scrapy实战——抓BOSS直聘招聘信息

时间:2023-03-29 16:52:31 PHP

原文地址:http://www.jtahstu.com/blog/s...Python爬虫框架Scrapy实战——抓BOSS直聘招聘信息零、开发环境MacBookPro(13英寸,2016,两个Thunderbolt3端口)CPU:2GHzIntelCorei5RAM:8GB1867MHzLPDDR3Python版本:v3.6.3[GCC4.2.1(AppleInc.build5666)(dot3)】关于darwinMongoDB版本:v3.4.7MongoDB可视化工具:MongoBoosterv4.1.31.准备工作安装Scrapypip3安装scrapy顺利的话会像我一样安装很多软件包。参考翻译文档的安装教程:http://scrapy-chs.readthedocs...GitHub官方地址:https://github.com/scrapy/scrapy2.新建项目scrapystartprojectwww_zhipin_com顺利的话,就会像我一样3.在items中定义要抓取的物品。py文件定义了一个类classWwwZhipinComItem(scrapy.Item):#在此处为您的项目定义字段,例如:#name=scrapy.Field()pid=scrapy.Field()positionName=scrapy.Field()positionLabels=scrapy.Field()workYear=scrapy.Field()salary=scrapy.Field()city=scrapy.Field()education=scrapy.Field()companyShortName=scrapy.Field()industryField=scrapy.Field()financeStage=scrapy.Field()companySize=scrapy.Field()time=scrapy.Field()updated_at=scrapy.Field()四、分析页面一般有一个招聘像下面html结构如下在爬虫中,cssselector用于获取标签5.在爬虫代码的spiders目录下新建一个zhipin_spider.py#-*-coding:utf-8-*-importscrapyimporttimefromwww_zhipin_com.itemsimportWwwZhipinComItemclassZhipinSpider(scrapy.Spider):#蜘蛛名称定义Scrapy如何定位(和初始化)蜘蛛,所以它必须是唯一的,但是你可以不受任何限制地生成同一个蜘蛛的多个实例。name是spider最重要的属性,必选name='zhipin'#可选。包含允许蜘蛛抓取的域名(domain)列表。启用OffsiteMiddleware后,将不会跟踪域不在列表中的URL。allowed_domains=['www.zhipin.com']#网址列表。当没有指定具体的URL时,蜘蛛将从这个列表开始爬行。#这里我们指定了,所以不是从这个URL列表中抓取start_urls=['http://www.zhipin.com/']#抓取的页面可以改成你需要搜索的条件,这里搜索是Shanghai-PHP,其他条件无限制positionUrl='http://www.zhipin.com/c101020100/h_101020100/?query=php'curPage=1#发送header,伪装成浏览器headers={'x-devtools-emulate-network-conditions-client-id':"5f2fc4da-c727-43c0-aad4-37fce8e3ff39",'upgrade-insecure-requests':"1",'user-agent':"Mozilla/5.0(Macintosh;IntelMacOSX10_12_6)AppleWebKit/537.36(KHTML,likeGecko)Chrome/60.0.3112.90Safari/537.36",'accept':"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",'dnt':"1",'accept-encoding':"gzip,deflate",'accept-language':"zh-CN,zh;q=0.8,en;q=0.6",'cookie':"__c=1501326829;lastCity=101020100;__g=-;__l=r=https%3A%2F%2Fwww.google.com.hk%2F&l=%2F;__a=38940428.1501326829..1501326829.20.1.20.20;Hm_lvt_194df3105ad7148dcf2b98a91b5e727一=1501326839;hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1502948718;__c=1501326829;最后城市=101020100;__g=-;hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1501326839;hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1502954829;__l=r=https%3A%2F%2Fwww.google.com.hk%2F&l=%2F;__a=38940428.1501326829..1501326829.21.1.21.21",'cache-control':"no-cache",'postman-token':"76554687-c4df-0c17-7cc0-5bf3845c9831"}//这个方法必须返回一个Iterableobject(iterable)这个对象包含了蜘蛛爬取的第一个Request。//这个方法只会被Scrapy调用一次,所以你可以把它实现成一个generatordefstart_requests(self):return[self.next_request()]//负责处理响应并返回处理后的数据和(/或)后续URL。defparse(self,response):print("request->"+response.url)job_list=response.css('div.job-list>ul>li')forjobinjob_list:item=WwwZhipinComItem()job_primary=job.css('div.job-primary')item['pid']=job.css('div.info-primary>h3>a::attr(data-jobid)').extract_first().strip()item["positionName"]=job_primary.css('div.info-primary>h3>a::text').extract_first().strip()item["salary"]=job_primary.css('div.info-primary>h3>a>span::text').extract_first().strip()info_primary=job_primary.css('div.info-primary>p::text').extract()项目['城市']=info_primary[0].strip()item['workYear']=info_primary[1].strip()item['education']=info_primary[2].strip()item['companyShortName']=job_primary.css('div.info-company>div.company-text>h3>a::text').extract_first().strip()company_infos=job_primary.css('div.info-company>div.company-text>p::text').extract()iflen(company_infos)==3:#有joboffer,这里只有两项,所以加判断项['industryField']=company_infos[0].strip()item['financeStage']=company_infos[1].strip()item['companySize']=company_infos[2].strip()item['positionLabels']=job.css('li>div.job-tags>span::text').extract()item['time']=job.css('span.time::text').extract_first().strip()item['updated_at']=time.strftime("%Y-%m-%d%H:%M:%S",time.localtime())yielditemself.curPage+=1time.sleep(5)#停止,停止,停止!听听!停下来听!睡会儿(~﹃~)~zZyieldself.next_request()#发送请求defnext_request(self):returnscrapy.http.FormRequest(self.positionUrl+("&page=%d&ka=page-%d"%(self.curPage,self.curPage)),headers=self.headers,callback=self.parse)运行脚本scrapycrawlzhipin-o这里的item.json会在项目目录下生成一个item.json的json文件。Unicode编码的文件,所以需要在settings.py中添加设置(PS:运行时也可以带上这个参数)FEED_EXPORT_ENCODING='utf-8'下面的方法并没有解决问题。第2点比较慢注意不要爬的太快,因为BOSS直聘只会显示20页的招聘信息,所以理论上这个脚本只需要执行20次,所以间隔要设置的越长越好。当我爬升时,我将其设置为5秒。不过六字真言后面的速度要快一些。幸运的是,我爬取数据的速度较慢,所以我可以走得更快!第3点修改为自定义条件。可以修改zhipin_spider.py第18行positionUrl的链接,把PHP改成Java或者Python,把城市代码('c101020100'==Shanghai)换成你需要查询的城市,就可以爬取自——定位,很有灵性!6.保存到数据库一个json数据如下{"pid":"16115932","positionName":"PHP后台开发工程师","salary":"13K-20K","city":"Shanghai","workYear":"1-3年","education":"本科生","companyShortName":"蜻蜓FM","industryField":"Internet","financeStage":"D轮及以上","companySize":"100-499人","positionLables":["PHP"],"time":"Publishedyesterday","updated_at":"2017-12-1017:36:21"},使用软件导入json文件存入MongoDB备用7.不足这里招聘的详细要求没有爬取刚刚抓取的数据还没有进行本项目的初始处理开源地址:http://git.jtahstu.com/jtahst...8.后记可能有人会问,爬这些数据有什么用,现在又不想换工作?我的回答是,当然,一定有用,这样才能提高自己,有针对性的学习技术。另一方面,钱和事业的事情都是大事。好了,这篇文章到此结束,下一篇文章就让我们仔细分析一下。招聘PHP程序员,什么样的公司需要招聘PHP程序员吗?PHP程序员需要具备哪些常规技能和冷门技能,需要具备哪些技能ll树应该被点亮,敬请期待。非常感谢你抽出三五分钟看完这篇Python基础知识的文章,^_^9。致谢文章创作过程中参考了以下文档和文章,如Scrapy1.0中文文档Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)-博客园Scrapy笔记02-完整实例