使用PhantomJS+Selenium动态爬取
动态爬取使用PhantomJS+Selenium
很多网站通常会用到Ajax和动态HTML技术,因而只是使用基于静态页面爬取的方法是行不通的。辨别是否是动态网站最简单的方法,浏览器中查看页面相应的内容、当在查看页面源代码时找不到该内容时就可以确定该页面使用了动态技术。
环境搭建
安装Selenium,pip install selenium
下载phantomjs,解压然后在调用时执行路径executable_path上写上phantomjs.exe所在的路径即可(见下面示例)。
下载chromedriver.exe,使用WebDriver在Chrome浏览器上进行测试时,需要从http://chromedriver.storage.googleapis.com/index.html网址中下载与本机chrome浏览器对应的驱动程序,驱动程序名为chromedriver。下载后把文件解压,然后放到本机chrome浏览器文件路径里,如:C:\ProgramFiles (x86)\Google\Chrome\Application
chromedriver的版本需要和本机的chrome浏览器对应,才能正常使用
chromedriver | Chrome版本 | chromedriver | Chrome版本 |
v2.33 | v60-62 | v2.18 | v43-46 |
v2.32 | v59-61 | v2.17 | v42-43 |
v2.31 | v58-60 | v2.13 | v42-45 |
v2.30 | v58-60 | v2.15 | v40-43 |
v2.29 | v56-58 | v2.14 | v39-42 |
v2.28 | v55-57 | v2.13 | v38-41 |
v2.27 | v54-56 | v2.12 | v36-40 |
v2.26 | v53-55 | v2.11 | v36-40 |
v2.25 | v53-55 | v2.10 | v33-36 |
v2.24 | v52-54 | v2.9 | v31-34 |
v2.23 | v51-53 | v2.8 | v30-33 |
v2.22 | v49-52 | v2.7 | v30-33 |
v2.21 | v46-50 | v2.6 | v29-32 |
v2.20 | v43-48 | v2.5 | v29-32 |
v2.19 | v43-47 | v2.4 | v29-32 |
爬取百度搜索页面
# coding=utf-8 import time from selenium import webdriver from selenium.webdriver.common.keys import Keys url = 'https://www.baidu.com/' # 下面两个driver都可以,使用Chrome会更直观些 # driver = webdriver.Chrome() driver = webdriver.PhantomJS(executable_path='C:\***\phantomjs-2.1.1-windows\\bin\phantomjs.exe') # 等待响应1秒,不然可能因为网速等问题获取不到element driver.implicitly_wait(1) driver.get(url) print driver.title # 找到输入框的元素 elem = driver.find_element_by_name("wd") # 清空输入框里的内容 elem.clear() # 在输入框中输入查询的内容 elem.send_keys(u"东南大学") # 在输入框中输入回车键,keys支持多个键输入,可查看doc elem.send_keys(Keys.RETURN) # 也可以使用这种方法睡眠等待 # time.sleep(3) ''' 多种匹配规则,在实际应用中可以根据实际情况使用 ''' # 找出该页面的所有搜索结果的标题 titles = driver.find_elements_by_xpath('//h3') for title in titles: print title.text # 找前5个搜索结果的标题 for i in range(1, 6): title = driver.find_element_by_id(str(i)) print title.find_element_by_tag_name('h3').text driver.close()
爬取肯德基门店信息
选城市,才会出现一些门店信息,但是在HTML源码中,没有门店的字段信息,需要我们动态爬取。
# coding=utf-8 from selenium import webdriver import selenium.webdriver.support.ui as ui import time url = 'http://www.kfc.com.cn/kfccda/storelist/index.aspx' # driver = webdriver.PhantomJS(executable_path='C:\***\phantomjs-2.1.1-windows\\bin\phantomjs.exe') # 也可以使用Chrome驱动,区别在于有无界面的显示 driver = webdriver.Chrome() driver.get(url) # 这里不使用driver.implicitly_wait(1)或time.sleep(3) wait = ui.WebDriverWait(driver, 10) # 找到选城市按钮 btn = driver.find_element_by_xpath( '//*[@id="container"]/div[1]/div[2]/div/div[1]/div[1]/div/div[1]/a[2]') btn.click() # 点击 # 找到南京 nj = driver.find_element_by_xpath('//*[@id="n_c"]/div/a[2]') nj.click() # 点击 for i in range(1, 5): wait.until(lambda driver: driver.find_element_by_xpath( '//*[@id="listhtml"]/tr[2]/td[1]')) shopName = driver.find_element_by_xpath( "//*[@id='listhtml']/tr[" + str(i + 1) + "]/td[1]").text shopAddress = driver.find_element_by_xpath( "//*[@id='listhtml']/tr[" + str(i + 1) + "]/td[2]").text print shopName print shopAddress driver.close()
这里使用ui.WebDriverWait(driver, 10),为了解决NoSuchElementException: Message: Unable to locate element
同样是元素点击后有延迟,WebDriverWait(driver,10)的意思是;10秒内每隔500毫秒扫描1次页面变化,当出现指定的元素后结束。
模拟登陆
使用Selenium完全可以模拟人的各种操作,当然也可以登陆了,下面写个例子试一下。
# coding:utf8 import time from selenium import webdriver url = 'https://passport.****.net/account/login' driver = webdriver.Chrome() # 这里为了直观使用Chrome driver driver.get(url) time.sleep(1) # 使用账号密码登陆 btn = driver.find_element_by_xpath('/html/body/div[3]/div/div/div[2]/div/h3/a') btn.click() time.sleep(1) # 找到用户名并输入 username = driver.find_element_by_xpath('//*[@id="username"]') username.clear() username.send_keys("your account") # 找到密码框并输入 password = driver.find_element_by_xpath('//*[@id="password"]') password.clear() password.send_keys("your password") # 点击登陆 loginbtn = driver.find_element_by_xpath('//*[@id="fm1"]/input[8]') loginbtn.click()