声明:
############此处非原创,来源B站UP主神奇的老黄的分享#####################
AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML。除过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。
这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的在传输数据格式方面,使用的是XML
语法。因此叫做AJAX
,其实现在数据交互基本上都是使用JSON
。使用AJAX加载的数据,即使使用了JS,将数据渲染到了浏览器中,在右键->查看网页源代码
还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。
##获取ajax数据的方式:
Selenium
相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。chromedriver
是一个驱动Chrome
浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:
from selenium import webdriver
import time
driver_path=r"C:\Users\阿吉\AppData\Local\Google\Chrome\chromedriver.exe"
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)#selenium结合chromedriver进行模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为
driver.get('https://www.baidu.com/')#发送请求
print(driver.page_source)#获取源代码
time.sleep(5)
driver.close()#关闭当前网页
driver.quit()#关闭整个网页,退出整个浏览界面
inputTag=driver.find_element_by_id('kw')
inputTag=driver.find_element_by_name('wd')
inputTag=driver.find_element_by_class_name('s_ipt')
inputTag=driver.find_element_by_xpath('//input[@id="kw"]')
inputTag=driver.find_elements_by_css_selector('.quickdelete-wrap > input')[0]#每个element都有对应的#elements以列表形式返回所有的对应值。
inputTag.send_keys('python')
html=etree.HTML(driver.page_source)
##如果只是想查找某一元素,那推荐使用lxml,因为他是用C语言写的,效率高
##如果想对元素进行一些操作,比如给文本输入值,或者点击某个按钮,那就必须使用selenium的方法了。
##1.操作输入框input
from selenium import webdriver
import time
driver_path=r"C:\Users\阿吉\AppData\Local\Google\Chrome\chromedriver.exe"
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)
#表单元素:input button checkbox
使用selenium操作表单元素
driver.get('https://www.baidu.com/')
inputTag=driver.find_element_by_id('kw')
inputTag.send_keys('python')
time.sleep(3)
inputTag.clear()
#2.操作checkbox
from selenium import webdriver
import time
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.douban.com/')
frame1=driver.find_element_by_xpath('//iframe@[style="height: 300px; width: 300px;"]')
driver.switch_to.frame(frame1)
rememberBtn=driver.find_element_by_name('remember')
rememberBtn.click()
selenium.webdriver.support.ui.Select
。将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使用这个对象进行选择了。示例代码如下: from selenium.webdriver.support.ui import Select
# 选中这个标签,然后使用Select创建对象
selectTag = Select(driver.find_element_by_name("jumpMenu"))
# 根据索引选择
selectTag.select_by_index(1)
# 根据值选择
selectTag.select_by_value("http://www.95yueba.com")
根据可视的文本选择
selectTag.select_by_visible_text("95秀客户端")
# 取消选中所有选项
selectTag.deselect_all()
#4. 操作按钮:操作按钮有很多种方式。比如单击、右击、双击等。这里讲一个最常用的。就是点击。直接调用click
函数就可以了。示例代码如下:
inputTag = driver.find_element_by_id('su')
inputTag.click()
#行为链
from selenium import webdriver
import time
from selenium.webdriver.common.action_chains import ActionChains
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com/')
inputTag=driver.find_element_by_id('kw')
submitBin=driver.find_element_by_id('su')
actions=ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'我最帅')
actions.click(submitBin)
actions.perform()
#selenium操作cookie
from selenium import webdriver
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com/')
for cookie in driver.get_cookies():
print(cookie)
获取某个cookie的值,取其name
print('+'*30)
print(driver.get_cookie('delPer'))
#删除cookie
driver.delete_cookie('delPer')
print('+'*30)
print(driver.get_cookie('delPer'))
driver.delete_all_cookies()#删除所有cookie
#页面等待
#现在的网页越来越多采用了 Ajax 技术,这样程序便不能确定何时某个元素完全加载出来了。如果实际页面等待时间过长导致某个dom元素还没出来,但是你的代码直接使用了这个WebElement,那么就会抛出NullPointer的异常。为了解决这个问题。所以 Selenium 提供了两种等待方式:一种是隐式等待、一种是显式等待。
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.douban.com/')
driver.implicitly_wait(10)#隐式等待
driver.find_element_by_id('asdfc')
#显式等待
WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.ID,'asddd'))
)
WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.ID,'anony-nav'))
)
#切换页面,打开多个页面并切换
from selenium import webdriver
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com/')
driver.execute_script("window.open('https://www.douban.com/')")
print(driver.window_handles)
driver.switch_to.window(driver.window_handles[1])#切换到豆瓣
print(driver.current_url)
#虽然窗口切换了新页面,但是driver没有切换,如果是想在代码中切换到新页面,并且做一些爬虫,那么应该使用driver.switch_to.window来切换到指定的窗口,从driver.window_handles中取出具体第几个窗口,driver.window_handles是一个列表,里面是窗口句柄。按照打开页面的顺序存储窗口句柄。
#设置代理IP
from selenium import webdriver
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)
options=webdriver.ChromeOptions()
options.add_argument("--proxy-server-http://115.204.98.134:8118")
driver.get("http://httpbin.org/ip")
#补充
from selenium import webdriver
from selenium.webdriver.remote.webelement import WebElement
driver_path=r"C:\folders\alwaysuse\chromedriver\chromedriver.exe"
driver=webdriver.Chrome(executable_path=driver_path)
driver.get('https://www.baidu.com/')
submitBtn=driver.find_element_by_id('su')
print(type(submitBtn))
print(submitBtn.get_attribute("value"))#百度一下
driver.save_screenshot('baidu.png')#保存图片