成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解4種類型的爬蟲技術

開發 前端
網絡爬蟲是一種很好的自動采集數據的通用手段。本文將會對爬蟲的類型進行介紹。

[[388452]]

  •  聚焦網絡爬蟲是“面向特定主題需求”的一種爬蟲程序,而通用網絡爬蟲則是捜索引擎抓取系統(Baidu、Google、Yahoo等)的重要組成部分,主要目的是將互聯網上的網頁下載到本地,形成一個互聯網內容的鏡像備份。
  • 增量抓取意即針對某個站點的數據進行抓取,當網站的新增數據或者該站點的數據發生變化后,自動地抓取它新增的或者變化后的數據。
  • Web頁面按存在方式可以分為表層網頁(surface Web)和深層網頁(deep Web,也稱invisible Web pages或hidden Web)。
  • 表層網頁是指傳統搜索引擎可以索引的頁面,即以超鏈接可以到達的靜態網頁為主來構成的Web頁面。
  • 深層網頁是那些大部分內容不能通過靜態鏈接獲取的、隱藏在搜索表單后的,只有用戶提交一些關鍵詞才能獲得的Web頁面。

01 聚焦爬蟲技術

聚焦網絡爬蟲(focused crawler)也就是主題網絡爬蟲。聚焦爬蟲技術增加了鏈接評價和內容評價模塊,其爬行策略實現要點就是評價頁面內容以及鏈接的重要性。

基于鏈接評價的爬行策略,主要是以Web頁面作為半結構化文檔,其中擁有很多結構信息可用于評價鏈接重要性。還有一個是利用Web結構來評價鏈接價值的方法,也就是HITS法,其通過計算每個訪問頁面的Authority權重和Hub權重來決定鏈接訪問順序。

而基于內容評價的爬行策略,主要是將與文本相似的計算法加以應用,提出Fish-Search算法,把用戶輸入查詢詞當作主題,在算法的進一步改進下,通過Shark-Search算法就能利用空間向量模型來計算頁面和主題相關度大小。

面向主題爬蟲,面向需求爬蟲:會針對某種特定的內容去爬取信息,而且會保證信息和需求盡可能相關。一個簡單的聚焦爬蟲使用方法的示例如下所示。

  • 【例1】一個簡單的爬取圖片的聚焦爬蟲

 

  1. import urllib.request 
  2.     # 爬蟲專用的包urllib,不同版本的Python需要下載不同的爬蟲專用包 
  3. import re 
  4.     # 正則用來規律爬取 
  5. keyname="" 
  6.     # 想要爬取的內容 
  7. key=urllib.request.quote(keyname) 
  8.     # 需要將你輸入的keyname解碼,從而讓計算機讀懂 
  9. for i in range(0,5):   # (0,5)數字可以自己設置,是淘寶某產品的頁數 
  10.     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) 
  11. # url后面加上你想爬取的網站名,然后你需要多開幾個類似的網站以找到其規則 
  12. # data是你爬取到的網站所有的內容要解碼要讀取內容 
  13.     pat='"pic_url":"//(.*?)"' 
  14. # pat使用正則表達式從網頁爬取圖片 
  15. # 將你爬取到的內容放在一個列表里面 
  16.     print(picturelist) 
  17.     # 可以不打印,也可以打印下來看看 
  18.     for j in range(0,len(picturelist)): 
  19.         picture=picturelist[j] 
  20.         pictureurl="http://"+picture 
  21.         # 將列表里的內容遍歷出來,并加上http://轉到高清圖片 
  22.         file="E:/pycharm/vscode文件/圖片/"+str(i)+str(j)+".jpg" 
  23.         # 再把圖片逐張編號,不然重復的名字將會被覆蓋掉 
  24.         urllib.request.urlretrieve(pictureurl,filename=file) 
  25.         # 最后保存到文件夾 

 

02 通用爬蟲技術

