为什么会想要做这个模拟登录今日头条呢?因为这个难度偏低,而且用到了图片验证码,所以就想做个模拟登录今日头条练练手。
做这个的难点在于验证码图片的获取,虽然我们能够很轻松的得到验证码图片的链接,但是直接用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(账号,密码)