这一步请参考其他文章(并非本文重点)
具体使用的模块如下 大多pip直接安装即可
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from PIL import Image
import time
from datetime import datetime
from email.mime.text import MIMEText
import muggle_ocr#ocr模块 直接pip安装即可
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
着重提一下 PIL模块的安装命令是
pip install pillow
webdriver在不同平台下的安装几乎一致 可以自行百度搜索,在我的脚本中我使用的是直接指定地址
chrome_driver = "/usr/bin/chromedriver" #这个是chromedriver的地址 没有也会报错
下面的代码是使用webdriver.Chrome一些参数
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')#上面三行代码就是为了将Chrome不弹出界面,实现无界面爬取
# driver = webdriver.Chrome(options=chrome_options)
chrome_driver = "/usr/bin/chromedriver" #这个是chromedriver的地址 没有也会报错
# browser = webdriver.Chrome(executable_path=chrome_driver)
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')# 没有就是运行不起来 就很神奇
# browser = webdriver.Chrome(chrome_options=chrome_options)
driver =webdriver.Chrome(options=chrome_options,executable_path=chrome_driver)
这些只能说 只可意会不可言传 哈哈哈哈!
从网页获取后将图片存储到本地
png=driver.find_element_by_xpath("/html/body/div/form/div[3]/div/div/img")
print("开始点击快速登录")
png.screenshot('captcha.png'
这个我在网上找了很多解决验证码的办法,起初我使用的百度开放平台的文字识别接口,我后来不停的测试,把免费的接口次数给用完了,容我一会儿、、、后来换了好几个ocr模块,有的识别率高,但是只能运行一次,有的识别率不高,比如我现在用的这个,识别正确率感人啊,所以经过了一些技术处理。具体代码实现如下:
code_path='captcha.png'
img = Image.open(code_path)
# 将图片变成灰色
img_gray = img.convert('L')
img_gray.save('code_gray.png')
# 转成黑白图片
img_black_white = img_gray.point(lambda x: 0 if x > 200 else 255)
img_black_white.save('code_black_white.png')
# # ModelType.Captcha 可识别4-6位验证码
# sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.Captcha)
# with open(r"code_black_white.png", "rb") as f:
# b = f.read()
# text = sdk.predict(image_bytes=b)
# print(text)
# return text
# 初始化;model_type 包含了 ModelType.OCR/ModelType.Captcha 两种
sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.OCR)
# ModelType.OCR 可识别光学印刷文本 这里个人觉得应该是官方文档写错了 官方文档是ModelType.Captcha 可识别光学印刷文本
with open(r"captcha.png", "rb") as f:
b = f.read()
text = sdk.predict(image_bytes=b)
print(text)
num_code=str_num(text)
print(num_code)
return num_code
str_num函数是筛选数字的,因为我的验证码都是数字,但是ocr总是给我识别些别的,唉。
函数附上:
def str_num(text):
a="".join(list(filter(str.isdigit, text)))
return a
这一步没啥好说的了,验证码都到手了,还说啥!上代码:
def login(captcha):
driver.find_element_by_xpath('/html/body/div/form/div[1]/input').send_keys('*******') # 找到账号框并输入账号
driver.find_element_by_xpath('/html/body/div/form/div[2]/input').send_keys('****') # 找到密码框并输入密码
driver.find_element_by_xpath('/html/body/div/form/div[3]/div/input').send_keys(captcha) # 找到验证码框并输入验证码
driver.find_element_by_xpath('/html/body/div/form/input').click() # 找到登陆按钮并点击
在这里面我用的都是xpath,因为我对前端不熟悉。
action起来!(加一句 由于我的位置信息是无法直接输入的需要从微信后台获取,而我是在网页上进行的操作,哪来的微信,所以修改这个input的属性 onlyread直接删了,就可以继续进行操作了,狂笑!!)
print("action")
try:
driver.find_element_by_xpath('//*[@id="cmarea"]/div[2]/div[1]/a').click() # 进打卡
except:
print("js执行前")
#js='document.getElementByXpath("//*[@id="profileform"]/div[1]/div/input").removeAttribute("readonly")'
js='document.getElementsByName("formdata[v]")[0].removeAttribute("readonly")'
driver.execute_script(js)#执行js语句
print("js执行后")
#地址
driver.find_element_by_xpath('//*[@id="profileform"]/div[1]/div/input').send_keys('河南省,新乡市,延津县,南门|35.14946,114.22926')
print("location已经执行")
driver.find_element_by_xpath('//*[@id="profileform"]/div[2]/div/label[2]').click()#风险 否
print("第一个radio")
driver.find_element_by_xpath('//*[@id="profileform"]/div[3]/div/label[1]').click()#疫苗 有
#//*[@id="profileform"]/div[3]/div/label[1] 疫苗
driver.find_element_by_xpath('//*[@id="profileform"]/div[4]/div/input').send_keys('36.7')
print("体温已经执行")
#//*[@id="profileform"]/div[4]/div/input 体温
driver.find_element_by_xpath('//*[@id="profileform"]/div[25]/button').click()#提交按钮
#//*[@id="profileform"]/div[25]/button 提交按钮
try:
message= driver.find_element_by_xpath('/html/body/div[2]/div[2]').text
driver.save_screenshot("over.png")
print(message)
# send(message)
except:
message= "打卡成功"
print(message)
driver.save_screenshot("over.png")
send(message)
else:
message= "今天已经打过卡咯"
driver.save_screenshot("over.png")
print(message)
send(message)
#/html/body/div[2]/div[2] 新增失败
#新增失败,该项资料一天最多只能填写1份,明天再填吧~
else:
print("没有异常")
#//*[@id="profileform"]/div[1]/div/input location
6、最后附上邮件发送模块(qq邮箱哈,其他的需要改SMTP服务器)
def send(message):
# 主题
msg = MIMEMultipart('related')
content = MIMEText('', 'html', 'utf-8') # 正文
msg.attach(content)
msg['Subject'] = message
msg['From'] = msg_from
msg['To'] = msg_to
file = open(r"over.png", "rb")
img_data = file.read()
file.close()
img = MIMEImage(img_data)
img.add_header('Content-ID', 'imageid')
msg.attach(img)
try:
s = smtplib.SMTP_SSL("smtp.qq.com", 465) # 邮件服务器及端口号 25
s.login(msg_from, passwd)
s.sendmail(msg_from, msg_to, msg.as_string())
print('发送成功!')
except Exception:
print('发送失败!')
finally:
s.quit()
结束的好快啊,下面就是我的主程序了!
if __name__ == '__main__':
msg_from = '*******@qq.com' # 发送方邮箱
passwd = 'bscuidzaaf' # 填入发送方邮箱的授权码
msg_to = '*****@qq.com' # 收件人邮箱
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')#上面三行代码就是为了将Chrome不弹出界面,实现无界面爬取
# driver = webdriver.Chrome(options=chrome_options)
chrome_driver = "/usr/bin/chromedriver" #这个是chromedriver的地址 没有也会报错
# browser = webdriver.Chrome(executable_path=chrome_driver)
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')# 没有就是运行不起来 就很神奇
# browser = webdriver.Chrome(chrome_options=chrome_options)
driver =webdriver.Chrome(options=chrome_options,executable_path=chrome_driver)
driver.get("http://htu.banjimofang.com/?uid=1146514&tm=1628045137&sign=ff095221b70c62d2be402991fbdde4f6&option=&")
driver.find_element_by_xpath('//*[@id="home"]/div/div/div[1]/a[2]').click() # 找到登陆按钮并点击
time.sleep(5)
get_captcha()
captcha = discern_captcha()
login(captcha)
flage=1#登录标志 1 失败 0成功
while(flage):
try:
driver.find_element_by_xpath("/html/body/div/form/div[4]")
except:
print("有异常")#登录成功
get_action()
flage=0
else:
print("没有异常")#登录失败
get_captcha()
captcha = discern_captcha()
a_login(captcha)
flage=1
print("succesful")
get_action()
# driver.save_screenshot("over.png")
# message='打卡截图'
# send(message)
driver.quit()
结束!
提醒一下代码中的webdriver地址记得修改成服务器中webdriver所在的地址(需要自己下载的,链接百度一下就有)
在终端中键入
crontab -e
进去后输入
09 00 * * * * /Users/lichun/opt/anaconda3/envs/pytorch/bin/python /Users/lichun/Documents/python/练习/HCI3.0.py
意思是每天00:09执行
具体格式如下:
# 每1分钟执行一次Command
* * * * * Command
# 每小时的第3和第15分钟执行
3,15 * * * * Command
# 在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * Command
# 每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * Command
# 每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 Command
# 晚上11点到早上7点之间,每隔一小时重启smb
几个常用的命令也列出来:
Crontab -l 查看
Crontab -e 新建 编辑
sudo /usr/sbin/cron start 启动
sudo /usr/sbin/cron restart 重启
sudo /usr/sbin/cron stop 停止