如何抓取动态页面

󰃭 2017-05-02

介绍

目前许多网站大量运用 javascript 脚本进行一些页面的处理,这些页面的抓取对爬虫是个挑战。 这类页面的抓取,有到了下面几种方法

  1. 分析页面(firebug/chrome调试工具 等),找到ajax获取的数据源,看是否可以直接发请求获取
  2. 调用无界面依赖的浏览器引擎(headless browser) casperjs,phantomjs 获取最后的页面

第一种方法就不说了,大家自己分析下,主要说下第二种

用 selenium + phantomjs 抓取动态页面

  1. pip 安装 selenium
pip install selenium
  1. phantomjs 下载 下载对应的包安装
  2. 用下面的脚本测试
#!/usr/bin/env python
# coding: utf-8


from selenium import webdriver
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver import ActionChains

from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import bs4 as bs


def main():
    # 设置 user agent
    dcap = dict(DesiredCapabilities.PHANTOMJS)
    dcap['phantomjs.page.settings.userAgent'] = (
        'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0'
    )
    driver = webdriver.PhantomJS(desired_capabilities=dcap)
    
    # 通过主页面获取相关session
    driver.get('http://www.lagou.com')
    driver.get('https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=')

    # 解析页面
    soup = bs.BeautifulSoup(driver.page_source, 'html.parser')
    # 使用 css 选择器
    items = soup.select('.con_list_item')
    
    # 输出招聘信息
    for item in items:
        print('*' * 80)
        print(item['data-company'])
        print(item['data-positionname'])
        print(item['data-salary'])
        # print(item)


if __name__ == '__main__':
    main()