Selenium+PhantomJS加载ajax数据

如今的网站有两种。一种是同步加载的。另一种是异步加载的,也即我们常说的用ajax。对于那种同步加载的网站,普通的爬虫程序轻轻松松的就能搞定。但是对于那种异步请求数据的网站,就不能走寻常路了。对于这种情况,通常的解决方案是使用selenimu+PhantomJS组合来完成。有的童鞋可能还不是很了解这两者之间的关系,接下来做个简单介绍:
1. selenium:是一个web的自动化测试工具,最初是为网站自动化测试而开发的.我们可以通过他使用代码来操作浏览器以及其中的网页元素。selenium支持绝大部分的浏览器,以及类似PhantomJS这种无界面的浏览器。
2. PhantomJS:是一个基于Webkit的“无界面”(headless)浏览器。他除了没有界面,其他功能跟普通浏览器是一样的。也正因为他没有界面,因此运行效率比普通浏览器要高。

PhantomJS安装:

http://phantomjs.org/下载合适自己电脑版本的PhantomJS。然后根据自己的操作系统配置其环境变量。比如mac或者linux,可以把PhantomJS放置在/usr/bin或者/usr/local/bin中。而windows用户也可以在我的电脑->属性->环境变量中配置好PhantomJS所在的路径。

selenium使用介绍:

  1. 安装:sudo pip install selenium
  2. 使用以下代码做个简单介绍.这篇教程不打算对selenium做细节的讲解。如果想要详细了解使用细节,可以访问http://selenium-python.readthedocs.io/或者关注本公众号找我索要教程:
    python
    # 导入webdriver对象
    from selenium import webdriver
    # 初始化PhantomJS浏览器
    driver = webdriver.PhantomJS()
    # 访问百度
    driver.get('http://www.baidu.com/')
    # 获取id为wrapper这个元素的text
    driver.find_element_by_id("wrapper").text
    ...

获取豆瓣热门排行版的电影数据

豆瓣热门电影的数据,不是一次性加载的。而是通过点击加载更多的方式获取更多数据的。因此我们不能使用传统的方式爬数据。这里我们使用selenium+PhantomJS的方式爬取异步加载的电影:

#encoding: utf8

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait


def crawle_movie():
    # 初始化一个webdriver对象,使用的是PhantomJS浏览器
    driver = webdriver.PhantomJS()
    # 获取douban的电影
    driver.get("https://movie.douban.com/")
    # 电影列表
    movie_list = []

    # 点击获取更多电影
    more_btn = driver.find_element_by_class_name('more')

    while True:
        # 截取元素起始位置
        start_index = len(movie_list)
        # xpath字符串。因为点击加载更多后,只需要获取新加载的数据,不需要获取之前的。所以给了一个position
        xpath_str = "//a[@class='item'][position()>%d]" % start_index
        # 通过xpath获取的元素对象
        item_tags = driver.find_elements_by_xpath(xpath_str)
        print 'start_index:',start_index
        print '当前个数:',len(item_tags)
        # 遍历所有的元素对象
        for item_tag in item_tags:
            # 获取电影海报标签
            img_tag = item_tag.find_element_by_tag_name('img')
            # 获取电影海报的src属性对应的值
            cover = img_tag.get_attribute("src")
            # 获取电影海报对应的alt,也即电影名
            title = img_tag.get_attribute("alt")
            # 通过xpath获取评分。注意:要通过xpath获取某个元素下的标签,那么应该前面加.
            rating = item_tag.find_element_by_xpath(".//p/strong").text
            movie = {
                'cover': cover,
                'title': title,
                'rating': rating
            }
            print u'电影名:' + title 
            movie_list.append(movie)
        print '-'*100
        # 获取点击加载更多的按钮
        more_btn = driver.find_element_by_class_name('more')
        # 如果这个按钮有style这个属性,说明是已经达到最后一页了。不能再点击了。这时候就退出
        if more_btn.get_attribute('style'):
            break
        # 模拟加载更多按钮点击
        more_btn.click()

if __name__ == '__main__':
    crawle_movie()

更多Python和爬虫相关知识,可以加群482869582交流哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

资深Python开发工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值