第三方接口,验证码识别,获取cookie----selenium登陆

电脑环境:

python 3.6,chrome版本:73.0.3683.103 (正式版本) 

现状描述:

    前几天接触了一个网站,闲得无聊对该网站进行了爬虫,爬虫完成并可以顺利进行爬取数据,不过几天后我再次执行爬虫项目的时候就发错,调查发现我的cookie已经过期, 所以我需要重新获取cookie并执行爬虫,有个想法,每次执行爬虫前先使用selenium动态获取cookie在进行爬虫。

问题描述:

    登陆需要输入验证码,而通过分析,验证码是一个接口,每次刷新页面验证码都会刷新。问题是我使用seleinum打开该网页后,解析网页源代码,再次访问验证码接口的时候,验证码的内容会发生改变。(如下为用户登陆界面)

解决计划:

   对此的解决方案是进行截图,获取验证码图片,通过第三方接口进行识别(为了快捷,我使用的是超级鹰)

解决方案:

   使用selenium打开该网页,通过xpath找到登陆标签,通过PIL模块的crop截图并保存到本地,打开刚刚截图的图片,进行裁剪,目的只获取验证码部分图片,保存到本地,通过超级鹰的接口获取结果,使用selenium进行输入登陆,登陆后获取cookie。以下是我的部分代码(登陆标签,截图,裁剪,调用三方接口)

    import chaojiying    
    a=browser.find_element(By.XPATH,'//*[@id="top"]/header/ng-include[1]/div/div[1]/div[2]/div/div[2]/div')
    # 截图
    a.screenshot("./code.png")
    img = Image.open("./code.png")
    # crop为裁剪函数,参数顺序为left,upper,right,lower
    cropped = img.crop((468, 6, 545, 46))
    cropped.save("./code_new.png")
    # XXXX为你的账号,密码,软件ID 生成一个替换 96001
    chaojiying1 = chaojiying.Chaojiying_Client('XXXX', 'XXXX', 'XXXX')
    im = open('./code_new.png', 'rb').read()
    # 调用接口,获取验证码,参数是图片,验证码的类型,具体查询超级鹰官房文档
    yzm = chaojiying1.PostPic(im, 4004)
    a=yzm['pic_str']

执行代码,登陆成功,获取cookie如下:

visid_incap_1552376=J5q3CSspTdKkKn1BPNxXBOAJolwAAAAAQUIPAAAAAABZXmCzfcRDYULsQqtUhc+0; _ga=GA1.2.970960703.1554123236; __tawkuuid=e::anggame.com::hdv6B2Bve0dpeETaaQPSRnvIytptZPm/TZg04GkAsD+OA3/RnrdZwLFy92P4d6kg::2; _gid=GA1.2.854793067.1557796603; jv_enter_ts_WCUNoFeouW=1557901086587; jv_visits_count_WCUNoFeouW=2; jv_utm_WCUNoFeouW=; _gat_gtm.js=1; JSESSIONID=091ba0ff-6e28-4cf5-af37-add9e7ee5bcc; incap_ses_884_1552376=yLozEyh9WzUj0D2hFJpEDOzP21wAAAAAli2NZuunpPjMp3aO2wjcHg==; TawkConnectionTime=0; jv_pages_count_WCUNoFeouW=28

正确cookie:

__cfduid=d3bfc55ce4bbb6c1d26306ade2c816e941557796603;language=zh-CN;View_Name=v1;nginx=1701161152.20480.0000; _ga=GA1.2.525125029.1557796609;ASP.NET_SessionId=v1mzebix4nxmd2350s4ibd34;_gid=GA1.2.2005888949.1557901083;srv=33ea78af8222117bbd843b2dbc5df7ee;setting_update=false;ZI_TW=zhushuqi;dgk88f200051s=636935018307445504;OddsTypeLocation=HK;Template_Name=bluegray;zi=gk88f200051s;DefaultOddsType=HK;me=%7B%22MCO1%22%3A%22%E7%94%B5%E5%AD%90%E7%AB%9E%E6%8A%80%3A%E5%9B%A0%E8%B5%9B%E4%BA%8B%E6%9C%AA%E7%BB%93%E6%9D%9F%2C%5C%22MIBR-vs-IsurusGaming%5C%22%5B%E5%8F%8D%E6%81%90%E7%B2%BE%E8%8B%B1%3A%E5%85%A8%E7%90%83%E6%94%BB%E5%8A%BF-ESLPROLEAGUEAMERICAS(%E6%AF%94%E8%B5%9B%E8%8E%B7%E8%83%9C%E8%80%85)-14%2F05%5D%E6%9C%89%E9%97%9C%E5%B8%B3%E7%9B%AE%E5%B0%87%E6%9C%83%E8%AA%BF%E8%87%B315%2F05%E8%A8%88%E7%AE%97.%E4%B8%8D%E4%BE%BF%E4%B9%8B%E8%99%95%E6%95%AC%E8%AB%8B%E5%8E%9F%E8%AB%92.%E8%B0%A2%E8%B0%A2!%22%2C%22MCO2%22%3A%22%22%2C%22MCOnum1%22%3A19%2C%22MCOnum2%22%3A0%7D

嗯?貌似不对啊,经过和我的目标cookie对比,相差十分明显

第三方接口,验证码识别,获取cookie----selenium登陆_第1张图片

 经过反夫测试后,得出结论,在使用selenium创建browser的时候,携带参数,将用户数据的路径加上就可以了,

注:这里有个问题,当加上用户数据的路径的时候,再次运行代码前必须将所有的chrom的页面全部关闭,因为直接用用户角度的chrome浏览器打开,不再是寻常的seleni打开的浏览器窗口。

代码如下,

    options = webdriver.ChromeOptions()
    options.add_argument(r"user-data-dir=C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data")
    browser = webdriver.Chrome(options=options)
    wait = WebDriverWait(browser,50)
    browser.get('https://www.anggame.com/cmd')

再次执行后,获取到的cookie格式正确。

 

补充:

  验证码的问题研究了一下,结果是当你访问页面的时候,会显示一个验证码,解析页面获取验证码的api接口,单独访问api接口的时候获取到的验证码会随之改变,第二次获取的验证码使用的UA和cookie和第一次获取的验证码(就是访问页面显示的验证码)一样的UA和cookie,直接在页面输入第二次获取的验证码后点击登陆,即使输入的和图片显示的验证码不一样,登陆还是成功。

原因:相同ua和cookie访问了验证码的api,服务器后台刷新了,不过页面没有实时刷新而已。

 

你可能感兴趣的:(selenium,PIL,验证码,cookie)