生活常识

爬虫技术是做什么的(详解4种类型的爬虫技术)

2025-02-10 生活常识 本文链接

导读:网络爬虫是一种很好的自动采集数据的通用手段。本文将会对爬虫的类型进行介绍。

01 聚焦爬虫技术

聚焦网络爬虫(focused crawler)也就是主题网络爬虫。聚焦爬虫技术增加了链接评价和内容评价模块,其爬行策略实现要点就是评价页面内容以及链接的重要性。

基于链接评价的爬行策略,主要是以Web页面作为半结构化文档,其中拥有很多结构信息可用于评价链接重要性。还有一个是利用Web结构来评价链接价值的方法,也就是HITS法,其通过计算每个访问页面的Authority权重和Hub权重来决定链接访问顺序。

而基于内容评价的爬行策略,主要是将与文本相似的计算法加以应用,提出Fish-Search算法,把用户输入查询词当作主题,在算法的进一步改进下,通过Shark-Search算法就能利用空间向量模型来计算页面和主题相关度大小。

面向主题爬虫,面向需求爬虫:会针对某种特定的内容去爬取信息,而且会保证信息和需求尽可能相关。一个简单的聚焦爬虫使用方法的示例如下所示。

importurllib.request #爬虫专用的包urllib,不同版本的Python需要下载不同的爬虫专用包importre #正则用来规律爬取keyname=""#想要爬取的内容key=urllib.request.quote(keyname) #需要将你输入的keyname解码,从而让计算机读懂foriinrange(0,5):#(0,5)数字可以自己设置,是淘宝某产品的页数url="https://s.taobao.com/search?q="+key+"&imgfile=&js=1&stats_click=search_radio_all%3A1&initiative_id=staobaoz_20180815&ie=utf8&bcoffset=0&ntoffset=6&p4ppushleft=1%2C48&s="+str(i*44) #url后面加上你想爬取的网站名,然后你需要多开几个类似的网站以找到其规则#data是你爬取到的网站所有的内容要解码要读取内容pat='"pic_url":"//(.*?)"'#pat使用正则表达式从网页爬取图片#将你爬取到的内容放在一个列表里面print(picturelist) #可以不打印,也可以打印下来看看forjinrange(0,len(picturelist)): picture=picturelist[j] pictureurl="http://"+picture #将列表里的内容遍历出来,并加上http://转到高清图片file="E:/pycharm/vscode文件/图片/"+str(i)+str(j)+".jpg"#再把图片逐张编号,不然重复的名字将会被覆盖掉urllib.request.urlretrieve(pictureurl,filename=file) #最后保存到文件夹

02 通用爬虫技术

通用爬虫技术(general purpose Web crawler)也就是全网爬虫。其实现过程如下。

通用爬虫技术的应用有着不同的爬取策略,其中的广度优先策略以及深度优先策略都是比较关键的,如深度优先策略的实施是依照深度从低到高的顺序来访问下一级网页链接。

关于通用爬虫使用方法的示例如下。

''' 爬取京东商品信息: 请求url:https://www.jd.com/ 提取商品信息: 1.商品详情页 2.商品名称 3.商品价格 4.评价人数 5.商品商家 '''fromseleniumimportwebdriver#引入selenium中的webdriverfromselenium.webdriver.common.keysimportKeys importtime defget_good(driver):try: #通过JS控制滚轮滑动获取所有商品信息js_code=''' window.scrollTo(0,5000); '''driver.execute_script(js_code)#执行js代码#等待数据加载time.sleep(2) #查找所有商品p#good_p=driver.find_element_by_id('J_goodsList')good_list=driver.find_elements_by_class_name('gl-item') n=1forgoodingood_list: #根据属性选择器查找#商品链接good_url=good.find_element_by_css_selector( '.p-imga').get_attribute('href') #商品名称good_name=good.find_element_by_css_selector( '.p-nameem').text.replace("n","--") #商品价格good_price=good.find_element_by_class_name( 'p-price').text.replace("n",":") #评价人数good_commit=good.find_element_by_class_name( 'p-commit').text.replace("n","") good_content=f''' 商品链接:{good_url}商品名称:{good_name}商品价格:{good_price}评价人数:{good_commit}n '''print(good_content) withopen('jd.txt','a',encoding='utf-8')asf: f.write(good_content) next_tag=driver.find_element_by_class_name('pn-next') next_tag.click() time.sleep(2) #递归调用函数get_good(driver) time.sleep(10) finally: driver.close() if__name__=='__main__': good_name=input('请输入爬取商品信息:').strip() driver=webdriver.Chrome() driver.implicitly_wait(10) #往京东主页发送请求driver.get('https://www.jd.com/') #输入商品名称,并回车搜索input_tag=driver.find_element_by_id('key') input_tag.send_keys(good_name) input_tag.send_keys(Keys.ENTER) time.sleep(2) get_good(driver)

03 增量爬虫技术

某些网站会定时在原有网页数据的基础上更新一批数据。例如某电影网站会实时更新一批最近热门的电影,小说网站会根据作者创作的进度实时更新最新的章节数据等。在遇到类似的场景时,我们便可以采用增量式爬虫。

增量爬虫技术(incremental Web crawler)就是通过爬虫程序监测某网站数据更新的情况,以便可以爬取到该网站更新后的新数据。

关于如何进行增量式的爬取工作,以下给出三种检测重复数据的思路:

  1. 在发送请求之前判断这个URL是否曾爬取过;
  2. 在解析内容后判断这部分内容是否曾爬取过;
  3. 写入存储介质时判断内容是否已存在于介质中。

不难发现,实现增量爬取的核心是去重。目前存在两种去重方法。

关于增量爬虫的使用方法示例如下所示。

importscrapy fromscrapy.linkextractorsimportLinkExtractor fromscrapy.spidersimportCrawlSpider,Rule fromredisimportRedis fromincrementPro.itemsimportIncrementproItem classMovieSpider(CrawlSpider):name='movie'#allowed_domains=['www.xxx.com']start_urls=['http://www.4567tv.tv/frim/index7-11.html'] rules=( Rule(LinkExtractor(allow=r'/frim/index7-d+.html'),callback='parse_item',follow=True), ) #创建Redis链接对象conn=Redis(host='127.0.0.1',port=6379) defparse_item(self,response):li_list=response.xpath('//li[@]') forliinli_list: #获取详情页的urldetail_url='http://www.4567tv.tv'+li.xpath('./a/@href').extract_first() #将详情页的url存入Redis的set中ex=self.conn.sadd('urls',detail_url) ifex==1: print('该url没有被爬取过,可以进行数据的爬取') yieldscrapy.Request(url=detail_url,callback=self.parst_detail) else: print('数据还没有更新,暂无新数据可爬取!') #解析详情页中的电影名称和类型,进行持久化存储defparst_detail(self,response):item=IncrementproItem() item['name']=response.xpath('//dt[@]/text()').extract_first() item['kind']=response.xpath('//p[@]/dl/dt[4]//text()').extract() item['kind']=''.join(item['kind']) yieldit

管道文件:

fromredisimportRedis classIncrementproPipeline(object):conn=None defopen_spider(self,spider): self.conn=Redis(host='127.0.0.1',port=6379) defprocess_item(self,item,spider): dic={ 'name':item['name'], 'kind':item['kind'] } print(dic) self.conn.push('movieData',dic) #如果push不进去,那么dic变成str(dic)或者改变redis版本pipinstall-Uredis==2.10.6returnitem

04 深层网络爬虫技术

在互联网中,网页按存在方式可以分为表层网页和深层网页两类。

所谓的表层网页,指的是不需要提交表单,使用静态的链接就能够到达的静态页面;而深层网页则隐藏在表单后面,不能通过静态链接直接获取,是需要提交一定的关键词后才能够获取到的页面,深层网络爬虫(deep Web crawler)最重要的部分即为表单填写部分。

在互联网中,深层网页的数量往往要比表层网页的数量多很多,故而,我们需要想办法爬取深层网页。

深层网络爬虫的基本构成:URL列表、LVS列表(LVS指的是标签/数值集合,即填充表单的数据源)、爬行控制器、解析器、LVS控制器、表单分析器、表单处理器、响应分析器。

深层网络爬虫的表单填写有两种类型:

关于作者:赵国生,哈尔滨师范大学教授,工学博士,硕士生导师,黑龙江省网络安全技术领域特殊人才。主要从事可信网络、入侵容忍、认知计算、物联网安全等方向的教学与科研工作。

本文摘编自《Python网络爬虫技术与实战》,经出版方授权发布。

延伸阅读《Python网络爬虫技术与实战》

推荐语:本书是一本系统、全面地介绍Python网络爬虫的实战宝典。作者融合自己丰富的工程实践经验,紧密结合演示应用案例,内容覆盖了几乎所有网络爬虫涉及的核心技术。在内容编排上,一步步地剖析算法背后的概念与原理,提供大量简洁的代码实现,助你从零基础开始编程实现深度学习算法。

相关文章