使用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.csdn.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()

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值