Python Selenium爬虫使用方法总结

1. 安装方法:

1.1 安装:

pip install selenium -i pypi.douban.com/simple (通过豆瓣镜像下载)

1.2 chrome driver:

下载对应版本的链接:npm.taobao.org/mirrors/

下载后将chromedriver.exe分别拷贝至:

谷歌浏览器目录(如 C:\Program Files\Google\Chrome\Application)

python根目录(C:\Python27)–> cmd –> where python(输入该命令查找根目录)

2. 基本使用方法:

2.1 使用selenium首先要定义一个浏览器对象

from selenium import webdriver

browser = webdriver.Firefox()

browser = webdriver.Chrome()

browser = webdriver.Edge()

browser = webdriver.PhantomJS()

browser = webdriver.Safari()

browser = webdriver.Opera()

driver = webdriver.Ie()

2.2 访问页面

browser = webdriver.Chrome()

Browser.get(“baidu.com”)

Print(browser.page_source)

Browser.close()

2.3 查找元素:

单个元素:

# find_element_by_name 通过name查找单个元素

# find_element_by_xpath 通过xpath查找单个元素

# find_element_by_link_text 通过链接查找单个元素

# find_element_by_partial_link_text 通过部分链接查找单个元素

# find_element_by_tag_name 通过标签名称查找单个元素

# find_element_by_class_name 通过类名查找单个元素

# find_element_by_css_selector 通过css选择武器查找单个元素

多个元素

# find_elements_by_name 通过name查找多个元素

# find_elements_by_xpath 通过xpath查找多个元素

# find_elements_by_link_text 通过链接查找多个元素

# find_elements_by_partial_link_text 通过部分链接查找多个元素

# find_elements_by_tag_name 通过标签名称查找多个元素

# find_elements_by_class_name 通过类名查找多个元素

# find_elements_by_css_selector 通过css选择武器查找多个元素

2.4 内容交互:

2.4.1 搜索内容:

找到元素后,我们可能需要进行查询等内容,这时可以使用:

element.send_keys(“some text”),同样你还可以利用 Keys 这个类来模拟点击某个按键。element.send_keys(“and some”, Keys.ARROW_DOWN)

你可以对任何获取到到元素使用 send_keys 方法,就像你在 GMail 里面点击发送键一样。不过这样会导致的结果就是输入的文本不会自动清除。所以输入的文本都会在原来的基础上继续输入。你可以用下面的方法来清除输入文本的内容。element.clear()

这样输入的文本会被清除。

2.4.2 鼠标动作链:

geeksforgeeks.org/actio

#导入webdriver

from selenium import webdriver

#导入鼠标动作链Action chains

from selenium.webdriver.common.action_chains import ActionChains

# 创建webdriver对象

driver = webdriver.Firefox()

# 创建动作链对象

action = ActionChains(driver)

使用方法:

方法1:

#选中一个element

Ac = driver.find_element_by_xpath(‘element’)

ActionChains(driver).move_to_element(ac).perform()

方法2:

Ac = driver.find_element_by_xpath(‘element’)

Actions = ActionChains(driver)

Actions.move_to_element(ac)

actions.perform()

常用方法:

perform(): 执行所有 ActionChains 中存储的行为;

context_click(): 右击;

double_click(): 双击;

drag_and_drop(): 拖动(从一个元素移动到另一个元素);

move_to_element(): 移动到某个元素。

Click_and_hold(): 左键单击并保持

2.4.3 键盘事件

以下为常用的键盘操作:

send_keys(Keys.BACK_SPACE) 删除键(BackSpace)

send_keys(Keys.SPACE) 空格键(Space)

send_keys(Keys.TAB) 制表键(Tab)

send_keys(Keys.ESCAPE) 回退键(Esc)

send_keys(Keys.ENTER) 回车键(Enter)

send_keys(Keys.CONTROL,’a’) 全选(Ctrl+A)

send_keys(Keys.CONTROL,’c’) 复制(Ctrl+C)

send_keys(Keys.CONTROL,’x’) 剪切(Ctrl+X)

send_keys(Keys.CONTROL,’v’) 粘贴(Ctrl+V)

send_keys(Keys.F1) 键盘 F1

……

send_keys(Keys.F12) 键盘 F12

# 输入框输入内容

driver.find_element_by_id(“kw”).send_keys(“seleniumm”)

# 删除多输入的一个 m

driver.find_element_by_id(“kw”).send_keys(Keys.BACK_SPACE)

2.4.4 填充表单(下拉菜单):

表单示例代码:

<select name=’cities’>

<option value=”cd”>成都</option>

<option value=”bj”>北京</option>

<option value=”nj”>南京</option>

<option value=”hz”>杭州</option>

</select>

使用方法:

Selenium提供了Select类来进行操作:

# 导入select类:

From selenium.webdriver.support.ui import Select

#找到下拉框元素

select=Select(driver.find_element_by_name(“cities”))

#选择下拉框的某一个选项:

select.select_by_index(1)

select.select_by_value(“bj”)

select.select_by_visible_text(u”北京”)

#取消全部选择

select.deselect_all()

2.4.5 在不同的窗口和框架之间移动

driver.switch_to_window(“windowName”)

driver.switch_to_frame(“frameName”)

以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。

#先通过xpth定位到iframe

xf = driver.find_element_by_xpath(‘//*[@id=”x-URS-iframe”]’)

#再将定位对象传给switch_to_frame()方法

driver.switch_to_frame(xf)

一旦我们完成了frame中的工作,我们可以这样返回父frame:

driver.switch_to_default_content()

2.5 控制浏览器操作

控制浏览器窗口大小

driver.set_window_size(480, 800)

浏览器后退,前进

# 后退 driver.back()

# 前进 driver.forward()

刷新

driver.refresh() # 刷新

2.6 无界面浏览器模式:

如果希望在模拟浏览器窗口时,启用无界面浏览器模式,可以通过如下代码来实现:

Chrome_options = webdriver.ChromeOptions()

Chrome_options.add_argument(‘–headless’)

Browser= webdriver.Chrome(options=chrome_options)

2.7 等待页面加载完成

2.7.1 显示等待

显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。

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.Firefox()

driver.get(“baidu.com“)

element = WebDriverWait(driver, 5, 0.5).until(

EC.presence_of_element_located((By.ID, “kw”))

)

element.send_keys(‘selenium’)

driver.quit()

WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

driver :浏览器驱动。

timeout :最长超时时间,默认以秒为单位。

poll_frequency :检测的间隔(步长)时间,默认为0.5S。

ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。

WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。

until(method, message=’’) 调用该方法提供的驱动程序作为一个参数,直到返回值为True。

until_not(method, message=’’) 调用该方法提供的驱动程序作为一个参数,直到返回值为False。

在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。

2.7.2 隐式等待

如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。

from selenium import webdriver

driver = webdriver.Firefox()

driver.implicitly_wait(10) # seconds

driver.get(“somedomain/url_that_del“)

myDynamicElement = driver.find_element_by_id(“myDynamicElement”)

2.8 Cookies 处理

为页面添加 Cookies,用法如下

# Go to the correct domain
driver.get(“http://www.example.com”)

# Now set the cookie. This one’s valid for the entire domain
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)

获取页面 Cookies,用法如下# Go to the correct domain
driver.get(“http://www.example.com”)

# And now output all the available cookies for the current URL
driver.get_cookies()