通用爬蟲技術(general purpose Web crawler)也就是全網爬蟲。其實現過程如下。

  • 第一,獲取初始URL。初始URL地址可以由用戶人為指定,也可以由用戶指定的某個或某幾個初始爬取網頁決定。
  • 第二,根據初始的URL爬取頁面并獲得新的URL。獲得初始的URL地址之后,需要先爬取對應URL地址中的網頁,接著將網頁存儲到原始數據庫中,并且在爬取網頁的同時,發現新的URL地址,并且將已爬取的URL地址存放到一個URL列表中,用于去重及判斷爬取的進程。
  • 第三,將新的URL放到URL隊列中,在于第二步內獲取下一個新的URL地址之后,會將新的URL地址放到URL隊列中。
  • 第四,從URL隊列中讀取新的URL,并依據新的URL爬取網頁,同時從新的網頁中獲取新的URL并重復上述的爬取過程。

第五,滿足爬蟲系統設置的停止條件時,停止爬取。在編寫爬蟲的時候,一般會設置相應的停止條件。如果沒有設置停止條件,爬蟲便會一直爬取下去,一直到無法獲取新的URL地址為止,若設置了停止條件,爬蟲則會在停止條件滿足時停止爬取。詳情請參見圖2-5中的右下子圖。

通用爬蟲技術的應用有著不同的爬取策略,其中的廣度優先策略以及深度優先策略都是比較關鍵的,如深度優先策略的實施是依照深度從低到高的順序來訪問下一級網頁鏈接。

