python下载反爬虫网页文件

上周一直在出差看论文和yy方法论,没有动手写代码。周五的时候需要在网上爬大量的文件,想着写个爬虫。但是手愈是不动愈是懒,抓了包发现网站是个明显设置了反爬虫的好网站之后,懒癌发作的我在借助现成的爬虫工具和自己亲自写之间拼命摇摆。嗯,最终还是懒得动手小姐获胜。

6069752-9f2da49841234e48.jpg

事实证明,懒,是没有好下场的
七七使用的现成爬虫工具是集搜客,据说很好用的爬虫工具。使用体会是,如果有代码基础的话还是自己手写吧,这个工具提供的简单的功能其实写几行代码就能实现。复杂的功能的话,嗯,搞懂工具怎么用大概跟自己写一个用的时间也差不多。最可怕的是,七七用一个周末的时间,搞懂了集搜客的连续动作、模拟点击这些复杂功能到底怎么实现,然后用实践证明,我要的功能这些复杂模式并不能起到作用。论坛里讲到大概集搜客的飞掠模式可以达到七七想要的效果,但素七七没有经费购买飞掠模式。于是还是得自己动手,丰衣足食。
这个好网站反爬虫主要体现在两个方面,一个是点击download抓包到的目标网址是不能直接get到的,一个是频繁点击的时候会被直接封号。
第一个问题是最困扰我的问题,用简单的urllib2.get失败之后思路直接走偏。一开始想借用集搜客的连续动作和模拟点击功能,直接模拟点击download按钮,把网站里的文件点点点下载下来。后来发现集搜客搞不动之后,又想调用Python的selenium库直接做网页模拟点击。然而,这个定位还是比较愚蠢的,点错地方了就容易陷入死循环。这两个方法其实是逃避直接接触http协议想到的偷懒方式,偷懒失败后,只能回归http通信,然后发现,用通信的方式好简单。
只要能够完全的模拟报头,就能完美起到点击的作用。这里不得不提,firefox作为一款业余抓包工具真的很好用,通过分析点击的时候发送的request header,可以发现报头的规律,人为模拟这个规律,就可以达到点击的效果。具体到这个好网站,我完整的模拟了发送的报头,用控制变量的方法发现,cookie的使用是极为关键的。同时为了防止自己的账户被禁,cookie的模拟变换以及适当的抓取间隔设置是必要的。
(查看发送request之后response的报头与网页实际点击之后response的报头是不是一样,看看自己模拟的哪里有问题)
实践用教训告诉我们,偷懒米有好结果,不到半天的工作量生生耗进去了一个周末加半天。
途中发现了一个很好用的firefox的插件,名字叫做,downthemall,可以批量下载网站的文件,还可以设置规则跨网页下载,如果大学的时候发现了这个神器,一定把网络学堂的课件全珍藏下来,推荐推荐。
放源代码吧

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)
        

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容