python爬虫教程:详解4种类型的爬虫技术_第1页
python爬虫教程:详解4种类型的爬虫技术_第2页
python爬虫教程:详解4种类型的爬虫技术_第3页
python爬虫教程:详解4种类型的爬虫技术_第4页
python爬虫教程:详解4种类型的爬虫技术_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

python爬⾍教程:详解4种类型的爬⾍技术聚焦⽹络爬⾍是“⾯向特定主题需求”的⼀种爬⾍程序,⽽通⽤⽹络爬⾍则是捜索引擎抓取系统(Baidu、Google、Yahoo等)的重要组成部分,主要⽬的是将互联⽹上的⽹页下载到本地,形成⼀个互联⽹内容的镜像备份。增量抓取意即针对某个站点的数据进⾏抓取,当⽹站的新增数据或者该站点的数据发⽣变化后,⾃动地抓取它新增的或者变化后的数据。Web页⾯按存在⽅式可以分为表层⽹页(surfaceWeb)和深层⽹页(deepWeb,也称invisibleWebpages或hiddenWeb)。表层⽹页是指传统搜索引擎可以索引的页⾯,即以超链接可以到达的静态⽹页为主来构成的Web页⾯。深层⽹页是那些⼤部分内容不能通过静态链接取获的、隐藏在搜索表单后的,只有⽤户提交⼀些关键词才能获得的Web页⾯。01聚焦爬⾍技术聚焦⽹络爬⾍(focusedcrawler)也就是主题⽹络爬⾍。聚焦爬⾍技术增加了链接评价和内容评价模块,其爬⾏策略实现要点就是评价页⾯内容以及链接的重要性。基于链接评价的爬⾏策略,主要是以Web页⾯作为半结构化⽂档,其中拥有很多结构信息可⽤于评价链接重要性。还有⼀个是利⽤Web结构来评价链接价值的⽅法,也就是HITS法,其通过计算每个访问页⾯的Authority权重和Hub权重来决定链接访问顺序。⽽基于内容评价的爬⾏策略,主要是将与⽂本相似的计算法加以应⽤,提出Fish-Search算法,把⽤户输⼊查询词当作主题,在算法的进⼀步改进下,通过Shark-Search算法就能利⽤空间向量模型来计算页⾯和主题相关度⼤⼩。⾯向主题爬⾍,⾯向需求爬⾍:会针对某种特定的内容去爬取信息,⽽且会保证信息和需求尽可能相关。⼀个简单的聚焦爬⾍使⽤⽅法的⽰例如下所⽰。【例1】⼀个简单的爬取图⽚的聚焦爬⾍importurllib.request#爬⾍专⽤的包urllib,不同版本的Python需要下载不同的爬⾍专⽤包importre#正则⽤来规律爬取keyname=""#想要爬取的内容key=urllib.request.quote(keyname)#需要将你输⼊的keyname解码,从⽽让计算机读懂foriinrange(0,5):#(0,5)数字可以⾃⼰设置,是淘宝某产品的页数url="/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通⽤爬⾍技术通⽤爬⾍技术(generalpurposeWebcrawler)也就是全⽹爬⾍。其实现过程如下。第⼀,获取初始URL。初始URL地址可以由⽤户⼈为指定,也可以由⽤户指定的某个或某⼏个初始爬取⽹页决定。第⼆,根据初始的URL爬取页⾯并获得新的URL。获得初始的URL地址之后,需要先爬取对应URL地址中的⽹页,接着将⽹页存储到原始数据库中,并且在爬取⽹页的同时,发现新的URL地址,并且将已爬取的URL地址存放到⼀个URL列表中,⽤于去重及判断爬取的进程。第三,将新的URL放到URL队列中,在于第⼆步内获取下⼀个新的URL地址之后,会将新的URL地址放到URL队列中。第四,从URL队列中读取新的URL,并依据新的URL爬取⽹页,同时从新的⽹页中获取新的URL并重复上述的爬取过程。第五,满⾜爬⾍系统设置的停⽌条件时,停⽌爬取。在编写爬⾍的时候,⼀般会设置相应的停⽌条件。如果没有设置停⽌条件,爬⾍便会⼀直爬取下去,⼀直到⽆法获取新的URL地址为⽌,若设置了停⽌条件,爬⾍则会在停⽌条件满⾜时停⽌爬取。详情请参见图2-5中的右下⼦图。通⽤爬⾍技术的应⽤有着不同的爬取策略,其中的度优先策略以及深度优先策略都是⽐较关键的,如深度优先策略的实施是依照深度从低到⾼的顺序来访问下⼀级⽹页链接。关于通⽤爬⾍使⽤⽅法的⽰例如下。【例2】爬取京东商品信息'''爬取京东商品信息:请求url:/提取商品信息:1.商品详情页2.商品名称3.商品价格4.评价⼈数5.商品商家'''fromseleniumimportwebdriver#引⼊selenium中的webdriverfrommon.keysimportKeysimporttimedefget_good(driver):try:#通过JS控制滚轮滑动获取所有商品信息js_code='''window.scrollTo(0,5000);'''driver.execute_script(js_code)#执⾏js代码#等待数据加载time.sleep(2)#查找所有商品div#good_div=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('/')#输⼊商品名称,并回车搜索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增量爬⾍技术某些⽹站会定时在原有⽹页数据的基础上更新⼀批数据。例如某电影⽹站会实时更新⼀批最近热门的电影,⼩说⽹站会根据作者创作的进度实时更新最新的章节数据等。在遇到类似的场景时,我们便可以采⽤增量式爬⾍。增量爬⾍技术(incrementalWebcrawler)就是通过爬⾍程序监测某⽹站数据更新的情况,以便可以爬取到该⽹站更新后的新数据。关于如何进⾏增量式的爬取⼯作,以下给出三种检测重复数据的思路:1.在发送请求之前判断这个URL是否曾爬取过;2.在解析内容后判断这部分内容是否曾爬取过;3.写⼊存储介质时判断内容是否已存在于介质中。第⼀种思路适合不断有新页⾯出现的⽹站,⽐如⼩说的新章节、每天的实时新闻等;第⼆种思路则适合页⾯内容会定时更新的⽹站;第三种思路则相当于最后⼀道防线。这样做可以最⼤限度地达到去重的⽬的。不难发现,实现增量爬取的核⼼是去重。⽬前存在两种去重⽅法。第⼀,对爬取过程中产⽣的URL进⾏存储,存储在Redis的set中。当下次进⾏数据爬取时,⾸先在存储URL的set中对即将发起的请求所对应的URL进⾏判断,如果存在则不进⾏请求,否则才进⾏请求。第⼆,对爬取到的⽹页内容进⾏唯⼀标识的制定(数据指纹),然后将该唯⼀标识存储⾄Redis的set中。当下次爬取到⽹页数据的时候,在进⾏持久化存储之前,可以先判断该数据的唯⼀标识在Redis的set中是否存在,从⽽决定是否进⾏持久化存储。关于增量爬⾍的使⽤⽅法⽰例如下所⽰。【例3】爬取4567tv⽹站中所有的电影详情数据'''遇到问题没⼈解答?⼩编创建了⼀个Python学习交流QQ群:531509025寻找有志同道合的⼩伙伴,互帮互助,群⾥还有不错的视频学习教程和PDF电⼦书!'''importscrapyfromscrapy.linkextractorsimportLinkExtractorfromscrapy.spidersimportCrawlSpider,RulefromredisimportRedisfromincrementPro.itemsimportIncrementproItemclassMovieSpider(CrawlSpider):name='movie'#allowed_domains=['']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='',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存⼊Redisset的中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[@class="name"]/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='',port=6379)defpr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论