@Hadi
初来乍到 多多点赞
文章目录
前言
既然上一篇文章说到了爬虫,那我就把这一块再补充完整再换其他内容吧,其实我也是因为项目需求自学的爬虫,这篇文章只能给入门者一个启发的思路,如果想要更加系统化规范地了解学习网络爬虫技术建议上中国大学MOOC找找相关的课程,毕竟技术总是日新月异的,用手去思考永远不会错。延续上一篇提及的scrapy框架,正文里会有详细介绍,这次会利用它来爬取前程无忧所有的职位信息,我觉得这个是入门者理解爬虫的经典案例,因为51job没有任何的反爬机制,所以在入门者修改调试的时侯效率就非常高便于找到正确的思路,所以我会写的比较详细,希望能对入门的朋友有所启发。
一、简述Scrapy
1.什么是scrpay框架
Scrapy是一个适用爬取网站数据、提取结构性数据的应用程序框架,它可以应用在广泛领域:Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。通常我们可以很简单的通过 Scrapy 框架实现一个爬虫,抓取指定网站的内容或图片。 尽管Scrapy原本是设计用来屏幕抓取(更精确的说,是网络抓取),但它也可以用来访问API来提取数据。
2.基本架构
Scrapy Engine(引擎):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。
Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。
Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理。
Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器)。
Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方。
Downloader Middlewares(下载中间件):一个可以自定义扩展下载功能的组件。
Spider Middlewares(Spider中间件):一个可以自定扩展和操作引擎和Spider中间通信的功能组件
至于安装步骤我就不细述了pip install Scrapy🙃
二、需求分析
这次的需求是爬取前程无忧里的职位信息,所以第一步是先对目标网站进行摸索,先把网站基本的结构研究清楚,这很重要,因为不同的网站差异只有亿点点 ,其实很好理解,公司的需求不一样开发人员也不一样,做出来的东西也千变万化,所以思路很重要,具体案例具体分析,没有固定的做法,要有自己思考分析的能力,但其实本质不会变。
1.需求是什么
这里我定了相关的需求
作为演示我会爬取广州JAVA相关职位信息
2.对目标页面进行分析
进入51job后我们先点开广州JAVA的招聘信息列表
这时候发现列表中会有所需信息,但是信息并不全,详细信息会放在列表中点开的详情页里面,如图所示。
所以我们基本的思路就有了,我们先把列表中每一页的详情页链接拿到手,再扔给二级function里对子链接进行目标信息的抓取。至于目标信息怎么拿,不是现在考虑的事情,我们现在要做的是先把二级url先取下来,因为车到山前必有路,切莫心浮气躁。
URL结构分析
接下来这一步是非常重要的,我们要对目标的URL进行观察。因为我们要清楚URL才是程序的起点,是程序请求的地址。
一般URL上都是一些信息的编号,都是有实际意义的字符,一般这些信息都会放在网页源码或者web附随的js文件中。耐心改改刷新看看你就会发现其中的规律。
URL:“https://search.51job.com/list/030200,000000,0000,00,9,99,java,2,1.htmllang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=”
这个网站的URL还是比较友好的我也不多说了.
03200是广州的编号
.html前的数字是请求的页数
所以拼接前后的字符串做一个数字的累加便可达到翻页的目的从而爬取所有列表信息。
三.开始编码
1.抓取列表中的二级URL
其实不难发现列表中的相关信息是动态加载的,我之前做到这一步的时候有点懵了,我一直在刷新网页找动态加载的js,一直找不到,直到我打开网页源码一行一行去看…
所以说具体问题具体分析嘛
接着xpath定位就可以直接拿了,幸福来得太突然哈哈哈哈。
//对源码上的信息进行整理
contents_tmp = response.xpath('//script[contains(text(),"SEARCH_RESULT")]')[0].extract().strip().split("\r\n")[1].replace("window.__SEARCH_RESULT__ = ","").replace("\\","").split(",\"jobid_count")[0]+"}"
//整理后以json格式读入
contents=json.loads(contents_tmp)
datalist=contents['engine_search_result']
打点debug后抓取到的结果是这样的
每条json里面的jobhref属性不就是二级的URL吗,我们要做的就是遍历每一页中的列表中的每一个二级URL并且将其扔给二级的function去做第二步的信息抓取,跟着分析时的思路走就行了。
2.对详情页目标信息的抓取
详情页里面就是一个静态页面,所以说这个网站对爬虫还是比较友好的,怎么拿怎么有。
//二级抓取的方法
def parse_dail(self, response):
company_name = response.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[1]/a/p/text()').extract()
company_industry = response.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[3]/a/text()').extract()
company_location=response.meta['job_list'][0]
company_nature = response.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[1]/text()').extract()
company_overview = response.xpath('/html/body/div[3]/div[2]/div[3]/div[3]/div/text()').extract()
company_people = response.xpath('/html/body/div[3]/div[2]/div[4]/div[1]/div[2]/p[2]/text()').extract()
job_name = response.xpath('//h1[@title]/@title').extract()
job_time=response.meta['date']
job_edu_require=response.meta['job_list'][2]
job_exp_require = response.meta['job_list'][1]
job_salary = response.xpath('/html/body/div[3]/div[2]/div[2]/div/div[1]/strong/text()').extract()
job_info= response.xpath('/html/body/div[3]/div[2]/div[3]/div[1]/div/p/text()').extract()
job_welfare=response.meta['job_welfare']
四.结果展示
做到这里其实基本需求已经达到,接下来就是数据的反复确认清洗,因为这个网站也没有任何的反爬机制,只要编码到位你就能欣赏到控制台上的数据在跳舞。
最终的数据也是相当规整,有8000+条目标职位信息。
写在最后
这篇文章都是以分享本人分析的思路和步骤为主,具体实现的代码我就不po出来了,有兴趣的朋友可以动手做一做,毕竟数据还是有它的实际效用的。然后上一篇文章没想到kimol君竟然过来评论,一度以为看错了哈哈哈,后来我观察发现他应该在用脚本在刷评论,都是脚本怪啊唉,不管怎样,还是感谢各位大佬的支持!
我是Hadi,祝大家周末愉快~