<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 数据抓取
使用Selenium操纵浏览器
王成军 
wangchengjun@nju.edu.cn
计算传播网 http
Step1:  PhantomJS
PhantomJS是一个而基于WebKit的服务端JavaScript API,支持Web而不需要浏览器支持，其快速、原生支持各种Web标准：Dom处理，CSS选择器，JSON等等。PhantomJS可以用用于页面自动化、网络监测、网页截屏，以及无界面测试
声明浏览器对象
上面我们知道了selenium支持很多的浏览器，但是如果想要声明并调用浏览器则需要：
https
Step2:  访问页面
Step3:  查找元素
单个元素查找
Step4:  这里我们通过三种不同的方式去获取响应的元素，第一种是通过id的方式，第二个中是CSS选择器，第三种是xpath选择器，结果都是相同的。
常用的查找元素方法：
find_element_by_name
find_element_by_id
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
Step5:  多个元素查找
其实多个元素和单个元素的区别，举个例子：find_elements,单个元素是find_element,其他使用上没什么区别，通过其中的一个例子演示：
Step6:  当然上面的方式也是可以通过导入from selenium.webdriver.common.by import By 这种方式实现
lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')
同样的在单个元素中查找的方法在多个元素查找中同样存在：
- find_elements_by_name
- find_elements_by_id
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
元素交互操作
对于获取的元素调用交互方法
Step7:  运行的结果可以看出程序会自动打开Chrome浏览器并打开淘宝输入ipad,然后删除，重新输入MacBook pro，并点击搜索
Selenium所有的api文档：http
Step8:  获取元素属性
get_attribute('class')
Step9:  获取文本值
text
Step10:  获取ID，位置，标签名
id
location
tag_name
size
Step11:  一个例子
<ASSISTANT_TASK:>
Python Code:
from selenium import webdriver
help(webdriver) 
Explanation: 数据抓取
使用Selenium操纵浏览器
王成军 
wangchengjun@nju.edu.cn
计算传播网 http://computational-communication.com
selenium 是一套完整的web应用程序测试系统，包含了
- 测试的录制（selenium IDE）
- 编写及运行（Selenium Remote Control）
- 测试的并行处理（Selenium Grid）。
Selenium的核心Selenium Core基于JsUnit，完全由JavaScript编写，因此可以用于任何支持JavaScript的浏览器上。selenium可以模拟真实浏览器，自动化测试工具，支持多种浏览器，爬虫中主要用来解决JavaScript渲染问题。https://www.cnblogs.com/zhaof/p/6953241.html
Webdriver
用python写爬虫的时候，主要用的是selenium的Webdriver，我们可以通过下面的方式先看看Selenium.Webdriver支持哪些浏览器
End of explanation
#browser = webdriver.Firefox() # 打开Firefox浏览器
browser = webdriver.Chrome() # 打开Chrome浏览器
Explanation: PhantomJS
PhantomJS是一个而基于WebKit的服务端JavaScript API,支持Web而不需要浏览器支持，其快速、原生支持各种Web标准：Dom处理，CSS选择器，JSON等等。PhantomJS可以用用于页面自动化、网络监测、网页截屏，以及无界面测试
声明浏览器对象
上面我们知道了selenium支持很多的浏览器，但是如果想要声明并调用浏览器则需要：
https://pypi.org/project/selenium/
End of explanation
from selenium import webdriver
browser = webdriver.Chrome()
 
browser.get("http://www.baidu.com") 
print(browser.page_source)
#browser.close() 
Explanation: 访问页面
End of explanation
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.taobao.com")
input_first = browser.find_element_by_id("q")
input_second = browser.find_element_by_css_selector("#q")
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first)
print(input_second)
print(input_third)
browser.close()
Explanation: 查找元素
单个元素查找
End of explanation
# 下面这种方式是比较通用的一种方式：这里需要记住By模块所以需要导入
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get("http://www.taobao.com")
input_first = browser.find_element(By.ID,"q")
print(input_first)
browser.close()
Explanation: 这里我们通过三种不同的方式去获取响应的元素，第一种是通过id的方式，第二个中是CSS选择器，第三种是xpath选择器，结果都是相同的。
常用的查找元素方法：
find_element_by_name
find_element_by_id
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
End of explanation
browser = webdriver.Chrome()
browser.get("http://www.taobao.com")
lis = browser.find_elements_by_css_selector('.service-bd li')
print(lis)
browser.close() 
Explanation: 多个元素查找
其实多个元素和单个元素的区别，举个例子：find_elements,单个元素是find_element,其他使用上没什么区别，通过其中的一个例子演示：
End of explanation
from selenium import webdriver
import time
browser = webdriver.Chrome()
browser.get("http://www.taobao.com")
#browser.get("http://www.taobao.com")
input_str = browser.find_element_by_id('q')
input_str.send_keys("ipad")
time.sleep(3)
input_str.clear()
input_str.send_keys("MacBook pro")
button = browser.find_element_by_class_name('btn-search')
button.click()
Explanation: 当然上面的方式也是可以通过导入from selenium.webdriver.common.by import By 这种方式实现
lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')
同样的在单个元素中查找的方法在多个元素查找中同样存在：
- find_elements_by_name
- find_elements_by_id
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
元素交互操作
对于获取的元素调用交互方法
End of explanation
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.zhihu.com/explore")
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')
Explanation: 运行的结果可以看出程序会自动打开Chrome浏览器并打开淘宝输入ipad,然后删除，重新输入MacBook pro，并点击搜索
Selenium所有的api文档：http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains
执行JavaScript
这是一个非常有用的方法，这里就可以直接调用js方法来实现一些操作，
下面的例子是通过登录知乎然后通过js翻到页面底部，并弹框提示
End of explanation
browser.get("http://www.zhihu.com/explore")
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
print(logo.get_attribute('class'))
Explanation: 获取元素属性
get_attribute('class')
End of explanation
browser.get("http://www.zhihu.com/explore")
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)
Explanation: 获取文本值
text
End of explanation
browser.get("http://www.zhihu.com/explore")
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)
Explanation: 获取ID，位置，标签名
id
location
tag_name
size
End of explanation
from selenium import webdriver
# import selenium.webdriver.support.ui as ui
browser = webdriver.Chrome()
browser.get("https://www.privco.com/home/login") #需要翻墙打开网址
username = 'wangchj04@126.com'
password =  'CityUniversityHK'
browser.find_element_by_id("username").clear()
browser.find_element_by_id("username").send_keys(username) 
browser.find_element_by_id("password").clear()
browser.find_element_by_id("password").send_keys(password)
browser.find_element_by_css_selector("#login-form > div:nth-child(5) > div > button").click()
# url = "https://www.privco.com/private-company/329463"
def download_excel(url):
    browser.get(url)
    name = url.split('/')[-1]
    title = browser.title
    source = browser.page_source
    with open(name+'.html', 'w') as f:
        f.write(source)
    try:
        soup = BeautifulSoup(source, 'html.parser')
        url_new = soup.find('span', {'class', 'profile-name'}).a['href']
        url_excel = url_new + '/export'
        browser.get(url_excel)
    except Exception as e:
        print(url, 'no excel')
        pass
        
    
urls = [ 'https://www.privco.com/private-company/1135789',
        'https://www.privco.com/private-company/542756',
        'https://www.privco.com/private-company/137908',
        'https://www.privco.com/private-company/137138']
for k, url in enumerate(urls):
    print(k)
    try:
        download_excel(url)
    except Exception as e:
        print(url, e)
Explanation: 一个例子
End of explanation
<END_TASK>