本页代码可以在这里下载。
当网页不是使用Ajax动态渲染的时候,就没办法使用Ajax,同时还有一些使用Ajax的,但是使用的是加密接口,所以很难找出规律爬取,所以我们使用模拟浏览器来进行爬取,做到可视即可爬。

1.Selenium的使用

selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可视即可爬。
selenium中文文档
声明浏览器对象:

browser = webdriver.Chrome()

访问页面:

browser.get('https://www.baidu.com')
print(browser.page_source)
browser.close()

查找节点&节点交互:

 
 
我们可以看到,搜索框的id是q,name也是q,所以我们可以使用find_element_by_name( ),也可以使用find_element_by_id( )来获取,当然也可以根据XPath或者CSS选择器等在操作。
browser.execute_script(‘window.scrollTo(0, document.body.scrollHeight)’)
browser.execute_script(‘alert(“To Bottom”)’)
直接拖到底部并显示窗口 To Bottom

# 查找单个节点
# 使用 find_element_by_name
input_first = browser.find_element_by_name('q')
# 使用 XPath
# input_second = browser.find_element_by_xpath('//*[@id="q"]')
# 使用 CSS选择器
# input_third = browser.find_element_by_css_selector('#q')
input_first.send_keys('iPad')
time.sleep(1)
input_first.clear()
input_first.send_keys('iPhone')
button = browser.find_element_by_class_name('btn-search')
button.click()
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')

结果:

动作链:
ActionChain(browser)
.drag_and_drop(element1, element2)
.perform( )

获取属性:

我们可以使用get_attribute( key)获取节点属性,前提是选中这个节点。
我们可以调用.text 来获取文本,和Beautiful Soup的get_text( )和pyquery的text()一样。
还可以使用id来获取id,location来获取相对位置,tag_name来获取标签名称,size来获取节点大小等。

切换Frame:

当需要切换到子frame时,使用switch_to.frame(name),使用switch_to.parent_frame()切换到父frame。

延时等待:

有时候需要延时等待一段时间才能把源码完全的加载进来。
隐式等待:等待一段固定的时间,如果节点仍没有找到抛出异常。
显示等待:规定一个等待时间。

wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_all_elements_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))

这里首先引入WebDriverWait这个对象,指定最长等待时间,然后调用它的until()方法,传入要等待的条件。

前进和后退

browser.back()
browser.forward()

Cookies

browser.get_cookies() 获取cookies
browser.add_cookies() 增加cookies
browser.delete_all_cookies() 删除所有cookies

选项卡管理:

新建选项卡打开淘宝,切换回来打开python官网。

# 选项卡管理
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
异常处理:

如果没有找到节点,抛出异常NoSuchElementException
 
 
 
 
 
 
 
 
 
 
 
 
 
.


0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注