[python爬虫之路day16]:基于爬虫的selenium库的使用,用以获取ajax数据

声明:
############此处非原创,来源B站UP主神奇的老黄的分享#####################
AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML。除过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。
这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的在传输数据格式方面,使用的是XML语法。因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS,将数据渲染到了浏览器中,在右键->查看网页源代码还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。

##获取ajax数据的方式:

  1. 直接分析ajax调用的接口。然后通过代码请求这个接口。
  2. 使用Selenium+chromedriver模拟浏览器行为获取数据。
  3. | 方式 | 优点 | 缺点 |
    | -------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
    | 分析接口 | 直接可以请求到数据。不需要做一些解析工作。代码量少,性能高。 | 分析接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。 |
    | selenium | 直接模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到。爬虫更稳定。 | 代码量多。性能低。 |

Selenium+chromedriver获取动态数据:

Selenium相当于是一个机器人。可以模拟人类在浏览器上的一些行为,自动处理浏览器上的一些行为,比如点击,填充数据,删除cookie等。chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver:

  1. Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
  2. Firefox:https://github.com/mozilla/geckodriver/releases
  3. Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
  4. Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
    ##############################声明结束##################################
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()

  1. 选择select:select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专门为select标签提供了一个类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')#保存图片
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章