什么是动态网页爬虫和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():关闭整个浏览器。
示例:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
print(driver.page_source)
driver.close()
selenium定位元素:
- find_element_by_id:根据id来查找某个元素。
- find_element_by_class_name:根据类名查找元素。
- find_element_by_name:根据name属性的值来查找元素。
- find_element_by_tag_name:根据标签名来查找元素。
- find_element_by_xpath:根据xpath语法来获取元素。
- find_element_by_css_selector:根据css选择器选择元素。
要注意,find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
# InputTag = driver.find_element_by_id('kw') #通过id查找
# InputTag = driver.find_element_by_class_name('s_ipt') #通过类名查找
# InputTag = driver.find_element_by_name('wd') #通过name查找
# InputTag = driver.find_element_by_tag_name('input') #通过标签名查找
# InputTag = driver.find_element_by_xpath('//input[@id="kw"]') #通过标签名查找
InputTag = driver.find_element_by_css_selector('#form #kw') #通过标签名查找
InputTag.send_keys('python')
selenium表单操作:
- webelement.send_keys:给输入框填充内容。
- webelement.click:点击。
- 操作select标签:需要首先用
from selenium.webdriver.support.ui import Select
来包装一下选中的对象,才能进行select