电话咨询
19922193247
今日学习了一下抓取sou狗搜索网站的关键排名情况,在频繁请求页面并获取网站的排名时,爬虫ip被封禁,需要手动输入验证码才能解禁。
对于这样的验证码处理,还是比较简单的,首先就时调用浏览器,获取这个页面,然后对验证码图片进行切割保存。
一、登录
用selenium打开页面信息,屏蔽webdriver的信息
二、截取验证码
将浏览器保存为图片,定位出验证码的坐标位置,进行切割保存
def open_sougou():
driver.get(url)
driverWait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'img#seccodeImage')))
def get_screen_shot():
screen = driver.get_screenshot_as_png()
screen_shot = Image.open(BytesIO(screen))
return screen_shot
def get_captha_position():
element = driver.find_element_by_css_selector("img#seccodeImage")
location = element.location
size = element.size
left,top,right,bottom = location['x'],location['y'],location['x'] + size['width'],location['y'] + size['height']
return left,top,right,bottom
def get_captha_shot(name='ca.png'):
driver.execute_script("document.body.style.zoom=0.8")
screen_shot = get_screen_shot()
left,top,right,bottom = get_captha_position()
captha_shot = screen_shot.crop((left,top,right,bottom))
captha_shot.save(name)
三、联众接口识别
这里用第三方接口识别验证码
四、灰度处理图片
用opencv库对图片进行灰度处理,调用联众接口方法,获取验证码
def handle_img():
yzm = cv2.imread('ca.png')
yzm = cv2.cvtColor(yzm,cv2.COLOR_BGR2GRAY)
# thresh, yzm = cv2.threshold(yzm, 160, 255, cv2.THRESH_BINARY)
cv2.imwrite('ca2.png',yzm)
def get_imgcode():
code = lianzhong()
print(code)
return code
五、验证
拿到返回的验证码信息,进行页面输入
def send_code(code):
driver.execute_script("document.body.style.zoom=1")
driver.find_element_by_css_selector("input[type='text']").send_keys(code)
time.sleep(1)
driver.find_element_by_xpath("//a[@id='submit']").click()
time.sleep(1)
driver.find_element_by_css_selector("a[onclick='changeImg2();']").click()
六、运行
运行主函数后,成功验证成功,并返回搜狗正常页面
温馨提示:我们将在您提交信息后的30分钟内与您取得联系,请您保持电话通畅,谢谢!