python爬虫实战笔记---selenium爬取QQ空间说说并存至本地(上)

来源:互联网 发布:java堆栈溢出怎么解决 编辑:程序博客网 时间:2024/05/23 16:18

Selenium是一个自动化测试工具,支持驱动多种浏览器,爬虫中主要用来解决JavaScript渲染问题,跳转,输入啦,点击,下拉等等操作。当无法从网页中静态获取内容时,则可以用这个工具。可以用pip完成安装。

代码实例:

from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWait
browser = webdriver.Chrome()#定义一个浏览器驱动try:    browser.get("http://www.baidu.com")   #模拟输入一个url    input = browser.find_element_by_id('kw')    input.send_keys("Python")    input.send_keys(Keys.ENTER)    wait = WebDriverWait(browser,10)    wait.until(EC.presence_of_all_elements_located((By.ID,"content_left")))#等待id为
content_left的元素被加载进来
    print(browser.current_url)    print(browser.get_cookie())    print(browser.page_source)finally:    browser.close()#关闭浏览器,若不关闭,浏览器则会在后台一直运行下去

接下来,让我们对Selenium来一波彻底的认知~~~

声明浏览器对象:

from selenium import webdriverbrowser = webdriver.Chrome()browser = webdriver.PhantomJS

访问页面:

from selenium import webdriverbrowser = webdriver.Chrome()browser.get('http://www.baidu.com')browser.close()


查找元素:

单个元素:

from selenium import webdriverbrowser = webdriver.Chrome()browser.get('http://www.taobao.com')
#以下的三种方式将会得到同样的结果,都是根据id得到的淘宝网搜索框input_first = browser.find_element_by_id('q')input_second = browser.find_element_by_css_selector('#q')input_third = browser.find_element_by_xpath('//*[@id="q"]')browser.close()

常用的查找方法还有:
find_element_by_name
find_element_by_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
还有一种通用的查找方式:
例如:
from selenium import webdriverfrom selenium.webdriver.common.by import Bybrowser = webdriver.Chrome()browser.get('http://www.taobao.com')input_first = browser.find_element(By.ID,'q')print(input_first)browser.close()
节省了代码,且将得到与前者同样的效果


多个元素:

from selenium import webdriverbrowser = webdriver.Chrome()browser.get('http://www.taobao.com')lis = browser.find_elements_by_css_selector('.service-bd li')print(lis)browser.close()
那么,它得到的就是淘宝网首页的导航条的一个列表,如下:

常用的查找方法还有:

find_elements_by_name
find_elements_by_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
当然,查找多个元素的操作也有其简化的通用写法,即
from selenium import webdriverfrom  selenium.webdriver.common.by import Bybrowser = webdriver.Chrome()browser.get('http://www.taobao.com')lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')print(lis)browser.close()


但是,在处理大量数据时,建议使用lxml,效率会高很多!!!

元素交互操作

对获取的元素调用交互方法:
from selenium import webdriverimport timebrowser = webdriver.Chrome()browser.get('http://www.taobao.com')input = browser.find_element_by_id('q')input.send_keys('iPhone')time.sleep(1)input.clear()input.send_keys("iPid")button = browser.find_element_by_class_name('btn-search')button.click()browser.close()
这样就可以释放你的双手,让程序自动驱动浏览器去查找淘宝商品咯

交互动作

这个交互动作与元素的交互动作是不同的,它是将动作附加到动作链中串行执行,需要引入一个ActionChains库

下面的实例用于切换frame

from selenium import webdriverfrom selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"browser.get(url)browser.switch_to_frame('ifameResult')source = browser.find_elements_by_css_selector('#draggable')target = browser.find_elements_by_css_selector('#droppable')actions = ActionChains(browser)#声明一个交互动作actions.drag_and_drop(source,target)  #执行拖拽actions.perform()
除了drag_and_drop,常用的交互动作还有,

click_and_hold(on_element=None) 按住不动

double_click(on_element-None)双击


执行JavaScript

from selenium import webdriverbrowser = webdriver.Chrome()browser.get("http://www.zhihu.com/explore")
#将动作拖拽到窗口底部browser.execute_script("window.scrollTo(0,document.body.scrollHeight)")browser.execute_script('alert("To Buttom")')


获取元素信息

获取属性:

from selenium import webdriverfrom selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()url = "http://www.zhihu.com/explore"browser.get(url)logo = browser.find_element_by_id('zhihu-top-link-logo')print(logo)print(logo.get_attribute('class'))

获取文本值:

from selenium import webdriverfrom selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()url = "http://www.zhihu.com/explore"browser.get(url)input = browser.find_element_by_class_name('zu-top-add-question')print(input.text)

获取id,位置,标签名,大小

from selenium import webdriverfrom selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()url = "http://www.zhihu.com/explore"browser.get(url)input = browser.find_element_by_class_name('zu-top-add-question')print(input.id)print(input.location)print(input.tag_name)print(input.size)
output:
0.5051284357419945-1
{'x': 758, 'y': 7}    在浏览器中的位置
button
{'height': 32, 'width': 66}  浏览器占的像素大小


Frame

frame即碎片,组成整张网页的一部分,是网页中常见的一种组件,通常可以看作是一个独立网页,下面用一个例子来说明如何切换frame,即怎样切换到子元素的frame,然后再切换回来

import timefrom selenium import webdriverfrom selenium.common.exceptions import NoSuchElementExceptionbrowser = webdriver.Chrome()url = "http://www.runoob.com/try/try/try.php?filename=jueryui-api-droppable"browser.get(url)browser.switch_to_frame("iframeResult")sourse = browser.find_elements_by_css_selector("#draggable")print(sourse)try:    logo = browser.find_element_by_class_name("logo")except NoSuchElementException:    print('No logo')browser.switch_to_parent_frame()logo = browser.find_element_by_class_name('logo')print(logo.text)

前进后退

import timefrom selenium import webdriverbrowser = webdriver.Chrome()browser.get("http://www.baidu.com")browser.get("http://www.taobao.com")browser.get("http://www.python.com")browser.back()time.sleep(1)browser.forward()browser.close()
依次请求三个页面,然后后退一步,前进一步

Cookies

from selenium import webdriverbrowser = webdriver.Chrome()browser.get("http://www.zhihu.com/explore")print(browser.get_cookie())browser.add_cookie({'name':'name','domain':'www.zhihu.com','value':'germey'})print(browser.get_cookie())browser.delete_all_cookies()print(browser.get_cookie())

选项卡管理

import timefrom selenium import webdriverbrowser = webdriver.Chrome()browser.get("http://www.baidu.com")browser.execute_script('window.open()')print(browser.window_handles)browser.switch_to_window(browser.window_handles[1])browser.get("http://www.taobao.com")time.sleep(1)browser.switch_to_window(browser.window_handles[0])browser.get('http://python.org')


PhantomJS是一个基于Webkit的Headless的web引擎,即相当于一个没有界面的浏览器,在做爬虫时比Chrome更节省内存,且运行较快。


关于Cookies的使用

Cookie,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据

























阅读全文
0 0
原创粉丝点击