您的位置:首页 > Web前端 > JavaScript

爬虫------Selenium与PhantomJS无页面浏览器

2018-05-23 08:56 344 查看
Selenium(http://www.seleniumhq.org/)是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作
文档地址:http://selenium-python.readthedocs.io/index.html
Selenium的安装:Python3中用命令安装:sudo pip3 install selenium
PhantomJS(http://phantomjs.org/) 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。
安装方法:sudo apt-get install phantomjs查看phantomjs的安装位置: which phantomjs
使用命令命令下载和安装chrome
命令一:sudo apt-get install libxss1 libappindicator1 libindicator7
命令二:wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
命令三:sudo dpkg -i google-chrome*.deb
from selenium import webdriver
调用环境变量指定的PhantomJS浏览器创建浏览器对象:driver = webdriver.Chrome()
如果没有在环境变量指定PhantomJS((executable_path=/usr/bin/phantomjs)位置
get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择
driver.get("https://www.baidu.com/")
打印页面标题 "百度一下,你就知道:print(driver.title)
生成当前页面快照并保存:driver.save_screenshot("baidu.png")
往输id为kw入框输入女优:driver.find_element_by_id("kw").send_keys("女优")
自动点击搜索:driver.find_element_by_id("su").click()
睡眠一会等待点击反应:time.sleep
保存图片(快照):driver.save_screenshot("女优.png")
获得网页源码:driver.page_soucre
得到所以的cookie:print(driver.get_cookies())
模拟键盘from selenium.webdriver.common.keys import Keys
CONTROL控制,Keys.CONTROL控制键
data = driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"a")
Ctrl+x:剪切
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"x")
按回车键
driver.find_element_by_id("kw").send_keys(Keys.RETURN)
关于元素的选取,有如下的API 单个元素选取
find_element_by_id
find_element_by_name("user-name")# 获取name标签值
find_element_by_xpath("//input[@id='passwd-id']")# 也可以通过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
通过By方法获取元素
from selenium.webdriver.common.by import By
lement = driver.find_element(by=By.ID, value="coolestWidgetEvah")
cheeses = driver.find_elements(By.CLASS_NAME, "cheese")
frame = driver.find_element(By.TAG_NAME, "iframe")
cheese = driver.find_element(By.NAME, "cheese")
cheese = driver.find_element(By.LINK_TEXT, "cheese")cheese链接内容
inputs = driver.find_elements(By.XPATH, "//input")
循环两个范围相同的并列的数据可以使用元素对的方式(zip)的方式进行循环zip
for number,title in zip(numbers,titles):
print("直播观看人数:%s\t\t房间名称:%s" % (number.get_text().strip(),title.get_text().strip()))
Chrome谷歌无界面浏览器
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chrome_options)
js = "var q=document.getElementById(\"kw\");q.style.border=\"2px solid red\";"
# 调用给搜索输入框标红js脚本
执行JavaScript语句:driver.execute_script(js)
1.Explicit Waits(显示等待)
显示等待的代码定义了等待条件,只有该条件触发,才执行后续代码。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()driver.get("http://somedomain/url_that_delays_loading")
wait = WebDriverWait(driver, 10)
try:    
element = wait .until(EC.presence_of_element_located((By.ID,"myDynamicElement")))
finally:    
    driver.quit()
# 判断是否真正切换到对应的页面---判断是否高亮显示
wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,"#mainsrp-pager > div > div > div > ul.items > li.item.active"),str(page)))
2.Implicit Waits(隐式等待)
隐式等待是在尝试发现某个元素的时候,如果没能立刻发现,就等待固定长度的时间。
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
鼠标动作链:导入 ActionChains 类from selenium.webdriver import ActionChains
鼠标移动到 ac 位置
ac = driver.find_element_by_xpath('element')
ActionChains(driver).move_to_element(ac).perform()
# 在 ac 位置单击
ac = driver.find_element_by_xpath("elementA")
ActionChains(driver).move_to_element(ac).click(ac).perform()
# 在 ac 位置双击
ac = driver.find_element_by_xpath("elementB")
ActionChains(driver).move_to_element(ac).double_click(ac).perform()
# 在 ac 位置右击
ac = driver.find_element_by_xpath("elementC")
ActionChains(driver).move_to_element(ac).context_click(ac).perform()
# 在 ac 位置左键单击hold住
ac = driver.find_element_by_xpath('elementF')
ActionChains(driver).move_to_element(ac).click_and_hold(ac).perform()
# 将 ac1 拖拽到 ac2 位置
ac1 = driver.find_element_by_xpath('elementD')
ac2 = driver.find_element_by_xpath('elementE')
ActionChains(driver).drag_and_drop(ac1, ac2).perform() 阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: