当前位置: 首页 > 科技观察

4种爬虫技术详解

时间:2023-03-12 04:20:36 科技观察

着重介绍网络爬虫是一种“面向特定主题需求”的爬虫程序,而通用网络爬虫是搜索引擎爬虫系统(百度、谷歌、雅虎等)的重要组成部分.),主要用途是将互联网上的网页下载到本地,形成互联网内容的镜像备份。增量爬取就是爬取某个站点的数据。当网站有新的数据或网站的数据发生变化时,会自动抓取新的或变化的数据。网页按存在方式可分为表层网页(surfaceWeb)和深层网页(deepWeb,也称隐形网页或隐藏网页)。表层网页是指能够被传统搜索引擎收录的页面,即以超链接可达的静态网页为主的网页。深层网页是指大部分内容无法通过静态链接获取,隐藏在搜索表单后面,只能通过用户提交一些关键字才能获取的网页。01聚焦爬虫技术聚焦爬虫(focusedcrawler)也是一种主题爬虫。专注爬虫技术增加了链接评估和内容评估模块,其爬虫策略的重点是评估页面内容和链接的重要性。基于链接评估的爬虫策略主要将网页作为半结构化文档,其中包含大量的结构信息,可以用来评估链接的重要性。另一种方法是利用Web结构来评估链接的价值,即HITS法,通过计算每个被访问页面的Authority权重和Hub权重来确定链接访问的顺序。基于内容评价的爬虫策略主要是应用类似于文本的计算方法,提出Fish-Search算法,以用户输入的查询词为主题。随着算法的进一步改进,Shark-Search算法可以使用空间向量模型来计算页面和主题的相关性大小。面向主题的爬虫、面向需求的爬虫:它会针对特定的内容爬取信息,并会尽可能保证信息和需求的相关性。下面显示了一个如何使用聚焦爬虫的简单示例。[示例1]一个简单的抓取图片的专注爬虫importurllib.request#爬虫专用包urllib,不同版本的Python需要下载不同的爬虫专用包importre#regularly用于定时抓取keyname=""#想要抓取的fetchedcontentkey=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使用正则表达式从网页中爬取图片#把你爬取的内容放在我nalistprint(picturelist)#可以不打印,也可以打印出来看看jinrange(0,len(picturelist)):picture=picturelist[j]pictureurl="http://"+picture#traverse列表中的内容,添加http://去高清图片文件="E:/pycharm/vscodefile/picture/"+str(i)+str(j)+".jpg"#然后将图片一一编号,否则重复的名字会被urllib.request覆盖。urlretrieve(pictureurl,filename=file)#最后保存到文件夹02Generalpurposecrawlertechnology(通用网络爬虫),即整个网络爬虫的实现过程如下。首先,获取初始URL。初始URL地址可以由用户手动指定,也可以由用户指定的一个或多个初始爬取的网页确定。第二,根据原始URL抓取页面,获取新的URL。获取到初始URL地址后,需要先爬取对应URL地址中的网页,然后将网页存入原数据库,在抓取网页的同时发现新的URL地址,将抓取到的URL地址存储到一个URL中list,用于去重判断爬取过程。第三,将新的URL放入URL队列。在第二步获取到下一个新的URL地址后,会将新的URL地址放入URL队列中。第四,从URL队列中读取新的URL,根据新的URL爬取网页,同时从新的网页中获取新的URL,重复上面的爬取过程。第五,当满足爬虫系统设置的停止条件时,停止爬虫。在写爬虫的时候,一般都会设置相应的停止条件。如果不设置停止条件,爬虫会继续爬取,直到获取不到新的URL地址。如果设置了停止条件,爬虫会在满足停止条件时停止爬行。详见图2-5右下子图。通用爬虫技术的应用有不同的爬取策略,其中广度优先策略和深度优先策略更为关键。例如,深度优先策略的实现是按照深度从低到高的顺序访问下一级网页链接。下面是一个如何使用普通爬虫的例子。[示例2]抓取京东商品信息'''抓取京东商品信息:请求url:https://www.jd.com/提取商品信息:1.商品详情页2.商品名称3.商品价格4.数量5.商品商家'''fromseleniumimportwebdriver#引入selenium中的webdriverfromselenium.webdriver.common.keysimportKeysimporttimedefget_good(driver):try:#通过JS控制滚轮获取所有商品信息js_code='''window.scrollTo(0,5000);'''driver.execute_script(js_code)#执行js代码#等待数据加载time.sleep(2)#findallproductsdiv#good_div=driver.find_element_by_id('J_goodsList')good_list=driver.find_elements_by_class_name('gl-item')n=1forgoodinggood_list:#根据属性selector查找#商品链接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()时间.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=司机。find_element_by_id('key')input_tag.send_keys(good_name)input_tag.send_keys(Keys.ENTER)time.sleep(2)get_good(driver)03增量爬虫技术有些网站会根据原始网页数据定期更新一批例如,一个电影网站会实时更新一批近期的热门电影,一个小说网站会根据作者的创作进度实时更新最新的章节数据。遇到类似的场景,我们可以使用增量爬虫。增量爬虫技术(incrementalWebcrawler)是通过爬虫程序监测某个网站的数据更新情况,从而爬取网站更新后的新数据。关于如何进行增量爬取工作,下面给出了三种检测重复数据的思路:解析内容后判断这部分内容是否已经被爬取;write加载存储介质时,判断介质中是否已经存在内容。第一种思路适用于不断出现新页面的网站,如小说新章节、每日实时新闻等;第二种思路适用于页面内容定期更新的网站;第三种思路相当于最后一道防线。这样做可以最大程度的达到去重的目的。不难发现,增量爬取的核心是去重。目前有两种去重方法。首先将爬取过程中产生的URL存储到Redis的集合中。下次爬取数据时,先在存放URL的集合中判断要发起的请求对应的URL,存在则不发起请求,否则发起请求。第二,为爬取的网页内容制定唯一标识(数据指纹),然后将唯一标识存储在Redis的集合中。下次爬取网页数据时,在进行持久化存储之前,可以先判断该数据的唯一标识是否存在于Redis的集合中,从而决定是否进行持久化存储。下面显示了如何使用增量爬虫的示例。【示例3】抓取4567tv网站所有电影详情数据/www.4567tv.tv/frim/index7-11.html']rules=(规则(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[@class="p1m1"]')forliinli_list:#获取详情页的urldetail_url='http://www.4567tv.tv'+li.xpath('./a/@href').extract_first()#将详情页的url存入setofRedisinex=self.conn.sadd('urls',detail_url)ifex==1:print('这个url没有被爬取,可以爬取数据')yieldscrapy.Request(url=detail_url,callback=self.parst_detail)else:print('数据还没有更新,没有新的datatocrawl!')#在详情页解析电影名称和类型进行持久化存储defparst_detail(self,response):item=IncrementproItem()item['name']=response.xpath('//dt[@class="姓名&曲ot;]/text()').extract_first()item['kind']=response.xpath('//div[@class="ct-c"]/dl/dt[4]//text()').extract()item['kind']=''.join(item['kind'])yieldit管道文件:fromredisimportRedisclassIncrementproPipeline(object):conn=Nonedefopen_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.6returnitem04深网爬虫技术在网上,和网页按其存在的方式可以被访问分为表层网页和深层网页两种。所谓表层网页,是指无需提交表单,使用静态链接即可到达的静态页面;而深层网页隐藏在表单后面,无法通过静态链接直接获取。提交某些关键字后才能获取的页面,深网爬虫(deepwebcrawler)最重要的部分就是表单填写部分。在互联网中,深层网页的数量往往远大于表层网页的数量。因此,我们需要想办法爬取深层网页。深网爬虫的基本组成:URL列表、LVS列表(LVS是指标签/值集合,即填写表单的数据源)、爬取控制器、解析器、LVS控制器、表单分析器、表单处理器、响应分析仪。深网爬虫的填表方式有两种:基于领域知识的填表(构建填表的关键词库,需要时根据语义分析选择相应的关键词填写);formbasedonwebpagestructureanalysisFilling(一般在领域知识有限的情况下使用,这种方法会分析网页的结构并自动填写表格)。