關于通用爬蟲使用方法的示例如下。

  • 【例2】爬取京東商品信息

 

  1. ''
  2. 爬取京東商品信息: 
  3.     請求url:https://www.jd.com/ 
  4.     提取商品信息: 
  5.         1.商品詳情頁 
  6.         2.商品名稱 
  7.         3.商品價格 
  8.         4.評價人數 
  9.         5.商品商家 
  10. ''
  11. from selenium import webdriver    # 引入selenium中的webdriver 
  12. from selenium.webdriver.common.keys import Keys 
  13. import time 
  14.  
  15. def get_good(driver): 
  16.     try: 
  17.  
  18.         # 通過JS控制滾輪滑動獲取所有商品信息 
  19.         js_code = ''
  20.             window.scrollTo(0,5000); 
  21.         ''
  22.         driver.execute_script(js_code)  # 執行js代碼 
  23.  
  24.         # 等待數據加載 
  25.         time.sleep(2) 
  26.  
  27.         # 查找所有商品div 
  28.         # good_div = driver.find_element_by_id('J_goodsList'
  29.         good_list = driver.find_elements_by_class_name('gl-item'
  30.         n = 1 
  31.         for good in good_list: 
  32.             # 根據屬性選擇器查找 
  33.             # 商品鏈接 
  34.             good_url = good.find_element_by_css_selector( 
  35.                 '.p-img a').get_attribute('href'
  36.  
  37.             # 商品名稱 
  38.             good_name = good.find_element_by_css_selector( 
  39.                 '.p-name em').text.replace("\n""--"
  40.  
  41.             # 商品價格 
  42.             good_price = good.find_element_by_class_name( 
  43.                 'p-price').text.replace("\n"":"
  44.  
  45.             # 評價人數 
  46.             good_commit = good.find_element_by_class_name( 
  47.                 'p-commit').text.replace("\n"" "
  48.  
  49.             good_content = f''
  50.                         商品鏈接: {good_url} 
  51.                         商品名稱: {good_name} 
  52.                         商品價格: {good_price} 
  53.                         評價人數: {good_commit} 
  54.                         \n 
  55.                         ''
  56.             print(good_content) 
  57.             with open('jd.txt''a', encoding='utf-8'as f: 
  58.                 f.write(good_content) 
  59.  
  60.         next_tag = driver.find_element_by_class_name('pn-next'
  61.         next_tag.click() 
  62.  
  63.         time.sleep(2) 
  64.  
  65.         # 遞歸調用函數 
  66.         get_good(driver) 
  67.  
  68.         time.sleep(10) 
  69.  
  70.     finally: 
  71.         driver.close() 
  72.  
  73.  
  74. if __name__ == '__main__'
  75.  
  76.     good_name = input('請輸入爬取商品信息:').strip() 
  77.  
  78.     driver = webdriver.Chrome() 
  79.     driver.implicitly_wait(10) 
  80.     # 往京東主頁發送請求 
  81.     driver.get('https://www.jd.com/'
  82.  
  83.     # 輸入商品名稱,并回車搜索 
  84.     input_tag = driver.find_element_by_id('key'
  85.     input_tag.send_keys(good_name) 
  86.     input_tag.send_keys(Keys.ENTER) 
  87.     time.sleep(2) 
  88.  
  89.     get_good(driver) 

 

03 增量爬蟲技術

某些網站會定時在原有網頁數據的基礎上更新一批數據。例如某電影網站會實時更新一批最近熱門的電影,小說網站會根據作者創作的進度實時更新最新的章節數據等。在遇到類似的場景時,我們便可以采用增量式爬蟲。

增量爬蟲技術(incremental Web crawler)就是通過爬蟲程序監測某網站數據更新的情況,以便可以爬取到該網站更新后的新數據。

關于如何進行增量式的爬取工作,以下給出三種檢測重復數據的思路:

  1. 在發送請求之前判斷這個URL是否曾爬取過;
  2. 在解析內容后判斷這部分內容是否曾爬取過;
  3. 寫入存儲介質時判斷內容是否已存在于介質中。
  • 第一種思路適合不斷有新頁面出現的網站,比如小說的新章節、每天的實時新聞等;
  • 第二種思路則適合頁面內容會定時更新的網站;
  • 第三種思路則相當于最后一道防線。這樣做可以最大限度地達到去重的目的。

不難發現,實現增量爬取的核心是去重。目前存在兩種去重方法。

  • 第一,對爬取過程中產生的URL進行存儲,存儲在Redis的set中。當下次進行數據爬取時,首先在存儲URL的set中對即將發起的請求所對應的URL進行判斷,如果存在則不進行請求,否則才進行請求。
  • 第二,對爬取到的網頁內容進行唯一標識的制定(數據指紋),然后將該唯一標識存儲至Redis的set中。當下次爬取到網頁數據的時候,在進行持久化存儲之前,可以先判斷該數據的唯一標識在Redis的set中是否存在,從而決定是否進行持久化存儲。

關于增量爬蟲的使用方法示例如下所示。

  • 【例3】爬取4567tv網站中所有的電影詳情數據

 

  1. import scrapy 
  2. from scrapy.linkextractors import LinkExtractor 
  3. from scrapy.spiders import CrawlSpider, Rule 
  4. from redis import Redis 
  5. from incrementPro.items import IncrementproItem 
  6. class MovieSpider(CrawlSpider): 
  7.     name = 'movie' 
  8.     # allowed_domains = ['www.xxx.com'
  9.     start_urls = ['http://www.4567tv.tv/frim/index7-11.html'
  10.     rules = ( 
  11.         Rule(LinkExtractor(allow=r'/frim/index7-\d+\.html'), callback='parse_item', follow=True), 
  12.     ) 
  13.     # 創建Redis鏈接對象 
  14.     conn = Redis(host='127.0.0.1', port=6379) 
  15.     def parse_item(self, response): 
  16.         li_list = response.xpath('//li[@class="p1 m1"]'
  17.         for li in li_list: 
  18.             # 獲取詳情頁的url 
  19.             detail_url = 'http://www.4567tv.tv' + li.xpath('./a/@href').extract_first() 
  20.             # 將詳情頁的url存入Redis的set中 
  21.             ex = self.conn.sadd('urls', detail_url) 
  22.             if ex == 1: 
  23.                 print('該url沒有被爬取過,可以進行數據的爬取'
  24.                 yield scrapy.Request(url=detail_url, callback=self.parst_detail) 
  25.             else
  26.                 print('數據還沒有更新,暫無新數據可爬?。?
  27.  
  28.     # 解析詳情頁中的電影名稱和類型,進行持久化存儲 
  29.     def parst_detail(self, response): 
  30.         item = IncrementproItem() 
  31.         item['name'] = response.xpath('//dt[@class="name"]/text()').extract_first() 
  32.         item['kind'] = response.xpath('//div[@class="ct-c"]/dl/dt[4]//text()').extract() 
  33.         item['kind'] = ''.join(item['kind']) 
  34.         yield it 

 

管道文件:

 

  1. from redis import Redis 
  2. class IncrementproPipeline(object): 
  3.     conn = None 
  4.     def open_spider(self,spider): 
  5.         self.conn = Redis(host='127.0.0.1',port=6379) 
  6.     def process_item(self, item, spider): 
  7.         dic = { 
  8.             'name':item['name'], 
  9.             'kind':item['kind'
  10.             } 
  11.         print(dic) 
  12.         self.conn.push('movieData',dic)     
  13.         # 如果push不進去,那么dic變成str(dic)或者改變redis版本    
  14.         pip install -U redis==2.10.6 
  15.         return item 

 

04 深層網絡爬蟲技術

在互聯網中,網頁按存在方式可以分為表層網頁和深層網頁兩類。

所謂的表層網頁,指的是不需要提交表單,使用靜態的鏈接就能夠到達的靜態頁面;而深層網頁則隱藏在表單后面,不能通過靜態鏈接直接獲取,是需要提交一定的關鍵詞后才能夠獲取到的頁面,深層網絡爬蟲(deep Web crawler)最重要的部分即為表單填寫部分。

在互聯網中,深層網頁的數量往往要比表層網頁的數量多很多,故而,我們需要想辦法爬取深層網頁。

深層網絡爬蟲的基本構成:URL列表、LVS列表(LVS指的是標簽/數值集合,即填充表單的數據源)、爬行控制器、解析器、LVS控制器、表單分析器、表單處理器、響應分析器。

深層網絡爬蟲的表單填寫有兩種類型:

  • 基于領域知識的表單填寫(建立一個填寫表單的關鍵詞庫,在需要的時候,根據語義分析選擇對應的關鍵詞進行填寫);
  • 基于網頁結構分析的表單填寫(一般在領域知識有限的情況下使用,這種方式會根據網頁結構進行分析,并自動地進行表單填寫)。

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2009-07-08 18:20:21

JDBC驅動

2024-05-21 14:04:16

2021-06-07 14:05:53

物聯網IOT物聯網技術

2009-11-13 09:39:48

2012-01-10 14:43:48

程序員

2011-04-15 10:03:57

2020-10-12 13:37:19

安全黑客技術

2009-06-15 14:15:07

Java設計模式Java

2021-07-08 09:17:07

物聯網人工智能IoT

2019-09-16 13:51:34

物聯網平臺物聯網IOT

2010-04-23 14:55:31

Oracle字符

2022-06-27 11:09:06

邊緣計算

2013-06-28 10:17:04

2011-05-19 15:57:15

測試專家

2013-07-23 09:59:57

用戶體驗產品體驗產品

2018-12-13 20:14:18

物聯網平臺物聯網IOT

2022-04-26 05:55:52

網絡網絡類型

2009-06-29 18:21:29

Hibernate

2010-05-11 14:08:50

MySQL數字類型

2017-08-01 23:44:25

數據分析數據科學數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久精品一区二区视频 | 精品视频一区二区三区在线观看 | 日本粉嫩一区二区三区视频 | 97精品超碰一区二区三区 | 亚洲国产精品成人久久久 | 国产精品一区二区久久久久 | 香蕉视频久久久 | 在线一区二区三区 | 在线婷婷 | 日本精品一区二区 | 国产国产精品久久久久 | 亚洲人成人网 | 人和拘一级毛片c | 一级毛片在线播放 | 亚洲一区二区综合 | 日韩成人av在线 | 国产三区精品 | 亚洲精品久久久久久一区二区 | 在线视频 亚洲 | 草草视频在线观看 | 日韩一区二区三区精品 | 亚洲码欧美码一区二区三区 | 99久久免费精品视频 | 久久久久久毛片免费观看 | 黄色免费在线观看网站 | 在线观看成人 | 电影在线 | 色爱区综合 | 日本精a在线观看 | 日韩欧美在线视频观看 | 在线播放中文字幕 | 在线免费观看黄网 | 中文字幕亚洲精品 | 九九综合 | 龙珠z国语版在线观看 | 欧美日韩精品中文字幕 | 久久亚洲综合 | 九九九久久国产免费 | xxxxx免费视频 | 免费激情网站 | 99国产精品视频免费观看一公开 |