Python+selenium+自动登录

    最近毕业找工作,遇到一家公司出的题目,要求在运营商、京东、或者淘宝等网站中,挑一个来通过爬虫程序实现登录操作,并在登录后实现一个页面切换和翻页行为。以前上课时候学习的知识已经不够用了,只好自己学习了selenium。在学习了一些知识后整理思路。

    首先登录“www.taobao.com”,这时需要点击“亲,请登录”跳转到登录页面。跳转到的登录页面的一开始是扫码登录,需要选择“密码登录”才会出现账号密码的输入框。然后我们才能对账号和密码输入框进行定位操作,当输入完成我们需要点击登录按钮。

    登录成功后可以进行商品搜索,并对搜索结果进行翻页操作。对的,还有页面切换,完全被我忘记了,所以也没做出来。感觉也是被淘汰的命,不过还是记下来以后自己说不准什么时候还能用上呢,如果能够帮到正好需要解决这个问题的人就更好了。

代码如下:

from selenium import webdriver

from selenium.webdriver.common.by import By

#WebDeriverWait 库负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
#expected_conditions类 负责条件
from selenium.webdriver.support import expected_conditions as EC
#TimeoutException库负责超时异常
from selenium.common.exceptions import TimeoutException
import time
#使用火狐浏览器打开淘宝首页
driver = webdriver.Firefox()
driver.get("https://www.taobao.com")
#等待网页响应
wait = WebDriverWait(driver,10)
#点击跳转到用户登录页面
submit = wait.until(
    EC.presence_of_element_located((By.CSS_SELECTOR,'#J_SiteNavLogin > div.site-nav-menu-hd > div.site-nav-sign > a.h')))
submit.click()
submit = wait.until(
    EC.presence_of_element_located((By.CSS_SELECTOR,'#J_QRCodeLogin > div.login-links > a.forget-pwd.J_Quick2Static')))
submit.click()


#模拟用户输入用户名
elem_name = driver.find_element_by_xpath('//*[@id="TPL_username_1"]')
elem_name.send_keys(u'用户名')
time.sleep(2)
def loading():
    print u'开始登陆'
    try:
        #模拟用户输入密码
        elem_pwd = driver.find_element_by_xpath('//*[@id="TPL_password_1"]') 
        elem_pwd.send_keys(u'密码')
        time.sleep(2)
        #点击登录          
        submit = wait.until(
           EC.presence_of_element_located((By.CSS_SELECTOR,'html.ks-gecko57.ks-gecko.ks-firefox57.ks-firefox body.chl-reg div#page div#content div.content-layout div.login-box-warp div#J_LoginBox.login-box.no-longlogin.module-static div.bd div#J_StaticForm.static-form form#J_Form div.submit button#J_SubmitStatic.J_Submit'))        
        )
        submit.click()
        #判断搜索框是否出现
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR,'#q'))
        )
        #若搜索框出现请求用户输入商品名,否则等待超时进入except循环
        shop = raw_input(u'请输入要搜索商品名字:')
        input.send_keys(u"{}".format(shop))
        #点击搜索按钮        
        submit = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR,"#J_TSearchForm > div.search-button > button"))        
        )
        submit.click()
    except TimeoutException:
        print u'需要验证,请手动验证。'
        time.sleep(10)
        return loading()




#翻页控制功能        
def next_page(page):
    print u'当前是第{}页'.format(page)
    try:
        input = wait.until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > input')) 
        )[0]
        submit = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))    
        )
        #清除这个输入框里的内容
        input.clear()   
        input.send_keys(page)
        submit.click()
        wait.until(
            EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page))    
        )
    except TimeoutException:
        return next_page(page)


if __name__ == "__main__":
    loading()
    for i in range(1,5):

        next_page(i)


代码补充说明:

(1)loading()下的except是前段代码登录时遇到了验证请求,目前我还不淘宝这种滑动验证怎么解,所以让程序暂停10s,这时需要手动拖动滑动验证。

(2)翻页功能有问题,从第三页开始每页都会出现重复操作现象。

(3)其实翻页功能也能通过定位“下一页”选项,然后直接点击之后sleep一会儿就行。

你可能感兴趣的:(python网页爬取)