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