目录
01 AJAX介绍和爬取ajax数据的两种方式
动态网页数据抓取
什么是AJAX:
AJAX(Asynchronouse JavaScript And XML)异步JavaScript和XML。过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用Ajax)如果需更更新内容,必须重就整个网页页面。因为传统的在传输数据格式方面,使用的是XML语法。因此叫做AJAX,其实现在数据交互基本上都是使用JSON。使用AJAX加载的数据,即使使用了JS,将数据渲染到了浏览器中,通过右键-查看网页源代码还是不能看到通过AJAX加载的数据,只能看到使用这个url的html码。
获取ajax数据的方式:
1、直接分析ajax调用的接口。然后通过代码请求这个接口。
2、使用Selenium+chromedrivert拟浏览器行为获取数据。
方式 | 优点 | 缺点 |
分析接口 | 直接可以请求到数据,不需要做一些解析工作,代码量少,性能高。 | 分析接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。 |
selenium | 直接模拟划览器的行为。浏览器能请求到的,使用selenium也能请求到的。爬虫更稳定。 | 代码量多。性能低。 |
02 selenium+chromedriver安装和入门
Selenium+chromedriver获取动态数据:
Selenius相当于是一个机器人。可以模拟人类在览器上的一些行为,自动处理划览器上的一些行为,比如点击,境充数据,删除cooke等。chromedriver是一个驱动chrome浏览器的动程序,使用他才可以驱动浏览器。当然针对不同的刘览器有不同的driver。以下列出了不同对器及其对应的driver:
1. Chrome: https://sites.google.com/a/chromium.org/chromedriver/downloads
2. Firefox: https://github.com/mozilla/geckodriver/releases
3. Edge: https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
4. Safari: https://webkit.org/blog/6900/webdriver-support-in-safari-10/
安装Selenium和chromedriver:
1、安装Seleniun:Selenius有很多语言的版本,有java,ruby,python等.以下下载python的版本。
pip install selenium
2、安装chromedriver:下執完成后,放到不需要权限的英文目下就可以了。
注意:chromedriver的版本一定要与Chrome的版本一致,不然就不起作用。
查看Chrome的版本:在浏览器中输入chrome://version/
chromedriver有两个下载地址:
1)http://chromedriver.storage.googleapis.com/index.html
2)https://npm.taobao.org/mirrors/chromedriver/
快速入门:
现在以一个简单的获取百度首页的例子来讲下selenius和cnronmedriver如何快速入门:
# encoding: utf-8
from selenium import webdriver
driver_path = r"D:\ProgramApp\chromedriver\chromedriver.exe"
driver = webdriver.Chrome(executable_path = driver_path)
driver.get('https://www.baidu.com/')
print(driver.page_source)
03 selenium关闭页面和浏览器
selenium常用操作:
更多教程请楚考:http://selenium-python.readthedocs.io/installation.htmleintroduction
关闭页面:
1.driver.close():关当前页面
2.driver.quit():退出整个浏览器
04 selenium定位元素的方法
# 定位元素:
# 1、find_element_by.id:根据id来查找某个元素。等价于:
submitTag = driver.find_element_by_id('su')
submitTag1 =driver.find_elenent(By.ID,'su')
# 2、fina_element_by_class_nane 根据类名找元素。等价于:
submitTag.driver.find_element_by_class-nane('su')
subeitTag1.driver.find_elesent(By.CLASS_NAME,'su')
# 3、find_elements_by_name:根据name属性的值来直找元素。等价于:
submitTag.driver.find_element_by_name('emai1')
submitTag1.driver.find_elenent(By.NAME,'email')
# 4、find_element_by_tag_name:根据标签名来直找元素。等价于:
subeitTag = driver. find-elesent_by_tag_nane("div")
subeltTag1 = driver. find-elesent (By.TAG_NAME,"div")
# 5、find_element_by_xpath:根据xpath语法来获取元素。等价于:
submitTag = driver.find_element_by_xpath('//div')
subeltTag1 = driver.find_element(By.XPATH,"//div")
# 6、find_element_by_css_selector:根据css选择器选择元素。等价于:
subnitTag = driver.find_element_by_css_selector('//div')
subeitTag1 = driver.find_element(By.CSS_SELECTOR, "//dlv")
要注意,find_element是获取第一个满足条件的元素find_elements是获取所有满足条件的元素。
举例:打开百度网页并搜索“python”
from selenium import webdriver
from lxml import etree
driver_path = r"D:\application\chromedriver_win32\chromedriver.exe"
driver = webdriver.Chrome(executable_path = driver_path)
driver.get('https://www.baidu.com/')
# 打印网页源代码
# print(driver.page_source)
# html = etree.html(driver.page_source)
# html.xpath("")
# 1)以id的方法查找输入框
# inputTag = driver.find_element_by_id("kw")
# 2)以name的方法查找输入框
# inputTag = driver.find_element_by_name("wd")
# 3)用css选择器的方法查找输入框
# inputTag = driver.find_element_by_css_selector(".quickdelete-wrap > input")[0]
# 4)用xpath方法查找输入框
inputTag = driver.find_element_by_xpath("//input[@id='kw']")
print(inputTag)
inputTag.send_key('python')
# 1、如果只是想要解析网页中的数据 那么推荐将网页源代码扔给lxml来解析。因为lxml底层使用的是c语言,所以解析效率会更高。
# 2、如果是想要对元素进行一些操作,比如给一个文本框输入值,或者是点击某个按钮,那么就必须使用selenium给我们提供的查找元素的方法。