python下載反爬蟲網頁文件

上周一直在出差看論文和yy方法論,沒有動手寫代碼顿痪。周五的時候需要在網上爬大量的文件巡揍,想著寫個爬蟲痛阻。但是手愈是不動愈是懶,抓了包發(fā)現(xiàn)網站是個明顯設置了反爬蟲的好網站之后腮敌,懶癌發(fā)作的我在借助現(xiàn)成的爬蟲工具和自己親自寫之間拼命搖擺录平。嗯,最終還是懶得動手小姐獲勝缀皱。

6069752-9f2da49841234e48.jpg

事實證明斗这,懶,是沒有好下場的
七七使用的現(xiàn)成爬蟲工具是集搜客啤斗,據(jù)說很好用的爬蟲工具表箭。使用體會是,如果有代碼基礎的話還是自己手寫吧钮莲,這個工具提供的簡單的功能其實寫幾行代碼就能實現(xiàn)免钻。復雜的功能的話,嗯崔拥,搞懂工具怎么用大概跟自己寫一個用的時間也差不多极舔。最可怕的是,七七用一個周末的時間链瓦,搞懂了集搜客的連續(xù)動作拆魏、模擬點擊這些復雜功能到底怎么實現(xiàn),然后用實踐證明慈俯,我要的功能這些復雜模式并不能起到作用渤刃。論壇里講到大概集搜客的飛掠模式可以達到七七想要的效果,但素七七沒有經費購買飛掠模式贴膘。于是還是得自己動手卖子,豐衣足食。
這個好網站反爬蟲主要體現(xiàn)在兩個方面刑峡,一個是點擊download抓包到的目標網址是不能直接get到的洋闽,一個是頻繁點擊的時候會被直接封號。
第一個問題是最困擾我的問題突梦,用簡單的urllib2.get失敗之后思路直接走偏诫舅。一開始想借用集搜客的連續(xù)動作和模擬點擊功能,直接模擬點擊download按鈕阳似,把網站里的文件點點點下載下來骚勘。后來發(fā)現(xiàn)集搜客搞不動之后,又想調用Python的selenium庫直接做網頁模擬點擊。然而俏讹,這個定位還是比較愚蠢的当宴,點錯地方了就容易陷入死循環(huán)。這兩個方法其實是逃避直接接觸http協(xié)議想到的偷懶方式泽疆,偷懶失敗后户矢,只能回歸http通信,然后發(fā)現(xiàn)殉疼,用通信的方式好簡單梯浪。
只要能夠完全的模擬報頭,就能完美起到點擊的作用瓢娜。這里不得不提挂洛,firefox作為一款業(yè)余抓包工具真的很好用,通過分析點擊的時候發(fā)送的request header眠砾,可以發(fā)現(xiàn)報頭的規(guī)律虏劲,人為模擬這個規(guī)律,就可以達到點擊的效果褒颈。具體到這個好網站柒巫,我完整的模擬了發(fā)送的報頭,用控制變量的方法發(fā)現(xiàn)谷丸,cookie的使用是極為關鍵的堡掏。同時為了防止自己的賬戶被禁,cookie的模擬變換以及適當?shù)淖ト¢g隔設置是必要的刨疼。
(查看發(fā)送request之后response的報頭與網頁實際點擊之后response的報頭是不是一樣泉唁,看看自己模擬的哪里有問題)
實踐用教訓告訴我們,偷懶米有好結果币狠,不到半天的工作量生生耗進去了一個周末加半天游两。
途中發(fā)現(xiàn)了一個很好用的firefox的插件砾层,名字叫做漩绵,downthemall,可以批量下載網站的文件肛炮,還可以設置規(guī)則跨網頁下載止吐,如果大學的時候發(fā)現(xiàn)了這個神器,一定把網絡學堂的課件全珍藏下來侨糟,推薦推薦碍扔。
放源代碼吧

