Python Selenium爬虫使用方法总结

1. 安装方法:
1.1 安装:
pip install selenium -i https://pypi.douban.com/simple (通过豆瓣镜像下载)
1.2 chrome driver:
下载对应版本的链接:http://npm.taobao.org/mirrors/chromedriver/
下载后将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(“https://www.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 鼠标动作链:
https://www.geeksforgeeks.org/action-chains-in-selenium-python/
#导入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(“http://www.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(“http://somedomain/url_that_delays_loading“)
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()