2021/5/14爬虫第十二次课(selenium操作,cookie)

文章目录

  • 一、selenium定位元素
    • 1.1通过标签
    • 1.2通过属性
    • 1.3通过xpath
  • 二、操作元素
    • 2.1操作输入框
    • 2.2操作按钮
    • 2.3下拉框操作
      • 2.3.1下拉框是select元素
      • 2.3.2下拉框不是select元素
  • 三、(案例)通过selenium登录豆瓣
  • 四、通过selenium获取cookie

一、selenium定位元素

1.1通过标签

find_element_by_tag_name:根据标签名来查找元素

submitTag = driver.find_element_by_tag_name('div')
submitTag1 = driver.find_element(By.TAG_NAME,'div')

1.2通过属性

  • find_element_by_id:根据id来查找某个元素
submitTag = driver.find_element_by_id('su')
submitTag1 = driver.find_element(By.ID,'su')
  • find_element_by_class_name:根据类名查找元素
submitTag = driver.find_element_by_class_name('su')
submitTag1 = driver.find_element(By.CLASS_NAME,'su')
  • find_element_by_name:根据name属性的值来查找元素
submitTag = driver.find_element_by_name('email')
submitTag1 = driver.find_element(By.NAME,'email')

1.3通过xpath

find_element_by_xpath:根据xpath语法来获取元素

submitTag = driver.find_element_by_xpath('//div')
submitTag1 = driver.find_element(By.XPATH,'//div')

当xpath懒得找时,直接copy

要注意,find_element是获取第一个满足条件的元素。find_elements是获取所有满足条件的元素

二、操作元素

2.1操作输入框

第一步:找到这个元素。
第二步:使用

  • send_keys(value),将数据填充进去
  • 使用clear方法可以清除输入框中的内容

2.2操作按钮

操作按钮有很多种方式。比如单击、右击、双击等。这里讲一个最常用的。就是点击。直接调用click函数就可以了

inputTag = driver.find_element_by_id('su')
inputTag.click()

2.3下拉框操作

这是比较难搞的
前导知识:
iframe 是HTML的标签 作用:文档中的文档 所以如果有iframe标签 而这个标签里面嵌套的内容正好就有你要操纵的元素,此时此刻就需要先切换iframe

2.3.1下拉框是select元素

select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专门为select标签提供了一个类from selenium.webdriver.support.ui import Select。将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使用这个对象进行选择了。
示范网址:https://www.17sucai.com/boards/53562.html
步骤:

  • 导入 Select
  • 定位这个select标签 以参数形式传递进去
  • 以什么方式来选择
    • 根据值来选择
    • 根据索引来选择

演示:

from selenium import webdriver
# from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time

driver = webdriver.Chrome()
driver.get('https://www.17sucai.com/pins/demo-show?id=5926')
# 切换iframe switch_to_frame() 过时,不是过期
# driver.switch_to.frame()
driver.switch_to.frame(driver.find_element_by_id('iframe'))
# select标签
selectTag = Select(driver.find_element_by_class_name('nojs'))
'''
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".nojs"}
iframe作祟
'''
# 选择方式
# 1 根据值来选择
time.sleep(2)
selectTag.select_by_value('JP')
# 2 根据索引来选择
# selectTag.select_by_index(2)

2.3.2下拉框不是select元素

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time

driver = webdriver.Chrome()
driver.get('https://www.17sucai.com/pins/demo-show?id=5926')
# 切换iframe switch_to_frame() 过时
driver.switch_to.frame(driver.find_element_by_id('iframe'))

divTag = driver.find_element_by_id('dk_container_country-nofake')
divTag.click()

time.sleep(1)

driver.find_element_by_xpath('//*[@id="dk_container_country-nofake"]/div/ul/li[5]/a').click()

使用selenium原则:始终是先定位,再操作

三、(案例)通过selenium登录豆瓣

# 登录豆瓣
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select
import time

driver = webdriver.Chrome()
driver.get('https://www.douban.com/')
# 切换iframe 灵活变通
'''
NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".nojs"}
iframe作祟
'''
login_frame = driver.find_element_by_xpath('//*[@id="anony-reg-new"]/div/div[1]/iframe')
driver.switch_to.frame(login_frame)

# 切换登录方式 千万不要忘记click()
# 当属性有空格的时候 account-tab-account on 如何解决呢?
# 1.可以选其中的一部分(通过测试),技巧:选较长的一段 2 xpath来定位
driver.find_element_by_class_name('account-tab-account').click()
time.sleep(2)
# 定位账号和密码 并输入内容
driver.find_element_by_id('username').send_keys('xxxxxx')
time.sleep(1)
driver.find_element_by_id('password').send_keys('xxxxxx')
time.sleep(1)
# 点击登录按钮
driver.find_element_by_class_name('btn').click()

四、通过selenium获取cookie

from selenium import webdriver
import requests
import time
import json
# 模拟登录自己的QQ空间

# 携带cookie进行模拟 也就是我们先通过正常的途径进行登录此时此刻就可以获得一个cookie.然后在正常的编写一个 模拟登录的逻辑就可以啦
# 下面的逻辑 1 要通过selenium获取 qq空间的cookie值 2 解析这个cookie值 3 进行测试

#要通过selenium获取 qq空间的cookie值
#把逻辑封装一下 类 方法
driver = webdriver.Chrome()
# 不要删参数  加载第三方的登录方式
driver.get('https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https%3A//qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_qr_app=%E6%89%8B%E6%9C%BAQQ%E7%A9%BA%E9%97%B4&pt_qr_link=http%3A//z.qzone.com/download.html&self_regurl=https%3A//qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=http%3A//z.qzone.com/download.html&pt_no_auth=0')
time.sleep(1)
button = driver.find_element_by_class_name('face')
button.click()
time.sleep(2)
listCookies = driver.get_cookies() # 是python中的list json.loads()
# # 以下的逻辑可以不写 不实现  目的是保存listCookies,方便后续调用
# jsonCookies = json.dumps(listCookies) # 把python的数据类型转换成json类型的字符串(str)
# print(type(jsonCookies),jsonCookies)
#
# with open('qqzone.json','w') as file_obj:
#     file_obj.write(jsonCookies)


# 解析cookie数据 列表推导式 [] 返回的结果是一个新的列表
cookie = [item['name'] + '=' + item['value'] for item in listCookies]
cookie_str = '; '.join(cookie)
#item for item in cookie
print(cookie_str)


# 测试代码 selenium获取和解析之后的cookie是否可以使用
url = 'https://user.qzone.qq.com/2023203294'
headers = {
     
    'cookie':cookie_str,
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'
}

html = requests.get(url,headers=headers)
time.sleep(2)
with open('qzong.html','w',encoding='utf-8') as file_obj:
    file_obj.write(html.text)
print(html.text)

注:用selenium时为了尽可能模仿人的行为以及充分考虑网页的加载时间,建议常用time.sleep()

你可能感兴趣的:(selenium,xpath,爬虫,selenium,cookie)