小生博客:http://xsboke.blog.51cto.com

                        -------谢谢您的参考,如有疑问,欢迎交流

前引:

    当你需要爬取的页面内容在访问页面5秒后才会出现,
    这时使用python的requests模块就很难爬取到你想要的内容了.

    requests和selenium的不同:
        requests是通过模拟http请求来实现浏览网页的
        selenuim是通过浏览器的API实现控制浏览器,从而达到浏览器自动化

    上面说了,selenium是通过控制浏览器实现访问的,但是linux的命令行是不能打开浏览器的,
    幸运的是Chrome和Firefox有一个特殊的功能headless(无头)模式.(就是wujie面模式)
    通过headless模式可以实现在linux命令行控制浏览器。

    接下来要实现的就是在linux命令行界面通过Chrome的headless模式,实现获取访问网页5秒后的内容

一. 环境准备

    1. 安装谷歌浏览器linux版及其依赖包.

        [root@localhost ~]# wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm
        [root@localhost ~]# yum localinstall google-chrome-stable_current_x86_64.rpm --nogpgcheck

    2. 下载selenium连接chrome的驱动程序(要下载和chrome对应的版本).
        [root@localhost ~]# google-chrome --version
        Google Chrome 72.0.3626.109 
        [root@localhost ~]# https://chromedriver.storage.googleapis.com/72.0.3626.69/chromedriver_linux64.zip
        [root@localhost ~]# unzip chromedriver_linux64.zip
        [root@localhost ~]# chmod +x chromedrive

    3.  安装python需要模块
        # beautifulsoup4是一个html,xml解析器
        [root@localhost ~]# pip install beautifulsoup4 selenium

二. 开始实现获取网页5秒后的数据

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import time

from bs4 import BeautifulSoup
from selenium import webdriver

opt = webdriver.ChromeOptions()          # 创建chrome对象
opt.add_argument('--no-sandbox')          # 启用非沙盒模式,linux必填,否则会报错:(unknown error: DevToolsActivePort file doesn't exist)......
opt.add_argument('--disable-gpu')          # 禁用gpu,linux部署需填,防止未知bug
opt.add_argument('headless')          # 把chrome设置成wujie面模式,不论windows还是linux都可以,自动适配对应参数
driver = webdriver.Chrome(executable_path=r'/root/chromedriver',options=opt)    # 指定chrome驱动程序位置和chrome选项
driver.get('https://baidu.com')          # 访问网页
time.sleep(5)           # 等待5秒
content = driver.page_source          # 获取5秒后的页面
soup = BeautifulSoup(content,features='html.parser')    # 将获取到的内容转换成BeautifulSoup对象
driver.close()

print(soup.body.get_text())          # 通过BeautifulSoup对象访问获取到的页面内容