python爬虫绕过滑块验证

发布于 2021-03-10  9 次阅读


目标网址:http://maoyan.com/board/4
前情描述:在进行网站爬取时,多次访问会出现302跳转,302跳转到varify.maoyan上,观察得知其302后的url中有类似滑块验证成功后的&varify=xx参数,但是在脚本实践后,还是绕不过滑块验证(代码发个人博客里),没办法,还是只能回到selenium模拟滑块验证的环节。

from selenium import webdriver
from time import sleep

s = webdriver.Chrome()
#模拟获取网页
s.get('https://verify.maoyan.com/verify?redirectURL=https%3A%2F%2Fmaoyan.com%2Fboard%2F4&requestCode=c2c1ec45258a3f3d2db72eb1036cc88dc3kys#/')
sleep(1)

#获取属性
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
s.refresh()

这里在运行时报错:

aise WebDriverException(
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home

解决方法:chrome与其版本不一致(直接百度报错就有了)这里就只附上mac的解决
在获取验证背景图与滑块图时,报错,暂时没有找到解决方法。跟着教程把其他网站的滑动验证先解决。
当selenium处理全屏幕截图,在location定位验证码背景图时,出现定位不准确的情况,想想就知道是浏览器界面与定位方式的不匹配的原因了。
摘自:https://www.cnblogs.com/Summer-skr--blog/p/11823324.html

Python爬虫 | python+selenium使用location定位元素坐标偏差


使用定位截图时出现这个问题的,之所以会出现这个坐标偏差是因为电脑上设置的显示缩放比例造成的,location获取的坐标是按显示100%时得到的坐标,而截图所使用的坐标却是需要根据显示缩放比例缩放后对应的图片所确定的,因此就出现了偏差。
解决这个问题有三种方法:
① 修改电脑显示设置为100%。这是最简单的方法。
② 缩放截取到的页面图片,即将截图的size缩放为宽和高都除以缩放比例后的大小(应该需要将缩放后的宽和高转化为int型)
③ 修改Image.crop的参数,将参数元组的四个值都乘以缩放比例(应该也需要转化为int型)
个人比较喜欢后两种,可以将电脑显示的缩放比例作为一个单独的参数放到整体环境参数里,每次只用改下这个参数就行了。当然如果能通过程序自动获取操作系统的这个参数的话更好。

个人觉得在crop()传递参数,由于mac系统缩放没有比例(没看到有),就没有去试
当修改电脑显示为100%时,基本可以截图到目标背景了
代码并非自创,但是在原有代码上注释与补充修改适应个人系统

这里的目标地址变为:https://www.cods.org.cn

from selenium import webdriver
from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.by import By
#from selenium.common.exceptions import TimeoutException
from PIL import Image
#from selenium.webdriver import ActionChains
import sys
#调用浏览器#关闭顶部弹窗
sd =webdriver.ChromeOptions()
sd.add_experimental_option("excludeSwitches", ['enable-automation']);
s = webdriver.Chrome()

##最大化页面
s.maximize_window()
#模拟获取网页
s.get('https://www.cods.org.cn')
sleep(5)
s.find_element_by_id('checkContent_index').send_keys('flag')
sleep(3)


#输入
btn = WebDriverWait(s, 10).until(ec.presence_of_element_located((By.ID, 'checkBtn')))
s.execute_script("arguments[0].click();", btn)
sleep(3)
s.refresh()


#定义计算公式,颜色通道,0越黑,255越白
def get_len():
    im=Image.open('yzm.png')
    chang=0
    for x in range(im.size[0]):
        a=0
        for y in range(im.size[1]):
            rgb=im.load()[x,y]
            if rgb[0]<20 and rgb[1]<60 and rgb[2]<90:
                a+= 1
            if a>= 10:
                print(x)
                return x
    return chang

while True:
    for i in range(4):
        if i== 3:
            print("次数刷新")
            s.refresh()
        else:
            #先找到进度条按钮
            slider=WebDriverWait(s,20).until(ec.presence_of_element_located((By.CLASS_NAME,'geetest_slider_button')))
            #找到拼图大图
            img=WebDriverWait(s,20).until(ec.presence_of_element_located((By.CLASS_NAME,'geetest_canvas_img')))
            #找到大图坐标
            location=img.location
            size=img.size
            left,top,right,buttom=location['x'],location['y'],location['x']+size['width'],location['y']+size['height']
            sleep(3)
            s.get_screenshot_as_file('full.png')
            #图片处理
            ##将图片的分辨率调整为整屏分辨
            img=Image.open('full.png')
            img = img.resize((1440,900))
            #crop里传入元组
            img = img.crop((left,top,right,buttom))
            img.save('yzm.png')
            distance=get_len()
            #可能distance超过0或最大,被其他黑色干扰,需要重新刷新
            print(distance)
            if distance == 0 or distance >= 160:
                WebDriverWait(s,20).until(ec.presence_of_element_located((By.CLASS_NAME,"geetest_refresh_1")))
                s.find_element_by_class_name('geetest_refresh_1').click()
                continue
            else:
                #拟人滑块操作
                action_chains= webdriver.ActionChains(s)
                action_chains.click_and_hold(slider)
                action_chains.pause(0.2)
                action_chains.move_by_offset(distance-5,0)
                action_chains.pause(0.6)
                action_chains.move_by_offset(-5,0)
                action_chains.pause(0.6)
                action_chains.release()
                action_chains.perform()
                sleep(4)
            #end判断条件
            if s.title=='sorry':
                s.quit()
                sys.exit()


间桐桜のお菓子屋さん