绕过验证码爬取学校cms

最近学校要求用美化学院官网文章,工作基本是简单的操作,实在无聊,不如用python脚本实现
,学习Python之余偷懒



绕过验证码登录

方法有两种

方法一

使用selenium模拟人操作,接入打码平台识别验证码,实现登录,登录之后一切好说

最开始使用tesseract-ocr,但识别验证码正确率感人,于是选择打码品台,调用平台接口识别验证码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
from selenium import webdriver
import time
from PIL import Image
from YDM import resul#该文件为打码平台提供
url = ''
driver = webdriver.Chrome()
driver.get(url) #打开页面
time.sleep(2)
#找到账号输入框位置
username = driver.find_element_by_css_selector('input[type="text"]')
#找到密码输入框位置
passwd = driver.find_element_by_css_selector('dd:nth-child(4) > input')
#找到验证码输入框位置
code = driver.find_element_by_css_selector('#vdcode')
#找到登录按钮位置
click = driver.find_element_by_css_selector('button')
#定位方法,chrome右键检查元素即可
time.sleep(1)
#截取图片
driver.get_screenshot_as_file('path/a.png')
#打开图片
im = Image.open('path/a.png')
#手动定位验证码在图片坐标(left,top,right,bottom)
#很多图片编辑器都有定位坐标功能
im = im.crop((520, 380, 600, 410))
#保存图片
im.save('/home/pjs/b.png')
time.sleep(2)
#调用打码平台接口,result接受返回的验证码
result = resul()
#输入账号密码
username.send_keys('name')
passwd.send_keys('passwd')
time.sleep(2)
#输入验证码
code.send_keys(result)
#点击登录按钮
click.click()
#登录成功

本来以为学校cms反爬技术很高级,懒得分析,直接用selenium,结果学校cms实在烂,于是有了方法二

方法二

使用requests 发送cookie登录

首先使用chrome的network抓包,抓取登录成功的post
由于学校登录成功后会跳转,所以勾选chrome>network>preserve log
图片未加载
勾选后,即使登录后跳转也能抓取到登录时post信息

1
2
3
4
5
6
7
8
9
10
import requests

url = ''
headers = {
'User-Aegnt':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
}
cookies = {'': '',
}
webdata = requests.get(url,headers= headers,cookies=cookies)
print(webdata.text)

使用session更加方便
官方文档如下:

会话对象
会话对象让你能够跨请求保持某些参数。
它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能。
所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。 (参见 HTTP persistent connection).

简单的用法就是get方法不用多次发送cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
url = ''
headers = {
'User-Aegnt':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
}
s = requests.Session() # 开启一个会话Session
cookie_dict={'name','value'
} # 从chrome浏览器中取到的cookie值
s.headers = headers
s.cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
# 把cookie值转换为cookiejar类型,然后传给Session,这个方法会替换掉原有的cookies
webdate = s.get(url)
print(webdate)

  • 本文作者:pjs
  • 本文链接: 2019/03/05/cms/
  • 许可协议: 除特殊声明外,本站博文均采用 CC BY-NC-SA 3.0 CN 许可协议,转载请注明出处!