黑板客爬虫闯关
来源:互联网 发布:淘宝网店必备软件 编辑:程序博客网 时间:2024/04/29 18:33
这个爬虫闯关挺适合入门的,主要是爬取静态网页以及模拟登陆。
一共有5关,重点讲第4关和第5关。
1-3关
第1关是每个页面都带有一串数字,然后要把这串数字替换到url上再访问,从而进入下一个地址获取下一串数字,直至过关。对于了解html的人来说不难,使用beautifulsoup+lxml解析获取到的html即可。
第2关是猜密码,密码是0-30内的一个数字,这里就用到post方法了
先手动在网页上提交一次,然后打开开发者工具查看提交的表单都有什么内容(我使用的是chrome),然后在post方法中加入这些内容即可。- 第3关同样是猜密码,但是多了一个cookies验证方式,同样使用开发者工具查看,会发现多了一个
csrfmiddlewaretoken
,这个在请求网页的时候获得,用以检验是否是接收到网页的本机在操作,因此只需要在post的data中加入这个cookie即可
第4关
长密码获取,进入第4关之前登陆步骤与第3关类似,然后随便输入一个密码登陆后显示密码错误,但是给了一个可以获取密码的地址,这个地址里面有13页,每一页有8行(最后一页4行),每一行显示密码的index与密码在该index对应的数字,一共有100位数字。那思路就很简单,进入每一页然后爬取index与数字信息保存到两个list,然后用一个长101的数组按照对应index去储存这些数字,最后把数组拼接成密码。
运行完后会发现两个问题:
- 网页加载很慢,完成13页的爬取操作要好几分钟。
- 爬取完13页之后会发现密码不够100位
问题1先不管,问题2的原因是每一页的index是随机的,因此爬完13页也不一定能找到所有位置的密码,那就要循环爬取直到爬出100个位置。如果网页加载很快的话,这样做也没有问题,但是现在网页很慢,如果还是一个网页一个网页爬的话效率就十分低下。
我们应该把等待的时间都放到一起,同时爬多个网页。这里就用到多线程了(import threading
)。
thread = threading.Thread(target = retrivePw, args=(num,)) thread.start()
用多个线程去爬取密码,速度能缩短到几分钟,运气好的话。
第5关
第5关再加了一层验证,验证码输入,这个比较麻烦,需要提取验证码图片然后进行图像识别。
验证码验证我选择使用Google的Tesseract-Ocr,虽然识别率很低(也许是验证码中的字符比较歪),但勉强能使用,在python中使用有3个步骤,
- 安装tesseract-ocr,在GitHub上可以找到下载地址
- python中安装pytesseract包
- python中安装PIL/pillow
python中安装使用pip即可
环境配置好后,就可以进行验证码识别了
- 先获取验证码地址
- 然后使用get方法获得验证码图片
- 使用pytesseract的
image_to_string
方法识别验证码 - 对识别出来的字符进行正则表达式匹配,是否满足
'^[A-Z | a-z]{4}$'
是的话才可以算作识别成功
值得注意的是,在开发者工具中查看post数据可以发现,除了验证码,还有一个隐藏的加密字符串captcha_0
要post,,这个字符串可以在登陆页面获取
captcha_0_value = soup.find('input', id="id_captcha_0").get('value')
其中soup是beautifulsoup的一个实例
最后剩下密码要输入,类似第2关和第3关,从0开始猜密码。
整理后的postdata类似于:
guess_data = { 'username' : 'medyg', 'password' : pw, 'csrfmiddlewaretoken' : cookie2['csrftoken'], 'captcha_0' : captcha_0_value, 'captcha_1' : captcha_1 }
post之后要注意要先检验验证码是否正确,可以根据post之后返回的页面中是否有“验证码输入错误”来判断,验证码不正确的话密码不用变,验证码正确了然后才是判断密码是否正确。
加入了正确率的计算,发现这个验证码识别只有18%左右的命中率……不知道增加一些训练样本后会不会变好。
以上是我的黑板客爬虫闯关心得,点击这里可以查看我的代码
- 黑板客爬虫闯关
- 黑板客爬虫闯关第二关
- 黑板客爬虫闯关第三关
- 黑板客爬虫闯关第四关
- 黑板客爬虫闯关第四关
- 黑板客爬虫闯关的第一关
- 黑板客爬虫闯关第二关
- 黑板客爬虫闯关-第一关
- 黑板客 -- 爬虫闯关 -- 关卡01
- 黑板客 -- 爬虫闯关 -- 关卡02
- 黑板客 -- 爬虫闯关 -- 关卡03
- 黑板客 -- 爬虫闯关 -- 关卡04
- 黑板客 -- 爬虫闯关 -- 关卡05
- 黑板课爬虫闯关第一关
- 黑板课爬虫闯关第三关
- 黑板课爬虫闯关第一关
- 黑板课爬虫闯关第二关
- 黑板课爬虫闯关第三关
- 80平混搭风格小阁楼 城市中寻找一片自然风景
- Ajax实现Echarts动态数据加载
- C++排序算法之堆排序
- 刷题记录---每日更新-8月7日
- salesforce apex 语言简介-----类
- 黑板客爬虫闯关
- 窗体部件之QCheckBox
- jQuery 笔记 —— AJAX:ajax()、get()、post()
- 验证邮箱的有效性
- C# 反射整理
- 一起做RGB-D SLAM(8)
- Android OOM遇见的一些问题
- 一句代码实现ListView图文加载的万能适配器BaseListViewAdapter<T>
- zoj1027 Human Gene Functions 动态规划