python自动填写网页数据并提交_python实现问卷星网站的自动填写

因为有一个课程要求进行调查数据的统计,而且小组里选用的是问卷星为平台,问题的形式比较单一,都为单选或多选,于是想到了用python实现一个脚本来代替小组里大家的手动填写。。

大体上使用的就是python+Selenium+PIL+Tesseract

Selenium 是一种浏览器自动化测试框架,通过它检索html与css代码就可以轻松地找到想要的单选框、复选框、提交键等等,然后便可以自动化地实现点击事件。但在这个过程中,还是有很多细节需要注意的。

例如我使用的firefox浏览器需要下载一个调试驱动插件 -> "geckodriver" 。

在最后提交数据的时候使用click()函数没有起到跳转页面的作用,最后是使用send_keys(Keys.ENTER),也就是按Enter键才能实现。猜测是资料中提及的click只是触发事件的方式的其中一种。

PIL (Python Image Library)则是python的一个图形处理库,在一段时间内提交的次数过多时,网站便会要求输入验证码,这时候就要通过Selenium截取屏幕图片然后通过PIL进行进一步的截取和优化图片的效果。因为验证码当中可能会有干扰线、拉伸变形,这时候就要通过处理才能更好地判断出当中的数据。

Tesseract 是一款由HP实验室开发由Google维护的开源的光学字符识别引擎,PIL处理过后的图片便是通过tesseract来与从github上已有的训练数据进行匹配。

#coding: utf-8

from selenium importwebdriverfrom selenium.webdriver.common.by importByfrom selenium.webdriver.common.keys importKeysfrom selenium.webdriver.support.ui importSelectfrom selenium.webdriver.common.action_chains importActionChainsfrom selenium.common.exceptions importNoAlertPresentExceptionfrom PIL importImage,ImageEnhanceimportrandom,os,time,pytesseract

bs= webdriver.Firefox(executable_path="geckodriver")

bs.set_window_size(600,400)deffunc():

bs.get('https://www.wjx.cn/m/17854971.aspx/')

bs.find_elements_by_class_name("ui-radio")[0].click()

bs.find_elements_by_class_name("ui-checkbox")[1].click()

bs.find_elements_by_class_name("ui-radio")[2].click()

bs.find_elements_by_class_name("ui-checkbox")[4].click()

bs.find_elements_by_class_name("ui-checkbox")[5].click()

bs.find_elements_by_class_name("ui-checkbox")[8].click()

bs.find_elements_by_class_name("ui-checkbox")[11].click()

bs.find_elements_by_class_name("ui-radio")[6].click()

bs.find_elements_by_class_name("ui-checkbox")[random.randint(14, 17)].click()try:

bs.find_element_by_id("yucinput").click()

time.sleep(2)

bs.get_screenshot_as_file('D://python_project//wholepage.png')

im= Image.open("D://python_project//wholepage.png")

box= (160, 180, 409, 308)

region=im.crop(box)

region.save("D://python_project//testwholepage.png")

im= Image.open("D://python_project//testwholepage.png")

im= im.convert("L")

threshold= 55pixdata=im.load()

w, h=im.sizefor y inrange(h):for x inrange(w):if pixdata[x, y] < threshold: pixdata[x, y] = 0 else: pixdata[x, y] = 255 for y in range(1, h - 1): for x in range(1, w - 1): count = 0 if pixdata[x, y - 1] > 245:

count= count + 1

if pixdata[x, y + 1] > 245:

count= count + 1

if pixdata[x - 1, y] > 245:

count= count + 1

if pixdata[x + 1, y] > 245:

count= count + 1

if count > 2:

pixdata[x, y]= 255im.save("D://python_project//newMethod.png")

img= Image.open("D://python_project//newMethod.png")

code= pytesseract.image_to_string(img, "eng")

newCode= ''

for c incode:if(c.isalnum()):

newCode+=cprint(newCode)

bs.find_element_by_id("yucinput").send_keys(newCode)exceptException:print("other_func()")finally:

bs.find_element_by_id("ctlNext").send_keys(Keys.ENTER)deffunc2():

bs.get('https://www.wjx.cn/m/17854971.aspx/')

bs.find_elements_by_class_name("ui-radio")[random.randint(0, 1)].click()

bs.find_elements_by_class_name("ui-checkbox")[random.randint(0, 2)].click()

bs.find_elements_by_class_name("ui-radio")[random.randint(2, 4)].click()

bs.find_elements_by_class_name("ui-checkbox")[random.randint(3, 6)].click()

bs.find_elements_by_class_name("ui-checkbox")[random.randint(7, 10)].click()

bs.find_elements_by_class_name("ui-checkbox")[random.randint(11, 13)].click()

bs.find_elements_by_class_name("ui-radio")[random.randint(5, 7)].click()

bs.find_elements_by_class_name("ui-checkbox")[random.randint(14, 17)].click()

bs.find_element_by_id("ctlNext").send_keys(Keys.ENTER)'''def check(css):

s = bs.find_elements_by_css_selector(css_selector=css).

if(len(s) == 0):

func2()

elif len(s) == 1:

func()'''

whileTrue:try:'''check("#yucinput")'''func()exceptException:

t=bs.switch_to_alert()print(t.text)

t.accept()

time.sleep(2)

两天赶出来的代码。。非常混乱,最后还是可以跑起来。不过tesseract的准确率有点感人,大概是十个里面对上四个就不错了。但是自动化处理起来的效率毕竟还是高于人工输入的。最主要的原因我想还是在验证码图片方面处理得不够好,里面图片处理首先是转成灰度图然后二值化然后对干扰线进行处理。而数据的输入可以采取random.randint(x,y) 就可以让数据平均显示。

这是处理前

这是处理后

这已经是比较理想的情况 干扰线并没有太多与字体重叠在一起

还有一处地方就是我是把py文件放在tesseract的安装目录下才能够运行起来,但是我已经添加了tesseract环境变量。这里还是搞不懂的,还有具体图像优化的算法 还是要再学习的。还有问卷星网站是一定时间内太多提交才会要求输入验证码(当然,其实这个也可以设置为每次提交都要输入验证码),所以就要使用异常的做区别对待,异常的使用不太熟,也是刚好运行起来了。。还要学习学习。不管这样使用异常处理是否正确,不过也非常有用地帮助我理解异常这一概念了。

通过这两天的调试,最明显体会到的就是python作为一门脚本语言,真的非常神奇与方便。大量的现存库可以帮助人们在短时间里做出一样东西来。

参考资料:

Python+Selenium+PIL+Tesseract真正自动识别验证码进行一键登录

Selenium.click 不等于手动单击

你可能感兴趣的:(python自动填写网页数据并提交_python实现问卷星网站的自动填写)