人生不得已——Python爬蟲 robots協議

關于robots協議

Robots協議(也稱為爬蟲協議、機器人協議等)的全稱是“網絡爬蟲排除標準”(Robots Exclusion Protocol),網站通過Robots協議告訴搜索引擎哪些頁面可以抓取,哪些頁面不能抓取。

Robots協議是國際互聯網界通行的道德規范,基于以下原則建立:1、搜索技術應服務于人類,同時尊重信息提供者的意愿,并維護其隱私權;2、網站有義務保護其使用者的個人信息和隱私不被侵犯。

Robots協議用來告知搜索引擎哪些頁面能被抓取,哪些頁面不能被抓取;可以屏蔽一些網站中比較大的文件,如:圖片,音樂,視頻等,節省服務器帶寬;可以屏蔽站點的一些死鏈接。方便搜索引擎抓取網站內容;設置網站地圖連接,方便引導蜘蛛爬取頁面。

robots.txt文件應該放置在網站根目錄下。舉例來說,當spider訪問一個網站時,首先會檢查該網站中是否存在robots.txt這個文件,如果 Spider找到這個文件,它就會根據這個文件的內容,來確定它訪問權限的范圍。

如今,在中國國內互聯網行業,正規的大型企業也都將Robots協議當做一項行業標準,國內使用Robots協議最典型的案例,就是淘寶網拒絕百度搜索、京東拒絕一淘搜索。不過,絕大多數中小網站都需要依靠搜索引擎來增加流量,因此通常并不排斥搜索引擎,也很少使用Robots協議。

robots語法

語法 描述
User-agent: * 這里的代表的所有的搜索引擎種類,是一個通配符
Disallow: /admin/ 這里定義是禁止爬尋admin目錄下面的目錄
Disallow: /require/ 這里定義是禁止爬尋require目錄下面的目錄
Disallow: /ABC/ 這里定義是禁止爬尋ABC目錄下面的目錄
Disallow: /cgi-bin/*.htm 禁止訪問/cgi-bin/目錄下的所有以".htm"為后綴的URL(包含子目錄)。
Disallow: /? 禁止訪問網站中所有包含問號 (?) 的網址
Disallow: /.jpg$ 禁止抓取網頁所有的.jpg格式的圖片
Disallow:/ab/adc.html 禁止爬取ab文件夾下面的adc.html文件。
Allow: /cgi-bin/ 這里定義是允許爬尋cgi-bin目錄下面的目錄
Allow: /tmp 這里定義是允許爬尋tmp的整個目錄
Allow: .htm$ 僅允許訪問以".htm"為后綴的URL。
Allow: .gif$ 允許抓取網頁和gif格式圖片Sitemap: 網站地圖 告訴爬蟲這個頁面是網站地圖

解析robot

用法:
1、rp = robotparser.RobotFileParser() 獲取一個解析器對象。
2、rp.set_url("robot file url") 設置robot文件的地址。
3、rp.read() 從網上下載robot文件。
4、rp.can_fetch(user_agent, url) 返回某個user_agent是否有url的訪問權限,若無權限,則不能爬取該url。

import urllib.request
import urllib.parse
import re
import urllib.robotparser


def download(url, headers={}, retryCount=5):
    """
    下載頁面
    :param url: 要下載的鏈接
    :param headers: 偽造頭
    :param retryCount: 如果是服務器錯誤,需要嘗試的次數
    :return:
    """
    # 請求頭對象
    request = urllib.request.Request(url, headers=headers)

    try:
        # 返回數據
        response = urllib.request.urlopen(request)
    except urllib.error.URLError as e:
        # 判斷是否為服務器錯誤
        if hasattr(e, 'code') and 500 <= e.code < 600:
            # 重試幾次
            if retryCount > 0:
                return download(url, headers, retryCount-1)
            # 最終下載失敗
            return None
    return response.read()


def get_link(html):
    """
    得到頁面中的鏈接
    :param html: 頁面數據
    :return: 返回鏈接列表
    """
    webpage_regex = re.compile('<a[^>]+href=["\'](.*?)["\']', re.IGNORECASE)
    return webpage_regex.findall(html)


def link_spider(start_link, link_regex):
    """
    鏈接爬蟲函數
    :param start_link: 開始下載的鏈接
    :param link_regex: 需要的部分鏈接
    :return:
    """
    # 等待下載的鏈接的列表
    wait_download_link = [start_link]
    # 解析鏈接,分析域名
    urlObj = urllib.parse.urlparse(start_link)
    
    
    # 判斷是否滿足robot協議,獲取一個解析器對象
    rp = urllib.robotparser.RobotFileParser()
    # 設置robot文件的地址
    rp.set_url('http://127.0.0.1:8080/robots.txt')
    # 從網上下載robot文件
    rp.read()
    
    
    
    # 定義一個集合,用來過濾掉重復的鏈接
    crawled_link = set()
    while wait_download_link:
        # 從所有等待下載的連接列表中彈出一個鏈接
        url = wait_download_link.pop()
            
            
        # 返回某個user-agent是否有url的訪問權限,若沒有權限,則不能爬取
        if rp.can_fetch('myspider', url):
            # 下載url鏈接的頁面
            html = download(url)
           # 如果沒有頁面數據,則跳出本次循環重新開始
            if html is None:
                continue
            # 將下載過的鏈接放入已經下載過的鏈接集合中
            crawled_link.add(url)
            # 利用正則表達式篩選出頁面所有的鏈接
            all_link = get_link(html.decode('utf-8'))
            # 遍歷鏈接
            for link in all_link:
                # 篩選出自己需要的鏈接
                if re.match(link_regex, link):
                    # 得到完整的有用鏈接
                    realUrl = urlObj.scheme + '://' + urlObj.netloc + link
                    # 判斷鏈接是否已經下載過
                    if realUrl not in crawled_link:
                        wait_download_link.append(realUrl)
        else:
            print('不能爬取該網頁!!')
            continue


link_spider('http://127.0.0.1:8080/places/default/index', '/places/default/view/|/places/default/index/')

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容

  • 網絡爬蟲的君子協議 網絡爬蟲的尺寸 網絡爬蟲引發的問題 性能騷擾 法律風險 隱私泄露 網絡爬蟲的"性能騷擾"web...
    若與閱讀 33,660評論 2 43
  • 要玩大數據,沒有數據怎么玩?這里推薦一些33款開源爬蟲軟件給大家。 爬蟲,即網絡爬蟲,是一種自動獲取網頁內容的程序...
    評評分分閱讀 8,009評論 2 121
  • 海鮮篇 青龍 做刺身超級棒 澳龍 我覺得沒有青龍刺身好吃 和樂蟹 吃了兩回,感覺第一次在第一市場買的膏更多一點兒,...
    女王灬大人閱讀 331評論 0 0
  • 又到一年凍天季,西北風呼呼肆虐。前日溫度突降,凍得來腰椎疼,然后就肚子疼了。 每年都有冬季,今年的冬季開場就不尋常...
    yhbmoren閱讀 230評論 0 0
  • 來自南太平洋和北印度洋的海風吹到了這里 吹的暖軟讓人感覺很舒服 我好懶 躺在床上來來回回睡了一整天 我依稀記得昨天...
    時祎閱讀 210評論 0 0