【Python3爬虫】模拟登录今日头条 【Python3爬虫】使用云打码识别验证码

为什么会想要做这个模拟登录今日头条呢?因为这个难度偏低,而且用到了图片验证码,所以就想做个模拟登录今日头条练练手。

做这个的难点在于验证码图片的获取,虽然我们能够很轻松的得到验证码图片的链接,但是直接用requests去下载这个验证码图片的话,网页上的验证码又会变化。

所以我的思路是先截取整个屏幕,然后定位到验证码图片的位置,把验证码图片截取下来。

但是由于今日头条登录时候的验证码实在不怎么清晰,有时候靠人识别都识别不准,所以有时候会因为验证码会出错而登不进去。

话不多说,代码如下,注释应该还是比较详细的了,只要把账号和密码写进去就行了,至于YDMDemo,可以参考我的上一篇随笔【Python3爬虫】使用云打码识别验证码

 1 from selenium import webdriver
 2 from YDMapi.YDMDemo import use_ydm
 3 from PIL import Image
 4 from time import sleep
 5 
 6 
 7 def login(username, password):
 8     browser = webdriver.Chrome()
 9     # 最大化
10     browser.maximize_window()
11     # 打开今日头条
12     browser.get("https://www.toutiao.com/")
13     # 点击登录
14     browser.find_element_by_xpath('//*[@id="rightModule"]/div[2]/div/div/a/button').click()
15     # 切换到使用账号登录
16     browser.find_element_by_xpath('/html/body/div/div/div[2]/div/div/div/ul/li[1]').click()
17     # 输入账号
18     browser.find_element_by_xpath('//*[@id="account"]').send_keys(username)
19     sleep(2)
20     # 输入密码
21     browser.find_element_by_xpath('//*[@id="password"]').send_keys(password)
22     sleep(2)
23     # 定位验证码输入框
24     captcha = browser.find_element_by_xpath('//*[@id="captcha"]')
25     # 定位验证码图片
26     captcha_img = browser.find_element_by_xpath('/html/body/div/div/div[2]/div/div/div/form/div[3]/div/img')
27     # 验证码图片位置
28     location = captcha_img.location
29     # 验证码图片大小
30     size = captcha_img.size
31     # 写成我们需要截取的位置坐标
32     coordinates = (int(location['x']), int(location['y']),
33                    int(location['x'] + size['width']), int(location['y'] + size['height']))
34     # 截屏
35     browser.save_screenshot('screen.png')
36     # 打开截图
37     i = Image.open('screen.png')
38     # 使用Image的crop函数,从截图中再次截取我们需要的区域
39     verify_code_image = i.crop(coordinates)
40     # 保存验证码图片
41     verify_code_image.save('captcha.png')
42     # 使用云打码识别验证码
43     captcha_code = use_ydm('captcha.png')
44     # 输入验证码
45     captcha.send_keys(captcha_code)
46     # 点击登录
47     browser.find_element_by_xpath('/html/body/div/div/div[2]/div/div/div/form/input').click()
48     sleep(3)
49     # 退出
50     browser.close()
51 
52 
53 if __name__ == '__main__':
54     login(账号,密码)

猜你喜欢

转载自www.cnblogs.com/TM0831/p/9782858.html