V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
CicadaMan
V2EX  ›  Python

Selenium+PhantomJS 加载 ajax 数据

  •  
  •   CicadaMan · 2017-07-20 22:18:38 +08:00 · 3256 次点击
    这是一个创建于 2681 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如今的网站有两种。一种是同步加载的。另一种是异步加载的,也即我们常说的用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/或者关注本公众号找我索要教程:

    # 导入 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)
    
            # 获取点击加载更多的按钮
            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 一起学习交流!

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1011 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:12 · PVG 06:12 · LAX 14:12 · JFK 17:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.