Python學(xué)習(xí)九十天:突破反爬蟲策略

1.什么是爬蟲和反爬蟲

  • 爬蟲是使用任何技術(shù)手段批量獲取網(wǎng)站信息的一種方式翻擒,反爬蟲是使用任何技術(shù)手段阻止別人批量獲取自己網(wǎng)站信息的一種方式氓涣;

2.User-Agent介紹

  • User Agent中文名為用戶代理,是Http協(xié)議中的一部分陋气,屬于頭域的組成部分劳吠,User Agent也簡稱UA。它是一個特殊字符串頭巩趁,是一種向訪問網(wǎng)站提供你所使用的瀏覽器類型及版本痒玩、操作系統(tǒng)及版本、瀏覽器內(nèi)核议慰、等信息的標(biāo)識蠢古;

  • User-Agentheaders中的一個屬性,表示當(dāng)前訪問服務(wù)器的身份信息别凹,如果同一個身份過于頻繁的訪問服務(wù)器會被識別為機(jī)器身份草讶,遭到反爬的打擊,所以需要頻繁的更改User-Agent信息炉菲;

  • User-Agent字段解析:瀏覽器標(biāo)識 (操作系統(tǒng)標(biāo)識; 加密等級標(biāo)識; 瀏覽器語言) 渲染引擎標(biāo)識 版本信息堕战;

3.使用不同的User-Agent來規(guī)避反爬策略

  • 想要隨機(jī)更改User-Agent,首先我們可以在蜘蛛文件的Spider類中添加一個header請求頭拍霜,很多網(wǎng)站只需要userAgent信息就可以通過嘱丢,但是有的網(wǎng)站還需要驗(yàn)證一些其他的信息,所以我們可以在請求頭中添加一些需要用到的字段沉御,比如:

  • Accept:客戶端支持的數(shù)據(jù)類型屿讽,用逗號隔開,是有順序的吠裆,分號前面是主類型伐谈,分號后是子類型;

  • Accept-Encoding:指定瀏覽器可以支持的web服務(wù)器返回內(nèi)容壓縮編碼類型试疙;

  • Accept-Language:瀏覽器可接受的自然語言的類型诵棵;

  • Connection:設(shè)置HTTP連接的持久化,通常都是Keep-Alive祝旷;

  • host:服務(wù)器的域名或IP地址履澳,如果不是通用端口,還包含該端口號怀跛;

  • Referer:指當(dāng)前請求的URL是在什么地址引用的距贷;

headers = {
        'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Accept-Encoding':  'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection':  'keep-alive',
        'host': 'dribbble.com/stories',
        'Referer': 'https://dribbble.com/',
    }
  • 添加完請求頭需要的字段,我們可以在settings.py 文件中手動創(chuàng)建一個User-Agent列表
user_agent_list = [
    "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16",
    "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
    "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",
    "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
    "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
    "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",
    "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00",
    "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00",
    "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0",
    "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62",
    "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52",
    "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51",
    "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50",
    "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50",
    "Opera/9.80 (X11; Linux i686; U; ru) Presto/2.8.131 Version/11.11",
    "Opera/9.80 (X11; Linux i686; U; es-ES) Presto/2.8.131 Version/11.11",
    "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/5.0 Opera 11.11",
    "Opera/9.80 (X11; Linux x86_64; U; bg) Presto/2.8.131 Version/11.10",
    "Opera/9.80 (Windows NT 6.0; U; en) Presto/2.8.99 Version/11.10",
    "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10",
    "Opera/9.80 (Windows NT 6.1; Opera Tablet/15165; U; en) Presto/2.8.149 Version/11.1",
    "Opera/9.80 (X11; Linux x86_64; U; Ubuntu/10.10 (maverick); pl) Presto/2.7.62 Version/11.01",
]
  • 然后在項(xiàng)目中創(chuàng)建一個utils.py文件吻谋,在這個文件中自定義一個隨機(jī)函數(shù)
import random
def get_randam_int(lst):
    return random.randint(0, len(lst)-1)
  • 最后修改蜘蛛文件中的parse()方法忠蝗,導(dǎo)入相關(guān)模塊,調(diào)用自定義的隨機(jī)函數(shù)生成隨機(jī)User-gent添加到headers請求頭中漓拾;
    def parse(self, response):
        headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Accept-Encoding': 'gzip, deflate',
            'Accept-Language': 'zh-CN,zh;q=0.9',
            'Connection': 'keep-alive',
            'host': 'dribbble.com',
            'Referer': 'https://dribbble.com/',
        }
        random_index = get_randam_int(user_agent_list)
        random_agent = user_agent_list[random_index]
        headers['User-Agent'] = random_agent
        a_nodes = response.css('header div.teaser a')
        for a_node in a_nodes:
            # print(a_node)
            a_url = a_node.css('::attr(href)').extract()[0]
            a_image_url = a_node.css('img::attr(src)').extract()[0]
            yield Request(headers=headers,url=parse.urljoin(response.url, a_url), callback=self.parse_analyse, meta={'a_image_url': a_image_url})

4.也可以在中間件中設(shè)置User Agent

5.調(diào)試工具

  • 打開你需要爬蟲的網(wǎng)頁阁最;

  • 按鍵盤的F12或手動去瀏覽器右上角的“更多工具”選項(xiàng)選擇開發(fā)者工具戒祠;

  • 按鍵盤的F5刷新網(wǎng)頁;

  • 選擇Network中的Doc速种;

  • 點(diǎn)擊Headers姜盈,就可以在最末尾查看Request Headers的User-Agent字段,也可以復(fù)制使用User-Agent字段配阵;

參考:https://www.9xkd.com/user/plan-view.html?id=1782598054

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末馏颂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子棋傍,更是在濱河造成了極大的恐慌饱亮,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舍沙,死亡現(xiàn)場離奇詭異近上,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拂铡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門壹无,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人感帅,你說我怎么就攤上這事斗锭。” “怎么了失球?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵岖是,是天一觀的道長。 經(jīng)常有香客問我实苞,道長豺撑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任黔牵,我火速辦了婚禮聪轿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猾浦。我一直安慰自己陆错,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布金赦。 她就那樣靜靜地躺著音瓷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夹抗。 梳的紋絲不亂的頭發(fā)上绳慎,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼偷线。 笑死,一個胖子當(dāng)著我的面吹牛沽甥,可吹牛的內(nèi)容都是我干的声邦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼摆舟,長吁一口氣:“原來是場噩夢啊……” “哼亥曹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恨诱,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤媳瞪,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后照宝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛇受,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年厕鹃,在試婚紗的時候發(fā)現(xiàn)自己被綠了兢仰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡剂碴,死狀恐怖把将,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忆矛,我是刑警寧澤察蹲,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站催训,受9級特大地震影響洽议,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漫拭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一绞铃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嫂侍,春花似錦儿捧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至各淀,卻和暖如春懒鉴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工临谱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留璃俗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓悉默,卻偏偏與公主長得像城豁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抄课,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容