爬虫模拟登录

Author Avatar
WincerChan 8月 13, 2017
  • 在其它设备中阅读本文章

前言

有时候就在想,要是所有的网站对爬虫友好该多好。

当然这是不可能的:网站重要的数据往往就是一个产品的价值所在,如果被我们轻松的获取,这自然对网站经营者来说是一种损失,所以就有了以下各种策略去阻碍爬虫:

  • User-Agent 检测
  • 帐号及 Cookie 验证
  • 验证码
  • 限制 IP 次数或频率

这篇文章主要来说说如何解决验证码问题。

获取网页结构

验证码多是在登录的情况下与 usernamepassword 一同用 post 方法传给服务器进行验证,所以我们首先需要去查看一个网页的结构,这里以豆瓣为例:

检查元素后发现登录是单独存在的一个界面,网址是 https://www.douban.com/accounts/login,而且也标注了是以 post 去提交,接下来输入用户名和密码,点击登录,ok,我们就登录成功了,这是人为的方式,那么我们这种操作翻译成程序是怎么样的呢?

检查 post 提交的信息

F12 打开调试工具,在 Network 一栏把 Preserve log 勾上,这一点是因为一点登录就跳转到另一个界面了,捕捉不到登录信息

随后你会看到加载了许多的信息,没关系,把滚动条拉至最上方,你会看到名为 login 的一个报文,点击,然后滑动到最下方,你就会看到一个 Form Data 的数据表,这就是 post 提交的东西,你会看到有包括你的邮箱、密码在内的 5 项内容,我们浏览器发送的也就是这 5 项。

构造程序

既然知道了需要提交的信息,也就成功了一大半了,这里用 requests 库的 session 来保存 cookie 信息

from requests import session

url = 'https://accounts.douban.com/login'
#豆瓣貌似并不会验证User-Agent
head = {              
    'User-Agent':
    ('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
        '(KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36')
}
# 这里就是刚刚获取的post需要提交的信息
data = {                                        
    'source': 'None',
    'redir': 'https://www.douban.com',
    'form_email': '',
    'form_password': '',
    'login': '登录'
}

ssion = session()
ssion.post(url, header=head, data=data)

ssion.get() 就可以使用刚刚保存在 session 中的信息进行登录了,你可以采取以下代码看看你是不是成功登录了:

t = ssion.get('https://www.douban.com').text
print(t)

如果你发现了自己的帐号名称,那么就成功了。

验证码

大多数情况登录是不需要验证码的,但是亲测发现频繁登录大概 5 次左右就会需要验证码,同样检查 post 发现多了两项:

captcha-solutioncaptcha-id 内容,自然就是我们输入的验证码了其中 solution 就是验证码的内容,id 就是验证码的编号,当二者与数据库的内容与编号对应时,就验证通过。

这里提供一个简单的思路:将验证码的图片保存至本地,然后用户输入验证码内容后再提交:

from re import search, compile
from PIL impoet Image

img = compile(r'img id="captcha_image" src="(.*?)"')
img_url = img.findall(response)[0]
jpg = get(img_url).content
with open('captcha.jpg', 'wb') as f:
    f.write(jpg)
Image.open('captcha.jpg').show()
captcha_solu = input('input captcha: ')
capt = compile(r'captcha\?id=(.*?)\&amp')
captcha_id = capt.findall(img_url)[0]
data = {
    'source': 'None',
    'redir': 'https://www.douban.com',
    'form_email': '',
    'form_password': '',
    'captcha-solution': captcha_solu,
    'captcha-id': captcha_id,
    'login': '登录'
}

当你运行的时候,会弹出一个小框框显示的是验证码,在终端输入内容就可以了,如下图

用 class 封装一下,完整的代码见这里,main 函数返回的就是 ssion,直接使用即可。

本文标题: 爬虫模拟登录
最后更新:2017 年 12 月 24 日 - 20:12
本文链接:https://blog.itswincer.com/posts/94e157f8/
本文采用:署名-非商业性使用-禁止演绎 4.0 国际 协议进行许可,阅读 相关说明