动态网页爬虫
什么是动态网页爬虫和AJAX技术:
- 动态网页,是网站在不重新加载的情况下,通过ajax技术动态更新网站中的局部数据。比如拉勾网的职位页面,在换页的过程中,url是没有发生改变的,但是职位数据动态的更改了。
- AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML。前端与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用Ajax)如果需要更新内容,必须重载整个网页页面。因为传统的在传输数据格式方面,使用的是XML语法。因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS,将数据渲染到了浏览器中,在右键->查看网页源代码还是不能看到通过ajax加载的数据,只能看到使用这个url加载的html代码。
动态网页爬虫的解决方案:
- 直接分析ajax调用的接口。然后通过代码请求这个接口。
- 使用Selenium+chromedriver模拟浏览器行为获取数据。
selenium和chromedriver:
使用selenium关闭浏览器:
- driver.close():关闭当前的页面。
- driver.quit():关闭整个浏览器。
- 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表单操作:
- webelement.send_keys:给输入框填充内容。
- webelement.click:点击。
- 操作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()