本发明涉及数据爬取技术领域,具体为一种基于分布式爬虫技术的数据爬取实现方法。
背景技术:
现有技术中常见的几种爬虫类型有:通用爬虫、聚焦爬虫和增量爬虫,常用几种数据解析方式有正则、bs4、xpath。
但是,通用爬虫只提供和文本相关的内容(html、word、pdf)等等,但是不能提供多媒体文件(音乐、图片、视频)和二进制文件(程序、脚本),提供的结果千篇一律,不能针对不同背景领域的人提供不同的搜索结果,不能理解人类语义上的检索,bs4只能解析html格式的数据,综上,本发明提供一种基于分布式爬虫技术的数据爬取实现方法来解决上述问题。
技术实现要素:
针对现有技术的不足,本发明提供了一种基于分布式爬虫技术的数据爬取实现方法,解决了背景技术中提到的问题。
为实现以上目的,本发明通过以下技术方案予以实现:一种基于分布式爬虫技术的数据爬取实现方法,包括以下步骤:
s1、指定url,根据给定地址找到最终需要找到抓取数据的地址,并得到对应的指标代码;
s2、发起请求,根据s1获取到的代码,拼接网址并判断是否为所需的抓取数据,如果为数据页,则回调到详情页,否则继续循环寻找数据网址;
s3、获取数据,网址中拼接相应参数,定时抽取数据,在网址中加入日期参数,分地区的数据中加入分地区参数,从start-urls中扣出对应的数据类型,判断走哪个抓取流程;
s4、解析数据,使用json.loads,将字符串转换为json格式数据,以循环的方式获取单位和地区,并以字典形式保存,解决数据与单位,地区不在一起,无法正常的问题;
s5、持久化存储,用scrapy框架抓取,需要在items.py中定义好需要使用到的字段和对应的类,pipelines.py中实现数据持久化存储,根据不同item类,存储不同的数据到对应的表中。
如上述的基于分布式爬虫技术的数据爬取实现方法,其中,优选的是,所述s1中,点击经邦网站中月度、季度和年度等选项,发现数据跟着变,在networkpreview中发现,根据行业也代码,一级级迭代,isparent=true说明页面加载的是指标代码,不是真正的数据,当isparent=false时,为叶子节点,为每个行业最终数据,以上地址为一开始的地址,从此地址中得到对应的指标代码,便于下一次数据抓取的网址拼接。
如上述的基于分布式爬虫技术的数据爬取实现方法,其中,优选的是,所述s3中,数据都是json格式,提取规则不完全一样,在一开始分别传入不同类型的数据网址,用正则扣出对应的抓取数据类型,走不同代码分支,同时事先将分地区的数据抓取下来,以字典的形式保存,并以参数的形式传入url中,这样达到不同类型的数据抓取走不同的分支,相同部分不重复写。
如上述的基于分布式爬虫技术的数据爬取实现方法,其中,优选的是,所述s4中,在循环内,对每次获取到的数据,以元组的形式存放并追加到列表中,达到循环外批量yield数据,有翻页时,如果不屏蔽重复,则下一页不能正常抓取,需要修改参数dont_filter=true。
本发明与现有技术相比具备以下有益效果:采用聚焦抓取、scrappy,抓取过程中使用了正则,json数据,数据频度为年,月,季度等多个数据,增量更新,批量插入oracle数据库,在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息,方便的检查一个字符串是否与某种模式匹配。
具体实施方式
下面对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明提供一种技术方案:一种基于分布式爬虫技术的数据爬取实现方法,采用的是聚焦抓取(是"面向特定主题需求"的一种网络爬虫程序,它聚焦爬虫在实施网页抓取时会对内容进行处理筛选,尽量保证只抓取与需求相关的网页信息)、scrappy,抓取过程中使用了正则(正则表达式是一个特殊的字符序列,它能方便的检查一个字符串是否与某种模式匹配),json数据,数据频度为年,月,季度等多个数据,增量更新,批量插入oracle数据库,包括以下步骤:
s1、指定url,根据给定地址找到最终需要找到抓取数据的地址,并得到对应的指标代码;
s2、发起请求,根据s1获取到的代码,拼接网址并判断是否为所需的抓取数据,如果为数据页,则回调到详情页,否则继续循环寻找数据网址;
s3、获取数据,网址中拼接相应参数,定时抽取数据,在网址中加入日期参数,分地区的数据中加入分地区参数,从start-urls中扣出对应的数据类型,判断走哪个抓取流程;
s4、解析数据,使用json.loads,将字符串转换为json格式数据,以循环的方式获取单位和地区,并以字典形式保存,解决数据与单位,地区不在一起,无法正常的问题;
s5、持久化存储,用scrapy框架抓取,需要在items.py中定义好需要使用到的字段和对应的类,pipelines.py中实现数据持久化存储,根据不同item类,存储不同的数据到对应的表中,由于数据量比较大,难免抓取过程中中断,需要处理数据库中数据重复的问题,使用executemany批量处理,减少数据库访问次数,提高性能。
s1中,点击经邦网站中月度、季度和年度等选项,发现数据跟着变,在networkpreview中发现,根据行业也代码,一级级迭代,isparent=true说明页面加载的是指标代码,不是真正的数据,当isparent=false时,为叶子节点,为每个行业最终数据,以上地址为一开始的地址,从此地址中得到对应的指标代码,便于下一次数据抓取的网址拼接。
s3中,数据都是json格式,提取规则不完全一样,在一开始分别传入不同类型的数据网址,用正则扣出对应的抓取数据类型,走不同代码分支,同时事先将分地区的数据抓取下来,以字典的形式保存,并以参数的形式传入url中,这样达到不同类型的数据抓取走不同的分支,相同部分不重复写。
s4中,在循环内,对每次获取到的数据,以元组的形式存放并追加到列表中,达到循环外批量yield数据,有翻页时,如果不屏蔽重复,则下一页不能正常抓取,需要修改参数dont_filter=true。
一般return在def中出现,跳出def,就算有return,finally下面语句继续执行,抓取过程中访问太快,导致对方服务器压力过大,或者被识别是抓取程序,导致最终抓取失败,需要模拟浏览器访问,使用ua伪装,setting.py添加请求头信息,添加time.sleep(2)等,降低请求速度,模拟浏览器访问,使用代理模拟多人访问等,全量抓取时,url可以不用传入更多的参数,抓取完一个网址,放到对应txt中,下次发起请求时,从txt中判断是否重复,如若重复跳过,没有重复,则抓取等。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。
尽管已经示出和描述了本发明的实施例,对于本领域的普通技术人员而言,可以理解在不脱离本发明的原理和精神的情况下可以对这些实施例进行多种变化、修改、替换和变型,本发明的范围由所附权利要求及其等同物限定。
1.一种基于分布式爬虫技术的数据爬取实现方法,其特征在于:包括以下步骤:
s1、指定url,根据给定地址找到最终需要找到抓取数据的地址,并得到对应的指标代码;
s2、发起请求,根据s1获取到的代码,拼接网址并判断是否为所需的抓取数据,如果为数据页,则回调到详情页,否则继续循环寻找数据网址;
s3、获取数据,网址中拼接相应参数,定时抽取数据,在网址中加入日期参数,分地区的数据中加入分地区参数,从start-urls中扣出对应的数据类型,判断走哪个抓取流程;
s4、解析数据,使用json.loads,将字符串转换为json格式数据,以循环的方式获取单位和地区,并以字典形式保存,解决数据与单位,地区不在一起,无法正常的问题;
s5、持久化存储,用scrapy框架抓取,需要在items.py中定义好需要使用到的字段和对应的类,pipelines.py中实现数据持久化存储,根据不同item类,存储不同的数据到对应的表中。
2.根据权利要求1所述的一种基于分布式爬虫技术的数据爬取实现方法,其特征在于:所述s1中,点击经邦网站中月度、季度和年度等选项,发现数据跟着变,在networkpreview中发现,根据行业也代码,一级级迭代,isparent=true说明页面加载的是指标代码,不是真正的数据,当isparent=false时,为叶子节点,为每个行业最终数据,以上地址为一开始的地址,从此地址中得到对应的指标代码,便于下一次数据抓取的网址拼接。
3.根据权利要求1所述的一种基于分布式爬虫技术的数据爬取实现方法,其特征在于:所述s3中,数据都是json格式,提取规则不完全一样,在一开始分别传入不同类型的数据网址,用正则扣出对应的抓取数据类型,走不同代码分支,同时事先将分地区的数据抓取下来,以字典的形式保存,并以参数的形式传入url中,这样达到不同类型的数据抓取走不同的分支,相同部分不重复写。
4.根据权利要求3所述的一种基于分布式爬虫技术的数据爬取实现方法,其特征在于:所述s4中,在循环内,对每次获取到的数据,以元组的形式存放并追加到列表中,达到循环外批量yield数据,有翻页时,如果不屏蔽重复,则下一页不能正常抓取,需要修改参数dont_filter=true。
技术总结