Python爬⾍-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():关闭整个浏览器。
selenium定位元素:
1. find_element_by_id:根据id来查某个元素。
2. find_element_by_class_name:根据类名查元素。
3. find_element_by_name:根据name属性的值来查元素。
4. find_element_by_tag_name:根据标签名来查元素。
5. find_element_by_xpath:根据xpath语法来获取元素。
6. find_element_by_css_selector:根据css选择器选择元素。
要注意,find_element是获取第⼀个满⾜条件的元素。find_elements是获取所有满⾜条件的元素。
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:按照可见⽂本进⾏选择。
selenium⾏为链:
有时候在页⾯中的操作可能要有很多步,那么这时候可以使⽤⿏标⾏为链类selenium.webdrivermon.action_chains.ActionChains来完成。⽐如现在要将⿏标移动到某个元素上并执⾏点击事件。那么⽰例代码如下:
inputTag = driver.find_element_by_id('kw')
submitTag = driver.find_element_by_id('su')
actions = ActionChains(driver)
actions.send_keys_to_element(inputTag,'python')
actions.click(submitTag)
actions.perform()
还有更多的⿏标相关的操作。
click_and_hold(element):点击但不松开⿏标。
context_click(element):右键点击。
double_click(element):双击。
下⾯是B站的登录和拖拉验证滑条。
下⾯是键盘操作
设置浏览器的参数是在定义driver的时候设置chrome_options参数,该参数是⼀个Options类所实例化的对象。
其中的参数是设置浏览器是否可视化和请求头等信息。
浏览器多窗⼝切换是在同⼀个浏览器中切换不同的⽹页窗⼝。
js获取json的key和valueSelenium提供了⼀些延时功能
隐形等待是在⼀个设定的时间内检测⽹页是否加载完成,也就是浏览器标签栏的⼩圈不再转才会执⾏下⼀步。
显性等待能够根据判断条件⽽进⾏灵活等待,程序每隔⼀定时间检测⼀次,如果结果和检测条件成⽴了会执⾏下⼀步。显性等待的使⽤涉及多个模块:
By:设置元素定位⽅式。分别是ID、XPATH、LINK_TEXT、NAME等等。
expected_conditions:验证⽹页元素是否存在。
WebDriverWait的参数说明如下:driver:浏览器对象driver;timeout:超时时间;poll_frequency:检测时间间隔;
ignored_exceptions:忽略的异常。until:条件判断,参数必须为expected_conditions对象。
更多⽅法请参考:
为什么需要⾏为链条?
因为有些⽹站可能会在浏览器端做⼀些验证⾏为是否符合⼈类的⾏为来做反爬⾍。这时候我们就可以使⽤⾏为链来模拟⼈的操作。⾏为链有更多的复杂操作,⽐如双击,右键等,在⾃动化测试中⾮常有⽤。
操作cookie:
1. 获取所有的cookie:
for cookie _cookies():
print(cookie)
2. 根据cookie的key获取value:
value = _cookie(key)
3. 删除所有的cookie:
driver.delete_all_cookies()
4. 删除某个cookie:
driver.delete_cookie(key)
5. 添加cookie:
driver.add_cookie({“name”:”username”,”value”:”abc”})
隐式等待和显式等待:
1. 隐式等待:指定⼀个时间,在这个时间内⼀直会处于等待状态。隐式等待需要使⽤driver.implicitly_
wait。
2. 显式等待:指定在某个时间内,如果某个条件满⾜了,那么就不会再等待,如果在指定的时间内条件都不满⾜,那么就不会再等待
了。显式等待⽤的⽅法是from selenium.webdriver.support.ui import WebDriverWait。⽰例代码如下:
<("kyfw.12306/otn/leftTicket/init?linktypeid=dc")
WebDriverWait(driver,100).until(
<_to_be_present_in_element_value((By.ID,"fromStationText"),"长沙")
)
WebDriverWait(driver,100).until(
<_to_be_present_in_element_value((By.ID,"toStationText"),"北京")
)
btn = driver.find_element_by_id("query_ticket")
btn.click()
打开新窗⼝和切换页⾯:
1. selenium中没有专门的打开新窗⼝的⽅法,是通过ute_script()来执⾏js脚本的形式来打开新窗⼝的。
2. 打开新的窗⼝后driver当前的页⾯依然还是之前的,如果想要获取新的窗⼝的源代码,那么就必须先切换过去。⽰例代码如下:
window.switch_to.window(driver.window_handlers[1])
设置代理:
设置代理通过ChromeOptions来设置,⽰例代码如下:
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=110.52.235.176:9999")
driver = webdriver.Chrome(executable_path="D:\ProgramApp\",chrome_options=options)
<("/ip")
补充:
1. get_property:获取html标签中官⽅写好的属性。
2. get_attribute:获取html标签中官⽅和⾮官⽅的属性。
3. driver.save_screenshoot:获取当前页⾯的截图,有时候请求失败了,那么可以把当前⽹页的截图保存下来,⽅便后期进⾏分析。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论