import urllib2
import urllib
import requests
import sys
import random
import time
#sys.setdefaultencoding('utf-8')
def get_rep(url_p, vid, cnsuser_id, cnscc, _ym_uid, role):
    filname = role+'_'+url_p.split('/')[-2]+'.rep'
    cookie_str = 'vid='+vid+',cnsuser_id='+cnsuser_id+', cnscc='+cnscc+',  _ym_uid='+_ym_uid+', _ym_isad=2'
    header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Firefox/54.0',
              'Accept-Encoding':'gzip, deflate',
              'Referer':'####', #your url
              'Host':'###', #your url host
              'Connection':'keep-alive',
              'Accept-Language':'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
              'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
              'Cookie':cookie_str}
    reurl = url_p
    req = urllib2.Request(url = reurl)
    out = open(filename,'w')
    r = requests.get(url = reurl, headers=header,stream=True)
    #print r.content
    #print r.headers
    out.write(r.content)
    out.close()
def generate_cookie():
    base_vid = 14000
    base_cnsuser_id = 2500000196
    base_cnscc = 1495000019
    base_ym_uid = 149551000007843736
    
    vid_random_index = random.randint(1,4)
    cnsuser_random_index = random.randint(1,9)
    cnscc_random_index = random.randint(1,9)
    uid_random_index = random.randint(1,17)
    change = random.randint(0,9)
    print vid_random_index, cnsuser_random_index, cnscc_random_index, uid_random_index,change
    
    vid_old_index = int(str(base_vid)[vid_random_index])
    vid_new = base_vid -(vid_old_index-change) *pow(10,4-vid_random_index)
    
    cnsuser_old_index = int(str(base_cnsuser_id)[cnsuser_random_index])
    cnsuser_id_new = base_cnsuser_id -(cnsuser_old_index-change) *pow(10,9-cnsuser_random_index)

    cnscc_old_index = int(str(base_cnscc)[cnscc_random_index])
    cnscc_new = base_cnscc-(cnscc_old_index-change)*pow(10,9-cnscc_random_index)

    uid_old_index = int(str(base_ym_uid)[uid_random_index])
    ym_uid_new = base_ym_uid-(uid_old_index-change)*pow(10,17-uid_random_index)
    print vid_new, cnsuser_id_new, cnscc_new, ym_uid_new
    return vid_new, cnsuser_id_new, cnscc_new, ym_uid_new
    
if __name__=="__main__":
    dir = 'D:/ол┐кн║/url_list'
    files = ['pvp','zvz','tvt','tvz','pvt','pvz']
    for file_name in files:
        role = file_name
        file_path = dir + file_name
        with open(file_path) as f:
            for each_link in f:
                each_link = each_link.strip('\n')
                vid_new, cnsuser_id_new, cnscc_new, ym_uid_new = generate_cookie()
                get_rep(each_link, vid_new, cnsuser_id_new, cnscc_new, ym_uid_new, role)
                time.sleep(1)
        

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秕重,隨后出現(xiàn)的幾起案子不同,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件二拐,死亡現(xiàn)場離奇詭異服鹅,居然都是意外死亡,警方通過查閱死者的電腦和手機百新,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門企软,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饭望,你說我怎么就攤上這事仗哨。” “怎么了铅辞?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵厌漂,是天一觀的道長。 經常有香客問我斟珊,道長桩卵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任倍宾,我火速辦了婚禮雏节,結果婚禮上,老公的妹妹穿的比我還像新娘高职。我一直安慰自己钩乍,他們只是感情好,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布怔锌。 她就那樣靜靜地躺著寥粹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埃元。 梳的紋絲不亂的頭發(fā)上涝涤,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機與錄音岛杀,去河邊找鬼阔拳。 笑死,一個胖子當著我的面吹牛类嗤,可吹牛的內容都是我干的糊肠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遗锣,長吁一口氣:“原來是場噩夢啊……” “哼货裹!你這毒婦竟也來了?” 一聲冷哼從身側響起精偿,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤弧圆,失蹤者是張志新(化名)和其女友劉穎赋兵,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搔预,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡毡惜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斯撮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片经伙。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖勿锅,靈堂內的尸體忽然破棺而出帕膜,到底是詐尸還是另有隱情,我是刑警寧澤溢十,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布垮刹,位于F島的核電站,受9級特大地震影響张弛,放射性物質發(fā)生泄漏荒典。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一吞鸭、第九天 我趴在偏房一處隱蔽的房頂上張望寺董。 院中可真熱鬧,春花似錦刻剥、人聲如沸遮咖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽御吞。三九已至,卻和暖如春漓藕,著一層夾襖步出監(jiān)牢的瞬間陶珠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工享钞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揍诽,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓嫩与,卻偏偏與公主長得像寝姿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子划滋,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容