作为贴吧重度用户,写了个贴吧爬虫脚本
抄了一些别人的代码。记得有个验证码解决的。可是忘了链接了,今天最终自己攻克了。
首先要让登陆须要验证码,不停地登陆就好了。。。度娘非常快会加上验证码大法的。。。
须要验证码的情况下,直接登陆返回的错误信息是error=257
打开贴吧首页选择登陆,弹出验证码,找到验证码的链接是
右键在新标签页中打开
注意到链接是
https://passport.baidu.com/cgi-bin/genimage?jxIcaptchaservice+一串字母数字
这个时候依据之前写的代码,判定登陆成功是依据post登录数据之后返回的一串链接,链接格式是这样:
https://passport.baidu.com/static/passpc-account/html/v3Jump.html?
hao123Param=ZzJhSGQzVkhjNGNGUlBNRVZMYlV0YVNYazVTa2xMUWtRdE1FTnJRblZuT1dkeVRXRlBOMlZYU2tsQlZuaFdRVUZCUVVGQkpDUUFBQUFBQUFBQUFBRUFBQUJYbTk4aXdhTFd2cmUwMDZiSzFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFFaDBORlZJZERSVmRq&callback=parent.bd__pcbs__ra48vi&index=0&codestring=&username=%E7%AB%8B%E5%BF%97%E5%8F%8D%E5%BA%94%E8%AF%95&phonenumber=&mail=&tpl=pp&u=https%3A%2F%2Fpassport.baidu.com%2F&needToModifyPassword=0&gotourl=&auth=&error=0
最后面的error=0代表没有错误,登陆成功,当须要验证码时,返回的链接redirectURL大约是这种
除了error=257之外。还出现了
codestring=jxIcaptchaservice616462355546386b494679704d7678684f666d4d5645364a567a376c615563564e43795356514d774378374e63742f44596b367733625a7176766a41706a794f58435365586732506a73376a4f7877784f326442314469774e654575653558747a78657a756639336a2f77674c6f6e34415a396f445952356f326d454e6969325133656c5854754c727257442f796d7332676f4c61612f565946526148586758597a61502f697174715a686b2b5455332f56574f42522f5649415767504b6e3847737a367930587069577a5077796c696f38544957332b43564c444259514c6c7763766a626e7147674e726d39422b6b36777a2f46417a766a6345315768597a35426775774442674973553074444a694f4b766c6a4e5261664d65462b4b4b6e5a547159594d6a4c4c76747a7159596a307a3879306642455355752b3078317849694a664e546a36
这一串參数,似乎正好和验证码链接吻合,于是写了一段代码生成链接并获取图片:
- vcodeMatch=re.search(r'codestring=jxIcaptchaservice\S+&username',redirectURL)
- vcodeNum=vcodeMatch.group(0)[11:-9]
- vcodeUrl='https://passport.baidu.com/cgi-bin/genimage?'+vcodeNum
- vcodeRequest=urllib2.Request(vcodeUrl)
- vcodeResponse=urllib2.urlopen(vcodeRequest)
- with open('vcode.jpg','wb') as out:
- out.write(vcodeResponse.read())
- out.flush()
- vcode=raw_input(u'input vcode:')
- rawData['verifycode']=vcode
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
rawData是post的数据,加上验证码时候再次post过去。測试的时候发现并没有登陆成功,变成了不停输入验证码= =
再次到网页上找原因。找到post传递的參数中
除了verifycode之外还有个codestring。加到post參数里面就成功了
所以加上一句:
rawData['codestring']=vcodeNum
- 1
測试结果