掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
聚焦網(wǎng)絡(luò)爬蟲(focused crawler)也就是主題網(wǎng)絡(luò)爬蟲。聚焦爬蟲技術(shù)增加了鏈接評(píng)價(jià)和內(nèi)容評(píng)價(jià)模塊,其爬行策略實(shí)現(xiàn)要點(diǎn)就是評(píng)價(jià)頁面內(nèi)容以及鏈接的重要性。

創(chuàng)新互聯(lián)建站專注于雙塔網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供雙塔營銷型網(wǎng)站建設(shè),雙塔網(wǎng)站制作、雙塔網(wǎng)頁設(shè)計(jì)、雙塔網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造雙塔網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供雙塔網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
基于鏈接評(píng)價(jià)的爬行策略,主要是以Web頁面作為半結(jié)構(gòu)化文檔,其中擁有很多結(jié)構(gòu)信息可用于評(píng)價(jià)鏈接重要性。還有一個(gè)是利用Web結(jié)構(gòu)來評(píng)價(jià)鏈接價(jià)值的方法,也就是HITS法,其通過計(jì)算每個(gè)訪問頁面的Authority權(quán)重和Hub權(quán)重來決定鏈接訪問順序。
而基于內(nèi)容評(píng)價(jià)的爬行策略,主要是將與文本相似的計(jì)算法加以應(yīng)用,提出Fish-Search算法,把用戶輸入查詢?cè)~當(dāng)作主題,在算法的進(jìn)一步改進(jìn)下,通過Shark-Search算法就能利用空間向量模型來計(jì)算頁面和主題相關(guān)度大小。
面向主題爬蟲,面向需求爬蟲:會(huì)針對(duì)某種特定的內(nèi)容去爬取信息,而且會(huì)保證信息和需求盡可能相關(guān)。一個(gè)簡(jiǎn)單的聚焦爬蟲使用方法的示例如下所示。
- import urllib.request
- # 爬蟲專用的包urllib,不同版本的Python需要下載不同的爬蟲專用包
- import re
- # 正則用來規(guī)律爬取
- keyname=""
- # 想要爬取的內(nèi)容
- key=urllib.request.quote(keyname)
- # 需要將你輸入的keyname解碼,從而讓計(jì)算機(jī)讀懂
- for i in range(0,5): # (0,5)數(shù)字可以自己設(shè)置,是淘寶某產(chǎn)品的頁數(shù)
- 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后面加上你想爬取的網(wǎng)站名,然后你需要多開幾個(gè)類似的網(wǎng)站以找到其規(guī)則
- # data是你爬取到的網(wǎng)站所有的內(nèi)容要解碼要讀取內(nèi)容
- pat='"pic_url":"http://(.*?)"'
- # pat使用正則表達(dá)式從網(wǎng)頁爬取圖片
- # 將你爬取到的內(nèi)容放在一個(gè)列表里面
- print(picturelist)
- # 可以不打印,也可以打印下來看看
- for j in range(0,len(picturelist)):
- picture=picturelist[j]
- pictureurl="http://"+picture
- # 將列表里的內(nèi)容遍歷出來,并加上http://轉(zhuǎn)到高清圖片
- file="E:/pycharm/vscode文件/圖片/"+str(i)+str(j)+".jpg"
- # 再把圖片逐張編號(hào),不然重復(fù)的名字將會(huì)被覆蓋掉
- urllib.request.urlretrieve(pictureurl,filename=file)
- # 最后保存到文件夾
通用爬蟲技術(shù)(general purpose Web crawler)也就是全網(wǎng)爬蟲。其實(shí)現(xiàn)過程如下。
第五,滿足爬蟲系統(tǒng)設(shè)置的停止條件時(shí),停止爬取。在編寫爬蟲的時(shí)候,一般會(huì)設(shè)置相應(yīng)的停止條件。如果沒有設(shè)置停止條件,爬蟲便會(huì)一直爬取下去,一直到無法獲取新的URL地址為止,若設(shè)置了停止條件,爬蟲則會(huì)在停止條件滿足時(shí)停止爬取。詳情請(qǐng)參見圖2-5中的右下子圖。
通用爬蟲技術(shù)的應(yīng)用有著不同的爬取策略,其中的廣度優(yōu)先策略以及深度優(yōu)先策略都是比較關(guān)鍵的,如深度優(yōu)先策略的實(shí)施是依照深度從低到高的順序來訪問下一級(jí)網(wǎng)頁鏈接。
關(guān)于通用爬蟲使用方法的示例如下。
- '''
- 爬取京東商品信息:
- 請(qǐng)求url:https://www.jd.com/
- 提取商品信息:
- 1.商品詳情頁
- 2.商品名稱
- 3.商品價(jià)格
- 4.評(píng)價(jià)人數(shù)
- 5.商品商家
- '''
- from selenium import webdriver # 引入selenium中的webdriver
- from selenium.webdriver.common.keys import Keys
- import time
- def get_good(driver):
- try:
- # 通過JS控制滾輪滑動(dòng)獲取所有商品信息
- js_code = '''
- window.scrollTo(0,5000);
- '''
- driver.execute_script(js_code) # 執(zhí)行js代碼
- # 等待數(shù)據(jù)加載
- 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:
- # 根據(jù)屬性選擇器查找
- # 商品鏈接
- 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", "--")
- # 商品價(jià)格
- good_price = good.find_element_by_class_name(
- 'p-price').text.replace("\n", ":")
- # 評(píng)價(jià)人數(shù)
- good_commit = good.find_element_by_class_name(
- 'p-commit').text.replace("\n", " ")
- good_content = f'''
- 商品鏈接: {good_url}
- 商品名稱: {good_name}
- 商品價(jià)格: {good_price}
- 評(píng)價(jià)人數(shù): {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)
- # 遞歸調(diào)用函數(shù)
- get_good(driver)
- time.sleep(10)
- finally:
- driver.close()
- if __name__ == '__main__':
- good_name = input('請(qǐng)輸入爬取商品信息:').strip()
- driver = webdriver.Chrome()
- driver.implicitly_wait(10)
- # 往京東主頁發(fā)送請(qǐng)求
- 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)
某些網(wǎng)站會(huì)定時(shí)在原有網(wǎng)頁數(shù)據(jù)的基礎(chǔ)上更新一批數(shù)據(jù)。例如某電影網(wǎng)站會(huì)實(shí)時(shí)更新一批最近熱門的電影,小說網(wǎng)站會(huì)根據(jù)作者創(chuàng)作的進(jìn)度實(shí)時(shí)更新最新的章節(jié)數(shù)據(jù)等。在遇到類似的場(chǎng)景時(shí),我們便可以采用增量式爬蟲。
增量爬蟲技術(shù)(incremental Web crawler)就是通過爬蟲程序監(jiān)測(cè)某網(wǎng)站數(shù)據(jù)更新的情況,以便可以爬取到該網(wǎng)站更新后的新數(shù)據(jù)。
關(guān)于如何進(jìn)行增量式的爬取工作,以下給出三種檢測(cè)重復(fù)數(shù)據(jù)的思路:
不難發(fā)現(xiàn),實(shí)現(xiàn)增量爬取的核心是去重。目前存在兩種去重方法。
關(guān)于增量爬蟲的使用方法示例如下所示。
- 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),
- )
- # 創(chuàng)建Redis鏈接對(duì)象
- 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沒有被爬取過,可以進(jìn)行數(shù)據(jù)的爬取')
- yield scrapy.Request(url=detail_url, callback=self.parst_detail)
- else:
- print('數(shù)據(jù)還沒有更新,暫無新數(shù)據(jù)可爬取!')
- # 解析詳情頁中的電影名稱和類型,進(jìn)行持久化存儲(chǔ)
- 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不進(jìn)去,那么dic變成str(dic)或者改變r(jià)edis版本
- pip install -U redis==2.10.6
- return item
在互聯(lián)網(wǎng)中,網(wǎng)頁按存在方式可以分為表層網(wǎng)頁和深層網(wǎng)頁兩類。
所謂的表層網(wǎng)頁,指的是不需要提交表單,使用靜態(tài)的鏈接就能夠到達(dá)的靜態(tài)頁面;而深層網(wǎng)頁則隱藏在表單后面,不能通過靜態(tài)鏈接直接獲取,是需要提交一定的關(guān)鍵詞后才能夠獲取到的頁面,深層網(wǎng)絡(luò)爬蟲(deep Web crawler)最重要的部分即為表單填寫部分。
在互聯(lián)網(wǎng)中,深層網(wǎng)頁的數(shù)量往往要比表層網(wǎng)頁的數(shù)量多很多,故而,我們需要想辦法爬取深層網(wǎng)頁。
深層網(wǎng)絡(luò)爬蟲的基本構(gòu)成:URL列表、LVS列表(LVS指的是標(biāo)簽/數(shù)值集合,即填充表單的數(shù)據(jù)源)、爬行控制器、解析器、LVS控制器、表單分析器、表單處理器、響應(yīng)分析器。
深層網(wǎng)絡(luò)爬蟲的表單填寫有兩種類型:

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流