Crawler basics (Dynamic HTML)

Dynamic HTML

"""
基本原理:
	发送请求后、返回页面代码、再页面代码中进行定位使页面更新的部分(例如ajax代码),从中定位更新时 ajax是向服务器以何种方式、发送了什么参数进行更新界面,模拟更新界面的发送方法 向服务器进行发送更新请求,并接收返回数据,对返回数据进行帅选出想要的数据,然后再进行模拟发送,以次循环。
	
1、JS
 - 常用的脚本语言,可收集用户的跟踪数据、不需要重载页面、直接提交表单、在页面嵌入多媒体文件、甚至运行网页
2、jQuery
 - 一种javaScript框架、封装了JavaScript常用的功能代码
3、ajax
 - 使页面实现异步更新,可以在不重载整体的页面的情况下,对网页的某部分进行更新

"""

# 获取ajax数据的方式
#  1、直接分子ajax调用的接口,通过代码请求接口
#  2、使用selenium + chromedrive 模拟浏览器行为获取数据


phantpmjs#  一款无界面的webkit 浏览器,讲网站加载到内存,并执行页面的javasctipt

**# phantomjs 案例**
from selenium import webdriver
driver = webdriver.PhantomJS("安装目录")
driver.get("https://www.baidu.com")
driver.save_screenshot("baidu.png")   # 截图
# 2、定位和操作
driver.find_element_by_id("kw").send_keys("长城")
driver.find_element_by_id("su").click()
# 3、查看请求信息
driver.page_source
driver.get_cookies()
driver.current_url
# 4、退出
driver.quit()   # 退出浏览器




selenium #  一款无界面的webkit 浏览器,讲网站加载到内存,并执行页面的javasctipt

# 安装selenium 
pip install selenium

**# selenium 案例**
from selenium import webdriver
from selenium.webdriver.common.by import By

# 实例化浏览器
driver = webdriver.Chrome()

# 发送请求
driver.get("https://www.baidu.com")

# 打印页面源代码
print(driver.page_source)

# 退出浏览器
driver.quit()

**# 定位元素**
"""
find_element 获取第一个满足条件的元素
find_elements 获取所有满足条件的元素
"""
find_element_by_id   # 根据id 来查找某个元素
submitTag1 = driver.find_element('su')
submitTag1 = driver.find_element(By.ID,'su')

find_element_by_class_name # 根据类名查找元素
submitTag = driver.find_element_by_class_name('su')
submitTag1 = driver.find_element(By.CLASS_NAME,'su')

find_element_by_name  # 根据name属性的值来查找元素
submitTag = driver.find_element_by_name('email')
submitTag1 = driver.fing_elemengt(By.NAME,'email')

find_element_by_tag_name  # 根据标签名来查找元素
 submitTag = driver.find_element_by_tag_name('div')
submitTag1 = driver.find_element(By.TAG_NAME,'div')

find_element_by_xpath 	# 根据xpath语法来获取元素
submitTag = driver.find_element_by_xpath('//div')
submitTag1 = driver.find_element(By.XPATH,'//div')

find_element_by_css_selector # 根据css选择器选择元素
submitTag = driver.find_element_by_css_selector('//div')
submitTag1 = driver.find_element(By.CSS_SELECTOR,'//div')


**# 操作表单元素**
"""
1、找到对应元素
2、使用send_keys(value),讲数据填充进去
"""
 inputTag = driver.find_element_by_id('kw')
 inputTag.send_keys('python')

# 清除输入框中的内容(clear() 方法 )
inputTag.clear()

# 操作checkbox (先选中checbox标签,然后click)
rememberTag = driver.find_element_by_name("rememberMe")
rememberTag.click()

# 获取frame标签内内容
driver.switch_to_frame()  # 用于获取 iframe 标签
driver.switch_to.frame(driver.find_element_by_id('iframe'))

#针对下拉框(选择 select)不能直接点击(点击后还需要选中)
import selenium.webdriver.support.ui import Select
selectTag = Select(driver.find_element_by_class_name('nojs'))

# 下拉框的选择方式
selectTag.select_by_value('JP')  # 根据值来选择
selectTag.select_by_index(2)   # 根据索引引入选择



# **行为链**
"""
页面中有多步操作,可以使用鼠标行为链类 ActionChains 来完成
"""
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.context_click()
actions.click(submitTag)
actions.perform()  # 操作提交

click_and_hold(element) 	# 点击但不松开⿏标。
context_click(element)		# 右键点击。
double_click(element)		# 双击


**# cookie操作**
cookies = driver.get_cookies()   # 获取cookie
value = driver.get_cookie(key)	 # 根据cookie的name获取cookie
driver.delete_cookie('key')   # 删除cookie值


**# 页面等待**
# 隐式等待 :调用driver.implicitly_wait ,在获取不可用元素之前,先等待10秒
driver.implicitly_wait(10)   # 页面元素没加载出来会等待10秒钟


# 显式等待 :表明某个条件成立后才之执行获取元素的操作
selenium.webdriver.support.excepted_conditions		# 期望的条件和
selenium.webdriver.support.ui.WebDriverWait			# 来配合完成

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("https://www.baidu.com/")

try:
	element = WebDriverWait(driver, 10).until(
		EC.presence_of_element_located((By.ID, "myDynamicElement"))   # 等待此条件成立
	)
finally:
driver.quit()

# ⼀些其他的等待条件
presence_of_element_located		#  某个元素已经加载完毕了。
presence_of_all_emement_located	#	⽹⻚中所有满⾜条件的元素都加载完毕了
element_to_be_cliable	#	某个元素是可以点击了


# 打开多窗口和切换页面(selenium 提供 switch_to_wondow 进行切换,切换到的界面可以在driver.window_hanles中找到)
# 打开新页面
driver.execute_script("window.open('url')")
print(driver.current.url)
#切换到新的页面中
driver.switch_to_window(self.driver.window_handles[1])




Published 50 original articles · Likes3 · Visits 1797

Guess you like

Origin blog.csdn.net/weixin_43056654/article/details/104278848