【Python网络爬虫学习02】爬取有效的网站验证码
来源:互联网 发布:淘宝正品化妆品店 编辑:程序博客网 时间:2024/05/22 07:04
前段时间获取验证码,人工识别后模拟登陆成功,心里还小窃喜了一阵子。但是最近用同样的方法爬取另一家网站的验证码模拟登陆总是失败,提示验证码不正确,弄得很迷惑。
后来通过使用httpfox抓包仔细对比,怀疑每个验证码对应的cookie是固定的。爬取验证码的时候是一个cookie,登陆的时候却是另一个cookie,两者不匹配就无法成功登陆。(嗨,大学期间计算机网络没好好学落下的后遗症)
痛定思痛,一来为了验证我的思路是否正确,二来希望重新通过实践来回忆网络通信机制,决定尝试在获取验证码的同时从包中把cookie抓出来,然后用对应的cookie模拟登陆。
在借鉴的大牛的文章后(http://www.crifan.com/files/doc/docbook/web_scrape_emulate_login/release/html/web_scrape_emulate_login.html),最终的代码见文章最后。需要说明如下几点:
一、经验证,验证码确实跟cookie(本文就是一个sessionID)是一一对应的,因此获取验证码的时候在头文件中就要加入cookie,再用该cookie和验证码一起登陆就可以了。
二、通过很多次尝试,发现sessionID是可以自己随便设的,只要保证验证码和它是对应就好。应该不是普遍现象,大多数网站应该还是要老老实实抓取sessionID的。这也是本代码没有解决的主要问题
三、从第一次发本文到今天粘上代码,用了20天时间。期间不仅仅实现了虚拟登陆功能,还实现了结构化爬取数据(后续补充内容),写在网上一来方便记忆,而来希望能够帮到有同样问题的朋友,哈哈,我想这就是分享的魅力吧。
还得再接再厉
import urllib import urllib2 import string import reimport randomimport Image#涉及到的各页面地址mainurl='重定向的网址'hosturl = '网址一'imgurl='验证码网址'#任意指定一个NET_SessionId,用于后续的获取验证码和登陆mycookie='ASP.NET_SessionId=xabcdefghijklmnopqrstuvw'#使用上述的ID获取验证码 myimg ="F:\\MyPython\\code.gif"imgrequest = urllib2.Request(imgurl)imgrequest.add_header('Cookie',mycookie)imgresponse=urllib2.urlopen(imgrequest)dlimg = open(myimg,'wb')dlimg.write(imgresponse.read())dlimg.close()#人工识别并输入验证码im = Image.open(myimg)im.show()mycode=raw_input("Please Input The Code:")#模拟登陆页面 ,并获取登陆后返回的页面loginheaders = {'Host':'dx.9lin.com','User-Agent':'Mozilla/5.0 (Windows NT 6.1; rv:27.0) Gecko/20100101 Firefox/27.0','Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language':'zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3','Accept-Encoding':'gzip, deflate','Referer':'http://xx.xx.xx','Cookie':mycookie,'Connection':'keep-alive','Content-Type':'application/x-www-form-urlencoded','Content-Length':'327'}loginpostData = {'__EVENTTARGET':'btnSubmit','__EVENTARGUMENT':'','__VIEWSTATE':'xxxxxxxxx',#一堆编码,暂不知道作何用'__VIEWSTATEGENERATOR':'xxxx',#一串数字,暂不知道作何用'__EVENTVALIDATION':'xxxxx',#又是一堆编码,暂不知道作何用'txt_username' : 'username','txt_userpwd' : 'mypassword','txt_ccode' : mycode } loginpostData = urllib.urlencode(loginpostData) request = urllib2.Request(hosturl, loginpostData, loginheaders) response = urllib2.urlopen(request) text = response.read() pattern=re.compile('xxxx')#通过分析获取到的页面判断是否登陆成功,应该有更简便的方法if pattern.findall(text): print "登陆成功"
- 【Python网络爬虫学习02】爬取有效的网站验证码
- 【Python网络爬虫学习01】爬取网络验证码
- python网络爬虫学习(二)一个爬取百度贴吧的爬虫程序
- Python 网络爬虫--简单的爬取一些防爬取的网站
- Python 网络爬虫 002 (入门) 爬取一个网站之前,要了解的知识
- Python 网络爬虫 007 (编程) 通过网站地图爬取目标站点的所有网页
- Python 爬虫学习2爬取租房网站信息
- 网络爬虫爬取策略,注意爬虫爬取网站的频率
- Python爬虫——爬取网站的图片
- [Python]网络爬虫学习笔记,爬取东南大学SEU-wlan的流量使用情况
- [Python]网络爬虫学习笔记,爬取豆瓣妹子上妹子的照片
- Python可自动登录爬取图片的网络爬虫
- python爬虫实现网络股票信息爬取的demo
- Python爬虫爬取网站新闻
- Python爬虫 爬取翻译类网站
- Python开发爬虫,爬取网站
- python爬虫爬取网站图片
- python爬虫(19)爬取论坛网站——网络上常见的gif动态图
- 如果这样问 足彩怎么回答
- DOM、js验证输入框
- iOS 正则表达式 NSRegularExpression
- 原生DOM知识的积累
- java操作oracle数据库示例程序,用的是jdbc方式
- 【Python网络爬虫学习02】爬取有效的网站验证码
- WIN32_FIND_DATA
- Hadpoop组件介绍
- Firefox firebug and xpath checker
- MyEclipse自动生成Ant Build.xm
- Use View.isInEditMode() in your custom views to skip code when shown in Eclipse
- 无法解析 ACTION_UP,或者它不是字段
- 迷宫最短路径 --- 广度优先搜索(广搜)
- 重写ImageGetter,让TextView异步加载包含图片的html内容