搜索引擎;
网站迁移;
数据整理、分析、统计;
跨域、第三方API调用;
还有,嗯钓鱼网站啊;
......css
curl是利用URL语法在命令行方式下工做的开源文件传输工具。它被普遍应用在Unix、多种Linux发行版中,而且有DOS和Win3二、Win64下的移植版本
Shell:html
curl https://www.segmentfault.com
PHP:curl_init();
Java:URLConnection;
Python:requests模块;
Node:http模块;
...python
没法获取由Js脚本动态生成的网页信息-
当今Web技术的大环境下,为了网站的性能、可扩展性、用户友好等方向,几乎全部的Web页面都在使用浏览器脚本动态生成内容,因此若是没有脚本执行环境就没有数据。git
无头浏览器相似于在流行的Web浏览器的环境中提供对网页的自动控制,但经过命令行接口或使用网络通讯来执行。它们特别适用于测试网页,由于它们可以以浏览器相同的方式呈现和解释HTML,包括页面布局、颜色、字体选择和JavaScript和Ajax的执行等样式元素,当使用其它测试方法时,这些元素一般是不可用的
引自Wikipedia Headless browser
简单来讲就是用浏览器来对目标URL进行HTML解析,CSS渲染,Js执行,借由API甚至能够模拟用户行为(鼠标点击,键盘输入),但不提供UI渲染。github
经过以上咱们能够知道Headless browser就是咱们想要的爬虫方式了,本文旨在探讨网页爬虫故不对其它用途特性作过多说明。web
Phantomjs(项目暂封存,慎用);
Chrome;
FireFox;ajax
Python + Selenium + ChromeDriverchrome
语法简单,有各类成熟扩展库,爬虫周边的库能够轻易找到shell
Selenium-主要是为了自动化测试Web应用程序,但不局限于此-
一句话解释:控制浏览器,作任何想作的事情。(鼠标点击、拖拽;用户输入,表单填充;History and Location API;Cookie;弹出对话框;定位和操做UI元素,执行JavaScript脚本)所以获取经过ajax渲染的页面的数据就不是什么难事了:)
附 Documentation编程
如上所述,Selenium能够操做浏览器,可是须要借助ChromeDriver它是实现 WebDriver 有线协议的一个开源工具,它提供了导航到网页、用户输入、JavaScript执行等等的能力。ChromeDriver经过chrome的自动代理框架控制浏览器
如下将经过两个小例子来了解Selenium :)
文件名:searchPython.py
from selenium import webdriver # 从selenium导入webdriver driver = webdriver.Chrome() # Optional argument, if not specified will search path. driver.get('https://www.baidu.com') # 获取百度页面
Shell:
py searchPython.py
chromeDriver属性及方法
显示以下:
input = driver.find_element_by_id('kw') #获取输入框 searchButton = driver.find_element_by_id('su') #获取搜索按钮
经常使用查找元素方法:
查看经常使用定位元素方法
注:find_element_by_ 将获取 find_elements_by_ 的第一个元素,获取到的元素会被包装为 WebElement 对象
以上定位元素方法还能够经过以下方式实现:
from selenium.webdriver.common.by import By #支持的定位器策略集 driver.find_element(By.ID,'kw') driver.find_element(By.ID,'su') '''注释 策略集以下: CLASS_NAME = 'class name' CSS_SELECTOR = 'css selector' ID = 'id' LINK_TEXT = 'link text' NAME = 'name' PARTIAL_LINK_TEXT = 'partial link text' TAG_NAME = 'tag name' XPATH = 'xpath' '''
inputElement.send_keys("Python") #输入框输入"Python" searchButton.click() #搜索
WebElement属性及事件API
显示以下:
from selenium import webdriver # 从selenium导入webdriver driver = webdriver.Chrome() # Optional argument, if not specified will search path. driver.get('https://www.baidu.com') # 获取百度页面 inputElement = driver.find_element_by_id('kw') #获取输入框 searchButton = driver.find_element_by_id('su') #获取搜索按钮 inputElement.send_keys("Python") #输入框输入"Python" searchButton.click() #搜索
这里涉及两个概念:
显式等待(Explicit Waits)-
在给定的条件函数返回True以前,设置一个最长等待时间,和重复执行给定条件函数的间隔时间,若是条件函数在规定时间内返回True则即刻继续执行,不然将抛出一个异常!
隐式等待(Implicit Waits)
告诉WebDriver在试图找到一个元素或元素时,若是它们没有当即可用,则会在必定时间内对DOM进行轮询,默认设置为0,一旦设置,就为WebDevor对象实例的生命周期设置隐式等待。
文件名:bilibili.py
from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait # 用于实例化一个Driver的显式等待 from selenium.webdriver.common.by import By # 内置定位器策略集 from selenium.webdriver.support import expected_conditions as EC # 内置预期条件函数,具体API请参考此小节后API连接 driver = webdriver.Chrome() driver.get('https://www.bilibili.com/v/game/esports/?spm_id_from=333.334.primary_menu.35#/9222') try: WebDriverWait(driver, 20, 0.5).until(EC.presence_of_all_elements_located((By.CLASS_NAME,'vd-list'))) #使用expected_conditions自带验证函数 for doctorName in driver.find_elements_by_css_selector('.vd-list li'): print(doctorName.find_element_by_css_selector('.r > a').text) finally: driver.close() # close the driver
构造器,接受一个Driver实例,超时时长(秒),执行条件函数的间隔时间。用于实例化一个Driver的显式等待
方法:
1.until(method, message='')
调用第一个参数给定的函数,直到函数不返回False,除了能够接受expected_conditions内置预期条件函数还能够自定义函数,以下
例:
def hasDoctors(d): # 自定义条件函数 when the function is called , the first prms will be a driver if (len(d.find_elements_by_css_selector('.vd-list li'))): return True return False WebDriverWait(driver, 20, 0.5).until(hasDoctors) # 自定义函数形式
2.until_not(method, message='')
与until相反
支持的内置的预期条件,简称EC,以下:
title_is:判断当前页面的title是否彻底等于(==)预期字符串
title_contains:判断当前页面的title是否包含预期字符串
presence_of_element_located:判断某个元素是否被加到了dom树里,并不表明该元素必定可见
visibility_of_element_located:判断某个元素是否可见,可见表明元素非隐藏,而且元素的宽和高都不等于0
visibility_of:与上述的方法同样,区别是上述方法要传入元祖locator即(By.ID,'kw'),此方法直接传定位到的WebElement
presence_of_all_elements_located:判断是否至少有1个元素存在于dom树中,有则返回WebElements列表
text_to_be_present_in_element:判断元素的text是否包含预期字符串
text_to_be_present_in_element_value:判断元素的value属性是否包含预期字符串
frame_to_be_available_and_switch_to_it:检查给定帧是否可切换到,若是能够,则将给定的驱动器切换到指定的iframe
......
这里包含了全部的预置条件说明
运行Shell以下: