前几天写的《Python实例:分析豆瓣影片评论Ver 1.0版本》文章中,关于爬取数据过频繁导致IP被封禁的事情让我对豆瓣数据的爬取中断了。忽然想到之前有写过关于关于使用selenium库的webdriver来模拟用户的操作。那今天不妨试试使用selenium来模拟用户使用浏览器登陆豆瓣吧。
首先需要导入的库有
1 2 3 4 5 |
import urllib.request from selenium import webdriver from PIL import Image import re import time |
定义登陆账号的url,还有输入账号信息
1 2 3 |
url = 'http://accounts.douban.com/login' email = input('E-mail:') password = input('Password:') |
使用无窗口浏览器PhantomJS登陆:
1 2 |
browser = webdriver.PhantomJS() browser.get(url) |
通过 send_keys() 将账号和密码传入浏览器账号密码输入框:
1 2 |
browser.find_element_by_name('form_email').send_keys(email) browser.find_element_by_name('form_password').send_keys(password) |
获取验证码图片保存到本地并自动打开方便查看。需要注意的是,打开图片后,好像需要将图片关闭才能继续执行下一步,这个不知道是什么原因。不过好在,这没什么大碍。
1 2 3 |
captcha_link = browser.find_element_by_id('captcha_image').get_attribute('src') urllib.request.urlretrieve(captcha_link,'captcha.jpg') Image.open('captcha.jpg').show() |
填写图片验证码,然后将验证码传入:
1 2 |
captcha_code = input('Pls input captcha code:') browser.find_element_by_id('captcha_field').send_keys(captcha_code) |
模拟用户点击登陆按钮:
1 |
browser.find_element_by_name('login').click() |
因为登录页登录成功后浏览器会自动跳转到豆瓣首页。所以可以通过这个逻辑判断是否登录成功:
1 2 3 4 5 6 |
if browser.current_url == 'https://www.douban.com/': print('login success!') print('Now jump to %s ...' % browser.current_url) else: print('login error!') quit() |
以上。模拟登陆的步骤就算是完成了。当然,你也可以在期间 print 一些进度信息,告知用户当前程序执行的进度。
讲真,使用selenium的速度真心不行,如果不是特殊要求,实在是不建议使用这个方式登录。
不过它的好处就是,可以完美的实现用户所有的操作,速度虽然慢,但是数据全,不丢失。
文末,附上完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#coding:utf-8 import urllib.request from selenium import webdriver from PIL import Image import re import time url = 'http://accounts.douban.com/login' email = input('E-mail:') password = input('Password:') browser = webdriver.PhantomJS() browser.get(url) #get page source #page_source = browser.page_source #send account key print('writing username and password...') browser.find_element_by_name('form_email').send_keys(email) browser.find_element_by_name('form_password').send_keys(password) #get captcha link and save to local print('saving captcha image...') captcha_link = browser.find_element_by_id('captcha_image').get_attribute('src') urllib.request.urlretrieve(captcha_link,'captcha.jpg') Image.open('captcha.jpg').show() captcha_code = input('Pls input captcha code:') browser.find_element_by_id('captcha_field').send_keys(captcha_code) print('login...') browser.find_element_by_name('login').click() time.sleep(3) if browser.current_url == 'https://www.douban.com/': print('login success!') print('Now jump to %s ...' % browser.current_url) else: print('login error!') quit() # visit book tag url and get page source book_tag_url = 'https://book.douban.com/tag/' browser.get(book_tag_url) page_source = browser.page_source reg_tag = r'href=\"/tag/(.*?)\"' tag_list = re.findall(reg_tag, page_source) print(tag_list) browser.quit() |