本页代码可以在这里下载。
当网页不是使用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 条评论