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