您现在的位置是:首页 >技术交流 >网络爬虫--selenium动态网页爬虫网站首页技术交流

网络爬虫--selenium动态网页爬虫

等待的树 2023-06-12 08:00:03
简介网络爬虫--selenium动态网页爬虫

动态网页爬虫

什么是动态网页爬虫和AJAX技术:

  1. 动态网页,是网站在不重新加载的情况下,通过ajax技术动态更新网站中的局部数据。比如拉勾网的职位页面,在换页的过程中,url是没有发生改变的,但是职位数据动态的更改了。
  2. AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML。前端与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的在传输数据格式方面,使用的是XML语法。因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS,将数据渲染到了浏览器中,在右键->查看网页源代码还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。

动态网页爬虫的解决方案:

  1. 直接分析ajax调用的接口。然后通过代码请求这个接口。
  2. 使用Selenium+chromedriver模拟浏览器行为获取数据。

selenium和chromedriver:

使用selenium关闭浏览器:

  1. driver.close():关闭当前的页面。
  2. driver.quit():关闭整个浏览器。
  3. driver.flush():刷新整个浏览器。

selenium定位元素:

要注意,find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素。

from time import sleep

from selenium import webdriver
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)  #不自动关闭浏览器
    driver=webdriver.Chrome(executable_path="~/Downloads/chromedriver_mac_arm64/chromedriver", options=options)

# driver = webdriver.Chrome() # 将chromedriver文件放入此目录下,可以不穿入驱动文件的目录

driver.get("https://www.baidu.com")

inputTag = driver.find_element(By.ID, "kw")
inputTags = driver.find_elements(By.CLASS_NAME, "s_ipt")[0]
print(inputTags)
inputTag = driver.find_element(By.TAG_NAME, "input")
inputTag = driver.find_element(By.XPATH, "//input[@id='kw']")
inputTag = driver.find_element(By.ID, 'kw')

selenium表单操作:

  1. webelement.send_keys:给输入框填充内容。
  2. webelement.click:点击。
  3. 操作select标签:需要首先用from selenium.webdriver.support.ui import Select来包装一下选中的对象,才能进行select选择:
    • select_by_index:按索引进行选择。
    • select_by_value:按值进行选择。
    • select_by_visible_text:按照可见文本进行选择。
def run_webdriver():
   options = webdriver.ChromeOptions()
   options.add_experimental_option('detach', True)  #不自动关闭浏览器
   driver=webdriver.Chrome(executable_path="/Users/dengdai/Downloads/chromedriver_mac_arm64/chromedriver", options=options)
   driver.get('https://www.baidu.com')
   # inputTag = driver.find_element(By.NAME, 'wd')
   # inputTag = driver.find_element(By.XPATH, '//input[@id="kw"]')
   inputTag = driver.find_element(By.CSS_SELECTOR, '#form #kw')
   inputTag.send_keys("python")
   sleep(4)
   driver.quit()

click方法做点击:

# 豆瓣网站相关的测试代码,主要用来验证checkbox的:
driver.get("https://accounts.douban.com/passport/login_popup?login_source=anony")
checkbox = driver.find_element(By.NAME, "remember")
checkbox.click()

selenium行为链:

有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类selenium.webdriver.common.action_chains.ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件。那么示例代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.zhihu.com/signin?next=%2F")
actions = ActionChains(driver)
usernameTag = driver.find_element(By.NAME, "username")
passwordTag = driver.find_element(By.NAME, "password")
submitBtn = driver.find_element(By.CLASS_NAME, "SignFlow-submitButton")

actions.move_to_element(usernameTag)
actions.send_keys_to_element(usernameTag,"18888888888")
actions.move_to_element(passwordTag)
actions.send_keys_to_element(passwordTag,"xxxxxx")
actions.move_to_element(submitBtn)
actions.click(submitBtn)
actions.perform()
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。