詳解 4 種類型的爬蟲技術

導讀:

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

作者:趙國生 王健

01 聚焦爬蟲技術

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

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

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

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

import urllib.request
    # 爬蟲專用的包urllib,不同版本的Python需要下載不同的爬蟲專用包
import re
    # 正則用來規律爬取
key
    # 想要爬取的內容
key=urllib.request.quote(keyname)
    # 需要將你輸入的keyname解碼,從而讓計算機讀懂
for i in range(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)
    # 可以不打印,也可以打印下來看看
    for j in range(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.商品商家
'''
from selenium import webdriver    # 引入selenium中的webdriver
from selenium.webdriver.common.keys import Keys
import time

def get_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 = 1
        for good in good_list:
            # 根據屬性選擇器查找
            # 商品鏈接
            good_url = good.find_element_by_css_selector(
                '.p-img a').get_attribute('href')

            # 商品名稱
            good_name = good.find_element_by_css_selector(
                '.p-name em').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)
            with open('jd.txt', 'a', encoding='utf-8') as f:
                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. 寫入存儲介質時判斷內容是否已存在於介質中。

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

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

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redis import Redis
from incrementPro.items import IncrementproItem
class MovieSpider(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)
    def parse_item(self, response):
        li_list = response.xpath('//li[@class="p1 m1"]')
        for li in li_list:
            # 獲取詳情頁的url
            detail_url = 'http://www.4567tv.tv' + li.xpath('./a/@href').extract_first()
            # 將詳情頁的url存入Redis的set中
            ex = self.conn.sadd('urls', detail_url)
            if ex == 1:
                print('該url沒有被爬取過,可以進行數據的爬取')
                yield scrapy.Request(url=detail_url, callback=self.parst_detail)
            else:
                print('數據還沒有更新,暫無新數據可爬取!')

    # 解析詳情頁中的電影名稱和類型,進行持久化存儲
    def parst_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'])
        yield it

管道文件:

from redis import Redis
class IncrementproPipeline(object):
    conn = None
    def open_spider(self,spider):
        self.conn = Redis(host='127.0.0.1',port=6379)
    def process_item(self, item, spider):
        dic = {
            'name':item['name'],
            'kind':item['kind']
            }
        print(dic)
        self.conn.push('movieData',dic)    
        # 如果push不進去,那麼dic變成str(dic)或者改變redis版本   
        pip install -U redis==2.10.6
        return item

04 深層網絡爬蟲技術

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

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

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

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

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

關於作者: 趙國生,哈爾濱師範大學教授,工學博士,碩士生導師,黑龍江省網絡安全技術領域特殊人才。主要從事可信網絡、入侵容忍、認知計算、物聯網安全等方向的教學與科研工作。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/J8NYr1l64_kuUagLIGqUag