PhantomJS+selenium模拟登陆与爬取信息

Python 2.7.15

PhantomJS是一个无界面的,可脚本编程的WebKit浏览器引擎。它原生支持多种web 标准:DOM 操作,CSS选择器,JSON,Canvas 以及SVG。
selenium主要是用来做自动化测试,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题,模拟浏览器进行网页加载。
当我们要爬取页面有大量的JS渲染的时候,使用PhantomJS+selenium可以使我们不用去寻找和摸索我们需要的josn文件然后再想方设法的获取我们想要的信息,selenium可以模拟真实的用户操作,使浏览器加载出我们想要的东西,从而使它们出现在网页源码里。

这里我们以人民微博为例

声明浏览器对象

from selenium import webdriver
webdriver可以认为是浏览器的驱动器,要让代码能够驱动浏览器就必须用到webdriver,webdriver支持多种浏览器,如果不习惯PhantomJS可以用我们平常的浏览器,这里以Chrome为例
driver = webdriver.Chrome()

访问页面并获取网页html

driver.get(“http://t.people.com.cn/indexV3.action”)

首先,我们需要登录。
点击用户名输入框,输入用户名;点击密码输入框,输入密码。

username = driver.find_element_by_xpath("//input[@name='userName']").send_keys("17332336017")
password = driver.find_element_by_xpath("//input[@id='password_text']").click()
# js="document.getElementById('password_text').style.display='block';"
# driver.execute_script(js)
newpassword = driver.find_element_by_xpath("//input[@id='password']").send_keys("1234567890")
driver.find_element_by_xpath("//input[@type='submit']").click()
print'登录成功'

查找元素的方法很多,我用的by_xpath,然后使用send_keys方法向输入框中输入用户名。
密码框比较麻烦,当你使用send_keys时,相当于你用鼠标点击了一下输入框,此时这个框的代码发生了变化:
PhantomJS+selenium模拟登陆与爬取信息_第1张图片
PhantomJS+selenium模拟登陆与爬取信息_第2张图片
代码里有两个密码框,在点击之前上面那个id='password’的是不可见的,display:none。下面那个id='password_text’是可见的,display:inline-block。
点击后,这两个密码框的display属性换了,
这意味着这个id='password_text’的框在你点击一下之后变成不可见的了,selenium找不到它,所以我们要获取id='password’的密码框才能成功输入密码。
然后就是找到登录并点击。

登录成功后就是加载我们需要的信息了,使用selenium模拟下拉和点击,使我们要爬取的信息出现在网页源码里。
人民微博的网页下拉到底三次才会加载出全部网页,加载完后就是回到顶部一一点击评论,将评论加载出来,最后从网页源码里抓取。

#-- coding:UTF - 8 - -
from selenium import webdriver
import time

def gettags(driver) :
    tags = driver.find_elements_by_xpath("//a[@data-nodetype='btn_comment']")
    for tag in tags:
        tag.click()
def down(driver):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)
def get(driver):
    down(driver)
    down(driver)
    down(driver)
    driver.execute_script("window.scrollTo(0,0);")
    gettags(driver)
    comms = driver.find_elements_by_xpath("//div[@class='comment_text skin_color_01']")
    f = open('comment.txt', 'a+')
    for comm in comms:
        a = comm.text
        b = a.encode("gbk")
        f.write(b)
        f.write("\n")
        print a
    f.close()
    try:
        driver.find_element_by_xpath("//a[@class='wbp_pagelist_nextbtn']").click()
        time.sleep(4)
        get(driver)
    except:
        exit()

# driver = webdriver.PhantomJS("E:\phantomjs-2.1.1-windows\bin\phantomjs.exe")
driver = webdriver.Chrome()
driver.get("http://t.people.com.cn/indexV3.action")
time.sleep(2)
username = driver.find_element_by_xpath("//input[@name='userName']").send_keys("17332336017")
password = driver.find_element_by_xpath("//input[@id='password_text']").click()
# js="document.getElementById('password_text').style.display='block';"
# driver.execute_script(js)
newpassword = driver.find_element_by_xpath("//input[@id='password']").send_keys("1234567890")
driver.find_element_by_xpath("//input[@type='submit']").click()
print'登录成功'
time.sleep(2)
get(driver)

你可能感兴趣的:(PhantomJS+selenium模拟登陆与爬取信息)