爬蟲技能——代碼模擬驗(yàn)證碼登錄網(wǎng)站之初級(jí)版

本人也是菜鳥一枚如有大佬看到就慢慢看我裝逼嘹锁,若有新如坑的小伙伴我們一起加油呆盖。
在眾多的反爬手段中驗(yàn)證碼可以說是比較有效的手段之一了呢灶,今天寫了一個(gè)模擬登陸的程序與大家分享曾雕,也做為自己的一次總結(jié)和措。
要爬取的目標(biāo)網(wǎng)站:
https://so.gushiwen.org
先來說一下關(guān)于驗(yàn)證碼這塊的處理庄呈,慣用的有三種方法:
一是將驗(yàn)證碼下載到本地,然后手動(dòng)在鍵盤上輸入派阱。這種方法是最保險(xiǎn)的方法诬留,但也是效率最低的方法,使用于爬蟲任務(wù)量不是很大贫母,對(duì)爬蟲效率沒有較高的要求的情況文兑。
二是采用tesseract庫,這種方法對(duì)一些簡(jiǎn)單的圖形驗(yàn)證碼來說還是有用的腺劣,像純字母或純數(shù)字這種對(duì)圖片做一些簡(jiǎn)單的處理即可绿贞,比如二值化、轉(zhuǎn)灰度等誓酒。是不是很方便樟蠕?如果你覺得很方便的話贮聂,那你就錯(cuò)了!這種操作有6張驗(yàn)證碼能識(shí)別出3到4張就很牛逼了寨辩,但這還是達(dá)不到我們的要求怎么辦吓懈,那就機(jī)器學(xué)習(xí),今天不做深究靡狞。
三是用打碼平臺(tái)耻警,這種方法呢,我會(huì)單獨(dú)的寫一篇詳細(xì)的用法甸怕。暫且不提甘穿。
思路:
1.向登陸頁面發(fā)送get請(qǐng)求,獲取到響應(yīng)內(nèi)容后拿自己用得最6的解析方式梢杭,將驗(yàn)證碼圖片的SRC取出來温兼。
import requests
import urllib.request
from lxml import etree
s = requests.session()
url = 'https://so.gushiwen.org/user/login.aspx?'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/70.0.3538.110 Safari/537.36'
}
r = requests.get(url=url,headers=headers)
tree = etree.HTML(r.text)
img_src = tree.xpath('//div[@class="mainreg2"][3]/img[@id="imgCode"]/@src')[0]
2.驗(yàn)證碼的完整地址是:https://so.gushiwen.org/RandCode.ashx,就是拼接嘛武契,然后向拼接完成的URL發(fā)送get請(qǐng)求下載驗(yàn)證碼圖片募判。
urllib.request.urlretrieve(image_src,'code.png')
3.抓包分析或者采用開發(fā)者工具找到登陸所需的參數(shù)咒唆,這一步呢比較建議使用fiddler抓包工具届垫,因?yàn)樵陂_發(fā)者工具中登陸所需的參數(shù)分布在不同的字段中全释,有時(shí)會(huì)找不齊(我就爬過這個(gè)坑),在fiddler中的請(qǐng)求詳情中的Webforms一欄中會(huì)包含所有登陸所需的參數(shù)和登陸的接口浸船。
登陸的接口:https://so.gushiwen.org/user/login.aspx?from=http%3a%2f%2fso.gushiwen.org%2fuser%2fcollect.aspx
登陸所需的參數(shù):
'__VIEWSTATE':CsLDIp5JJGJCCuh76ipinjcqzhHVS2uRMHJ7JkXtVRllfxUzqBZuaRuwISfGf0aEGQCbecVIRKF76hW+VixVlqygRBZx9fAUn3foAXqf7YR2tuYNnDtLB/+dL8E=,
'__VIEWSTATEGENERATOR':C93BE1AE,
'from':'http://so.gushiwen.org/user/collect.aspx',
'email':'這個(gè)是賬號(hào)',
'pwd':'這個(gè)是密碼',
'code':code, #這個(gè)是驗(yàn)證碼
'denglu':'登陸',
4.向這個(gè)登陸接口發(fā)送post請(qǐng)求妄迁。
url = 'https://so.gushiwen.org/user/login.aspx?from=http%3a%2f%2fso.gushiwen.org%2fuser%2fcollect.aspx'
code = input('請(qǐng)輸入驗(yàn)證碼:')
formdata = { '__VIEWSTATE':CsLDIp5JJGJCCuh76ipinjcqzhHVS2uRMHJ7JkXtVRllfxUzqBZuaRuwISfGf0aEGQCbecVIRKF76hW+VixVlqygRBZx9fAUn3foAXqf7YR2tuYNnDtLB/+dL8E=,
'__VIEWSTATEGENERATOR':C93BE1AE,
'from':'http://so.gushiwen.org/user/collect.aspx',
'email':'erer4564654@163.com',
'pwd':'lakers24kebi',
'code':code,
'denglu':'登陸',
}
r = s.post(url=post_url,headers=headers,data=formdata)
print(r.text)
打印一下看響應(yīng)內(nèi)容李命,如果有修改密碼、賬號(hào)管理等內(nèi)容證明登陸成功项戴。
然鵝。槽惫。周叮。。仿耽。各薇。君躺。开缎。。奕删。。完残。。熟掂。扎拣。。鹏秋。侣夷。。百拓。。决帖。。地回。俊鱼。。并闲。帝火。湃缎。蠢壹。。
報(bào)錯(cuò)V小!7ρ巍V苹小!:瘟摺>槲ā!F禄拧!9蛘摺Oㄇ蟆!M堋G涑恰!!@晖獭V讣濉1愠狻!O窠帧=臁!3肫堋0饲А!A道Α7型!!星立!
是錯(cuò)在哪里呢?
發(fā)送請(qǐng)求室奏、解析內(nèi)容劲装、下載圖片又發(fā)送請(qǐng)求都沒錯(cuò)啊,咋會(huì)報(bào)錯(cuò)呢绒怨,這時(shí)我們就應(yīng)當(dāng)分析一下登陸接口所需的參數(shù)了谦疾,__VIEWSTATE和__VIEWSTATEGENERATOR這兩個(gè)參數(shù)都有各自的值他們會(huì)根據(jù)請(qǐng)求而隨機(jī)改變這個(gè)名詞叫表單令牌不能寫死,且他們能在源碼中找到六剥,那就獲取他們?cè)谠创a中的路徑表達(dá)式來代替formdata中的參數(shù)值。
__VIEWSTATE =tree.xpath('//form[@name="aspnetForm"]/div[1]/input[@id="__VIEWSTATE"]/@value')[1]
__VIEWSTATEGENERATOR =tree.xpath('//form[@name="aspnetForm"]/div[2]/input[@id="__VIEWSTATEGENERATOR"]/@value')[1]
[0]這個(gè)的意思是该默,在xpath中路徑表達(dá)式獲取的是一個(gè)列表策彤,而我要的是其中一個(gè)元素,xpath的索引是從1開始的(python中的索引和jsonpath從0開始的)裹刮。
再向登陸接口發(fā)一次請(qǐng)求必搞,
post_url = 'https://so.gushiwen.org/user/login.aspx?from=http%3a%2f%2fso.gushiwen.org%2fuser%2fcollect.aspx'
code = input('請(qǐng)輸入驗(yàn)證碼:')
formdata = {
'__VIEWSTATE':__VIEWSTATE,
'__VIEWSTATEGENERATOR':__VIEWSTATEGENERATOR,
'from':'http://so.gushiwen.org/user/collect.aspx',
'email':'erer4564654@163.com',
'pwd':'lakers24kebi',
'code':code,
'denglu':'登陸',
}
r = s.post(url=post_url,headers=headers,data=formdata)
print(r.text)
這次應(yīng)該沒問題了吧,呵呵塔橡。
還是報(bào)錯(cuò)霜第!
這次出錯(cuò)的原因是沒有維持同一會(huì)話,這個(gè)以后也會(huì)單獨(dú)寫一篇癞谒。
怎么解決呢刃榨?用s = requests.session()即可解決。那所有的請(qǐng)求就要采用這種方式了桌吃。
完整的源碼:
import requests
import urllib.request
from lxml import etree
s = requests.session()
url = 'https://so.gushiwen.org/user/login.aspx?'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/70.0.3538.110 Safari/537.36'
}
發(fā)送get請(qǐng)求獲取驗(yàn)證碼的URL
r = s.get(url=url,headers=headers)
tree = etree.HTML(r.text)
img_src = tree.xpath('//div[@class="mainreg2"][3]/img[@id="imgCode"]/@src')[0]
拼接URL將驗(yàn)證碼下載到本地
image_src = 'https://so.gushiwen.org' + str(img_src)
r_image = s.get(url=image_src,headers=headers)
with open('code.png','wb') as fp:
fp.write(r_image.content)
解析獲得登陸所需的參數(shù)
__VIEWSTATE =tree.xpath('//form[@name="aspnetForm"]/div[1]/input[@id="__VIEWSTATE"]/@value')[0]
__VIEWSTATEGENERATOR =tree.xpath('//form[@name="aspnetForm"]/div[2]/input[@id="__VIEWSTATEGENERATOR"]/@value')[0]
登陸網(wǎng)站驗(yàn)證是否登陸成功
post_url = 'https://so.gushiwen.org/user/login.aspx?from=http%3a%2f%2fso.gushiwen.org%2fuser%2fcollect.aspx'
code = input('請(qǐng)輸入驗(yàn)證碼:')
formdata = {
'__VIEWSTATE':__VIEWSTATE,
'__VIEWSTATEGENERATOR':__VIEWSTATEGENERATOR,
'from':'http://so.gushiwen.org/user/collect.aspx',
'email':'erer4564654@163.com',
'pwd':'lakers24kebi',
'code':code,
'denglu':'登陸',
}
r = s.post(url=post_url,headers=headers,data=formdata)
print(r.text)
總結(jié):1.要以對(duì)話的形式發(fā)送每一次請(qǐng)求
2.先發(fā)get茅诱,再發(fā)get搬卒,最后發(fā)post
裝逼結(jié)束,我宣布退出裝逼界摆寄!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锐帜,隨后出現(xiàn)的幾起案子畜号,更是在濱河造成了極大的恐慌允瞧,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹升,死亡現(xiàn)場(chǎng)離奇詭異畦韭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)察郁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門转唉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赠法,“玉大人,你說我怎么就攤上這事砖织。” “怎么了新锈?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵茂蚓,是天一觀的道長(zhǎng)聋涨。 經(jīng)常有香客問我,道長(zhǎng)牍白,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任狸涌,我火速辦了婚禮,結(jié)果婚禮上朝捆,老公的妹妹穿的比我還像新娘懒豹。我一直安慰自己,他們只是感情好儒老,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布记餐。 她就那樣靜靜地躺著,像睡著了一般囚衔。 火紅的嫁衣襯著肌膚如雪钠怯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天鞠鲜,我揣著相機(jī)與錄音断国,去河邊找鬼。 笑死霞捡,一個(gè)胖子當(dāng)著我的面吹牛薄疚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播砰碴,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼板丽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了猖辫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤芝囤,失蹤者是張志新(化名)和其女友劉穎辛萍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耳幢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年睛藻,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邢隧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡按摘,死狀恐怖纫谅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情付秕,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布掠河,位于F島的核電站猛计,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跃闹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一苛秕、第九天 我趴在偏房一處隱蔽的房頂上張望找默。 院中可真熱鬧,春花似錦店煞、人聲如沸风钻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽布朦。三九已至,卻和暖如春是趴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背富雅。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國打工窘哈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人图筹。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓让腹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親瓜晤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腹纳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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