这是一篇许久之前跳票的文章,有幸在今天能够补上,也得益于最近开始想通一些事情。如果没过第一篇的可以点击下面的链接先看看,本文默认大家已掌握python的基本语法及简单的爬虫技术。
本次我们将讲解一个登陆douban的爬虫,包括验证码验证,以及登陆后进行简单数据爬取。
好了,事不宜迟,show me the code
首先我们需要了解一个背景知识,登陆网站,其实是提交一些数据给到服务器,包括:用户名和密码,验证码,以及其他你看不到的数据。看不到的这部分数据因网站不同而异,但基本的套路会包含一个类似于id的数据,而且每次提交的值都不同,且在前端看不到的情况下进行提交。
第一步,我们在chrome上看一下登陆的页面,以及观察发现出一些前面讲到的需要提交值。https://www.douban.com/login
这里有个小技巧,不借助fidler或者charles等抓包工具,直接登陆的话,看不到需要提交的数据。所以笔者估计输入错误的验证码进行验证。通过审查元素的login,就能看到需要提交的数据。
如上图,可以发现其他隐藏的提交信息,其中:captcha-solution为验证码,captcha-id为隐藏的id值。
第二步,找到隐藏id和验证码提交。
解决验证码提交的问题。主流的方法有两个,一是手动输入,适用于新手且复杂程度并发量很低的爬虫,我们介绍的是这种;二是利用ocr图像识别技术,训练数据后在一定的准确率下进行判断,这种方法比较重,不适合初学者,有兴趣的童鞋可以自己试试。
手动输入,首先我们要看到验证码,然后再输入。采用的方法是将验证码图片下载到本地,使用时到对应的路径去打开图片后输入,然后进行登陆表单的提交。
通过观察我们可以发现验证码图片都存储这个路径下,所以在解析页面后找到这个路径后就可以下载这个图片了。
隐藏id的获取比较简单在源代码下找到对应的id,然后动态的赋值到提交表单上即可。
#coding=utf-8
#没有上面这行输入中文会报错,注意
import requests
from lxml import html
import os
import re
import urllib.request
login_url ="https://www.douban.com/login"
s = requests.session()
r = s.get(login_url)
tree = html.fromstring(r.text)
el = tree.xpath('//input[@name="captcha-id"]')[0]
captcha_id = el.attrib['value']
#获取隐藏id
el2 = tree.xpath('//img[@id="captcha_image"]')[0]
captcha_image_url = el2.attrib['src']
imgPath = r'E:\img'
res=urllib.request.urlopen(captcha_image_url)
filename=os.path.join(imgPath,"1"+'.jpg')
with open(filename,'wb') as f:
f.write(res.read())
#保存验证码图片
captcha_solution= input('请输入验证码:')
第三步,表单提交。
表单与第一步观察得出的值一致。
运行结果如下:
好了,到这里这个爬虫也就完成了。预告下下一篇的内容,其实很多人都已经发现了api的数据获取才是比较方便且稳定的做法,通过页面爬虫的做法,一来网页结构会变,二来还需要和对方的反爬虫机制斗智斗勇。利用api的方式反而是一种便捷高速且高光正的做法。