找了本书:《python网络数据采集》准备学一点 python 爬虫,记录一下学到的东西吧
详细知识就不说了,主要记录一下后面使用 webdriver 模拟登陆
需要有以下环境准备:
1、requests库
2、selenium库(版本在3.8.0,高了不支持phantonjs)
3、chromedriver(对应好谷歌浏览器版本,放在谷歌浏览器安装目录,然后把这个目录添加到环境变量)
代码部分:
from bs4 import BeautifulSoup
from selenium import webdriver
import requests
import time
from selenium.webdriver.common.keys import Keys
#这个库主要是用来模拟按键的
#browser=webdriver.PhantomJS(executable_path='D:/software/phantomjs-2.1.1-windows/bin/phantomjs')
#browser.get("http://jwxt.sdaeu.edu.cn/jwweb/home.aspx")
#为了验证,暂时不用无界
#chromeOptions = webdriver.ChromeOptions()
#chromeOptions.add_argument("--proxy-server=http://127.0.0.1:8080")
#给chrome设置代理
#browser = webdriver.Chrome(chrome_options = chromeOptions)
browser = webdriver.Chrome()
browser.get('http://jwxt.sdaeu.edu.cn/jwweb/home.aspx')
#打开chrome
time.sleep(2)
browser.switch_to_frame('frm_login')
#跳转表单,因为网页上有多个frame,每个都是独立的
#所以需要先找到登录用的那一个frame
browser.find_element_by_id("txt_sdertfgsadscxcadsads").click()
#要点一下才能出现更换验证码的链接
jpg=browser.find_element_by_id('imgCode')
img_src=jpg.get_attribute("src")
#拿到更换验证码url
#在这里应该使用browser的ASP.NET_SessionId的值
cookie_bro = browser.get_cookies()
#获取browser的cookie字典
#print(cookie_bro)
cookie1=cookie_bro[0]['value']
print("\n当前cookie为: "+cookie1)
headers1={
'Host':'jwxt.sdaeu.edu.cn',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36',
'Accept':'image/webp,image/apng,image/*,*/*;q=0.8',
'Referer':'http://jwxt.sdaeu.edu.cn/jwweb/_data/login_home.aspx',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.9',
'Cookie':'myCookie=;'+'ASP.NET_SessionId='+cookie1,
'Connection':'close'
}
#header头要全一些,之前只用cookie请求还是不行
#proxy1={"http":"http://127.0.0.1:8080"}
#r=requests.get(img_src,headers=headers1,proxies=proxy1)
#requests使用代理
r=requests.get(img_src,headers=headers1)
img_content=r.content
print("[*]正在下载验证码...\n")
with open('check.jpg','wb') as f:
f.write(img_content)
#提前填写学号和密码
browser.find_element_by_id("txt_asmcdefsddsd").send_keys("学号")
browser.find_element_by_id("txt_asmcdefsddsd").send_keys(Keys.TAB)
browser.find_element_by_id("txt_pewerwedsdfsdff").send_keys("密码")
#暂时需要手动输入
code = input("[*]请输入验证码: ")
browser.find_element_by_id("txt_sdertfgsadscxcadsads").send_keys(code)
browser.find_element_by_id("btn_login").click()
#browser.close()
#关闭浏览器
复制
最后说一下验证码的事情:
当去访问教务处网站(简称网站)的时候,是没有 cookie 的
这时候会返回一个 cookie,“set_cookie”,服务器就是靠这个 cookie 知道是你的
当你去请求更换验证码的时候也是要带着这个 cookie 去请求,浏览器才能知道是你更换验证码,而不是一个新的访问者
而且 url 后面那个 ?t=208 参数,即使是相同的,返回的验证码也不是相同的
所以当你带着 cookie 去请求验证码的时候,实际上你应该输入的验证码,已经从浏览器上显示的,变成了请求之后下载下来的了
其实使用 webdriver 直接去请求链接也就不用管什么 cookie 了,毕竟一直就是那个浏览器,但是保存图片的时候有点编码之类的问题,也没解决就直接用 requests 了
另外,使用在 github 上其他人训练好的验证码识别模块整合了一下,但是识别率实在有点低
使用的识别模块
https://github.com/bieberg0n/jwgl-ocr
复制
整理好的可以自动识别的代码:
https://github.com/yichen115/python-qgjwxt
复制