이 글은 Python 크롤러 인증코드 구현 기능에 대한 자세한 설명을 중심으로 관련 정보를 소개하고 있습니다. 도움이 필요한 친구들은 참고하시기 바랍니다
주요 구현 기능:
- 로그인 페이지
- 웹페이지가 로드될 때까지 동적으로 대기
- 인증코드 다운로드
저는 아주 일찍부터 스크립트에 따라 기능을 자동으로 실행하여 많은 인력을 절약하겠다는 아이디어를 가지고 있었습니다. 저는 상대적으로 게으릅니다. 인증코드 인식을 완료하고 문제를 근본적으로 해결하자는 마음으로 며칠동안 작성해 보았으나 난이도가 너무 높고 인식 정확도가 너무 낮아 계획이 또 종료되었습니다.
이 경험이 모두와 공유되고 소통될 수 있기를 바랍니다.
Python으로 브라우저 열기
내장된 urllib2 모듈에 비해 작업이 더 까다롭습니다. 처리가 필요합니다. 저장이 매우 불편합니다. 따라서 저는 Python 2.7에서 Selenium 모듈을 사용하여 웹 페이지에서 작업을 수행하고 있습니다.
웹페이지 테스트: http://graduate.buct.edu.cn
웹페이지 열기 : (chromedriver 다운로드 필요)
한자 출력을 지원하려면 sys 모듈을 호출하고 기본 인코딩을 UTF-8로 변경해야 합니다
<code class="hljs python">from selenium.webdriver.support.ui import Select, WebDriverWait from selenium import webdriver from selenium import common from PIL import Image import pytesser import sys reload(sys) sys.setdefaultencoding('utf8') broswer = webdriver.Chrome() broswer.maximize_window() username = 'test' password = 'test' url = 'http://graduate.buct.edu.cn' broswer.get(url)</code>
웹 페이지가 로드되기를 기다리는 중
Selenium에서 WebDriverWait를 사용하면 위 코드는 다음과 같습니다. 로드됨
<code class="hljs livecodeserver">url = 'http://graduate.buct.edu.cn' broswer.get(url) wait = WebDriverWait(webdriver,5) #设置超时时间5s # 在这里输入表单填写并加载的代码 elm = wait.until(lambda webdriver: broswer.find_element_by_xpath(xpathMenuCheck))</code> # 在这里输入表单填写并加载的代码 elm = wait.until(lambda webdriver: broswer.find_element_by_xpath(xpathMenuCheck))</code>
요소 위치 지정, 문자 입력
다음으로 로그인해야 합니다. 여기서는 Chrome을 사용하고 있습니다. 채워야 할 부분을 마우스 오른쪽 버튼으로 클릭하고 Inspect를 선택하면 자동으로 F12 키의 개발자 모드로 이동합니다. (이 기능은 프로세스 전반에 걸쳐 필요합니다. 관련 자료를 찾아보세요).
vczKprbLJnJkcXVvO9Gh1PHT0LnYtcSyv7fWPGJyIC8+DQo8aW1nIGFsdD0="여기에 사진 설명을 쓰세요" src="http://www.jb51.net/uploadfile/Collfiles/201 60414/20160414092144893. png " title="" />
여기서 값 = "1"을 볼 수 있습니다. 드롭다운 상자의 속성을 고려하면 이 값을 UserRole.
여기서 사용하는 것은 셀레늄의 Select 모듈을 통해 선택하는 것입니다. 위치 제어는 1:1 대응이 가능한 find_element_by_**를 사용하므로 매우 편리합니다.
<code class="hljs sql">select = Select(broswer.find_element_by_id('UserRole')) select.select_by_value('2') name = broswer.find_element_by_id('username') name.send_keys(username) pswd = broswer.find_element_by_id('password') pswd.send_keys(password) btnlg = broswer.find_element_by_id('btnLogin') btnlg.click()</code>
스크립트를 자동으로 채우고 다음 페이지로 넘어가는 효과입니다.
여기서 필요한 것은 학술보고서 자동 등록 기능입니다
기존 보고서를 마우스 오른쪽 버튼으로 클릭하면 이 활동과 관련된 메시지를 찾을 수 있습니다. 현재 보고서가 없으므로 제목만 표시되지만 후속 유효한 보고서 식별에는 유사점이 있습니다.
요소의 위치 지정은 xpath를 우선으로 했는데 테스트 결과 요소의 위치를 고유하게 지정할 수 있어서 매우 유용했습니다.
크롤링 정보
우리가 취해야 할 다음 단계는 기존의 유효한 보고서를 크롤링하는 것입니다.
<code class="hljs perl">//*[@id="dgData00"]/tbody/tr/td[2] (前面是xpath)</code>
爬取验证码
对网页中的验证码进行元素审查后,我们发现了其中的一个一个链接,是 IdentifyingCode.apsx,后面我们就对这个页面进行加载,并批量获取验证码。
爬取的思路是用selenium截取当前页面(仅显示部分),并保存到本地——需要翻页并截取特定位置的请研究:
broswer.set_window_position(**)相关函数;然后人工进行验证码的定位,通过PIL模块进行截取并保存。
最后调用谷歌在Python下的pytesser进行字符识别,但这个网站的验证码有很多的干扰,外加字符旋转,仅仅能识别其中的一部分字符。
<code class="hljs livecodeserver"># 获取验证码并验证(仅仅一幅) authCodeURL = broswer.find_element_by_xpath('//*[@id="Table2"]/tbody/tr[2]/td/p/img').get_attribute('src') # 获取验证码地址 broswer.get(authCodeURL) broswer.save_screenshot('text.png') rangle = (0, 0, 64, 28) i = Image.open('text.png') frame4 = i.crop(rangle) frame4.save('authcode.png') qq = Image.open('authcode.png') text = pytesser.image_to_string(qq).strip()</code> <code class="hljs axapta"># 批量获取验证码 authCodeURL = broswer.find_element_by_xpath('//*[@id="Table2"]/tbody/tr[2]/td/p/img').get_attribute('src') # 获取验证码地址 # 获取学习样本 for count in range(10): broswer.get(authCodeURL) broswer.save_screenshot('text.png') rangle = (1, 1, 62, 27) i = Image.open('text.png') frame4 = i.crop(rangle) frame4.save('authcode' + str(count) + '.png') print 'count:' + str(count) broswer.refresh() broswer.quit()</code>
爬取下来的验证码
一部分验证码原图:
从上面的验证码看出,字符是带旋转的,而且因为旋转造成的重叠对于后续的识别也有很大的影响。我曾尝试过使用神经网络进行训练,但因没有进行特征向量的提取,准确率低得离谱。
关于Python爬虫爬验证码实现功能详解就给大家介绍到这里,希望对大家有所帮助!
更多Python 크롤러 크롤링 인증 코드 기능에 대한 자세한 소개相关文章请关注PHP中文网!