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

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

代码实例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from 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 webdriver

browser = webdriver.Chrome()
browser = webdriver.PhantomJS

访问页面:

from selenium import webdriver

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


查找元素:

单个元素:

from selenium import webdriver

browser = 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 webdriver
from selenium.webdriver.common.by import By
browser = webdriver.Chrome()
browser.get('http://www.taobao.com')
input_first = browser.find_element(By.ID,'q')
print(input_first)
browser.close()
节省了代码,且将得到与前者同样的效果


多个元素:

from selenium import webdriver

browser = 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 webdriver
from  selenium.webdriver.common.by import By
browser = 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 webdriver
import time
browser = 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 webdriver
from selenium.webdriver import ActionChains

browser = 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 webdriver

browser = 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 webdriver
from selenium.webdriver import ActionChains

browser = 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 webdriver
from selenium.webdriver import ActionChains

browser = 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 webdriver
from selenium.webdriver import ActionChains

browser = 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 time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

browser = 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 time
from selenium import webdriver

browser = 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 webdriver

browser = 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 time
from selenium import webdriver

browser = 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跟踪而储存在用户本地终端上的数据

























首先,为了访问QQ空间相册,我们需要登录QQ账号。可以使用Selenium模拟用户登录QQ,然后使用BeautifulSoup解析相册页面,获取相册中的图片链接。 以下是大致的实现步骤: 1. 安装Selenium和BeautifulSoup模块。 2. 使用Selenium模拟用户登录QQ,进入相册页面。 ```python from selenium import webdriver # 创建Chrome浏览器对象 browser = webdriver.Chrome() # 打开QQ登录页面 browser.get("https://mail.qq.com/") # 执行模拟登录操作,具体实现可以参考Selenium文档或其他相关教程 # ... # 进入相册页面 browser.get("http://user.qzone.qq.com/123456789/album") ``` 3. 使用BeautifulSoup解析相册页面,获取相册中的图片链接。 ```python from bs4 import BeautifulSoup # 获取相册页面的HTML源代码 html = browser.page_source # 使用BeautifulSoup解析HTML源代码,获取相册中的图片链接 soup = BeautifulSoup(html, "html.parser") img_links = soup.find_all("img", class_="c_photo_img_img") # 打印图片链接 for link in img_links: print(link["src"]) ``` 4. 下载图片。 ```python import requests # 下载图片 for i, link in enumerate(img_links): img_url = link["src"] response = requests.get(img_url) with open(f"photo_{i}.jpg", "wb") as f: f.write(response.content) ``` 以上只是大致的实现步骤,具体的实现过程可能还需要根据实际情况进行调整。同时,需要注意的是,访问QQ空间相册需要登录QQ账号,因此需要注意账号安全问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值