[python爬虫]selenium+PhantomJS模拟登陆

selenium+PhantomJS来做爬虫的话可以做到完全模拟浏览器的操作,就避开了很多后台的通信,过程会简单很多,很多web自动化测试也是用selenium来做的呢,但是这样的缺点就是慢,运行过程中体会很深刻。。。

今天做的依然是模拟登陆扇贝单词,获取某个分类下被热门小组中的成员们收藏次数最多的单词书,比如我需要雅思方面的单词书推荐,那么运行一下代码就可以获得最受欢迎的几本书啦。(扇贝单词虽然可以分类搜索单词书,但是貌似还没有按热门程度排序功能)

需要注意的是要把phantomjs.exe放在我们的代码同级目录下。其中涉及到一些selenium的基本操作,都是很简单的,比如通过class或者xpath找到网页中某个元素,向其中输入一些值,点击某个按键,总之就是完全模拟人在操作浏览器。

直接放上代码:

# -*- coding: utf-8 -*-
"""
Created on Mon May 16 16:38:00 2016

@author: DJ
"""

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import time
from selenium import webdriver

driver =webdriver.PhantomJS(executable_path="phantomjs.exe")
driver.get("https://www.shanbay.com/accounts/login/")
elem_user = driver.find_element_by_xpath('//*[@id="id_username"]') 
elem_user.send_keys('用户名')
elem_pwd = driver.find_element_by_xpath('//*[@id="id_password"]')
elem_pwd.send_keys('密码')
elem_sub = driver.find_element_by_xpath('//*[@id="loginform"]/div[3]/button')
elem_sub.click()

time.sleep(1)
driver.get("https://www.shanbay.com/team/team/")
elem_keyword = driver.find_element_by_xpath('//*[@id="group-form"]/div/input')
elem_keyword.send_keys(u'雅思')
elem_button = driver.find_element_by_xpath('//*[@id="group-form"]/div/button')
elem_button.click()
time.sleep(1)
teams=[]
for team in driver.find_elements_by_class_name('title'):
    if team.get_attribute("href")!=None:
        teams.append(team.get_attribute("href"))
members=[]
for team in teams[:5]:
    driver.get(team)
    for i in range(10):
        member=driver.find_element_by_xpath('//*[@id="team_rank_table"]/tbody/tr['+str(i+1)+']/td[2]/a')
        members.append(member.get_attribute('href'))
bookdic={}
for member in members:
    driver.get(member)
    bookurl=driver.find_element_by_xpath('//*[@id="my-wordbooks-heading"]/h3/small/a')
    bookurl.click()
    time.sleep(1)
    books=driver.find_elements_by_class_name('wordbook-title')
    for book in books:
        title=book.get_attribute('title')
        if title in bookdic:
            bookdic[title]=bookdic[title]+1
        else:
            bookdic[title]=1
retbook=sorted(bookdic.iteritems(), key=lambda d:d[1], reverse = True ) 
for i in range(5):
    print retbook[i][0]
driver.close()
代码中搜索的关键词是雅思,得到的结果是这样的:


50天 征服雅思词汇
IELTS 精选词表
雅思听力词汇王陆807
大学英语六级词汇书
雅思基本词汇——吴建业


OK,功能实现。

不过排名第四的居然是六级词汇,因为我们只是爬取了在雅思小组里的成员们收藏的单词书,这样的方法肯定还是不够准确的。扇贝单词收集的个人信息比较少,实在也没想到别的方法来评估,不过从结果看来还是相当有借鉴价值的,而且,也说明了果然大家都是从六级过来的嘛。。。

你可能感兴趣的:(python)