1.selenium :是一个自动化测试工具
在python中的应用为:
selenium 可以模仿浏览器操作,对动态数据进行获取
①动态数据有代码生成,在页面初始化的过程当中是没有页无法获取的,但是可以通过selenium来进行获取
②有些数据是需要登录以后才能获取的,比如说好友列表,评论,消费记录等等
登录以后获取cookie才能进行以上的操作,但是使用selenium以后可以避免人工登录
只需要得到账号和密码即可实现selenium代替登录
selenium的特点:
①有程序控制浏览器进行操作,而不是手动操作浏览器
②程序控制浏览器操作的时候速度非常慢,所以要谨慎使用selenium
③使用selenium控制浏览器的时候需要下载浏览器对应的驱动程序
④selenium为开源免费但是更新速度没有浏览器快不是selenium慢而是浏览器更新太快了
from selenium import webdriver
import time
# 使用网页驱动来运行火狐浏览器
driver =webdriver.Firefox()#创建一个对象
# 通过驱动来执行指定的网页
driver.get('http://www.baidu.com')#用这个对象打开这个网址
# selenium 提供了找到元素的方法 find element by xxxx
# 这些方法全部是用python实现的
# 如果只是想对这个元素进行查找,定位,建议使用
# xpath 或者css selecotor
# 如果需要对找到的内容进行点击等操作
# 建议使用find_element_by_xxx
# find找到 element元素;节点;标签 by 通过
# selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="kw"]
# 错误原因 :代码执行速度很快但是浏览器响应很慢
# 代码执行到这的时候浏览器里面的元素可能还没有加载完
# 所以报错找不到指定的元素
# time.sleep(0)
# 通过id来找
# driver.find_element_by_id('kw').send_keys('selenium')
# 通过name来找
# driver.find_element_by_name('wd').send_keys('csdn')
# unicode 如果后面有中文 那么前面需要加一个u r
# 错误:'list' object has no attribute 'send_keys'
# driver.find_element_by_class_name('s_ipt').send_keys(u'智游')
# tag_name:标签名字
# driver.find_element_by_tag_name('input')
# selector:选择器
# driver.find_element_by_css_selector('#kw')
# 通过xpath语法定位一个元素
# driver.find_element_by_xpath('//form[@id="form"]/span/input[@id="kw"]')
# link:链接
# driver.find_element_by_link_text('贴吧')
time.sleep(5)
driver.close()
selenium登录
from selenium import webdriver
import time
driver=webdriver.Firefox()
driver.get('https://i.meishi.cc/login.php?redirect=https%3A%2F%2Fwww.meishij.net%2F')
driver.find_element_by_name('username').send_keys('285356379@qq.com')
driver.find_element_by_class_name('password').send_keys('crd9411084210')
title=driver.find_element_by_id('more_dsf_btn').text
print(title)
# time.sleep(3)
# text获取的是标签之间的文本 而不是填充的内容
# username=driver.find_element_by_name('username').text
# password=driver.find_element_by_class_name('password').text
# print(username)
# print(password)
# driver.find_element_by_name('username').clear()
# driver.find_element_by_class_name('password').clear()
#
# driver.find_element_by_xpath('//div[@class="nl_loginitem"]/input[@class="submit"]').click()
CSV操作
# comma sepreated value 逗号分隔值
import csv
rows = [['张三',14],['李四',24],['王五',34]]
# with open ('code.txt','w')as f
# csv文件在写入的时候 默认每次写入会有一个空行作为分隔
# # 使用newline=''可以将空行去掉
with open('test1.csv','w',newline='') as csv_file:
write=csv.writer(csv_file)
for row in rows:
#writerow 写入一行数据
write.writerow(row)
# 读取文件 with open ('code.txt','r')as f:
with open('test1.csv','r')as read_file:
read=csv.reader(read_file)
# print(read)
print([row for row in read])
def write_data():
columns= int(input('请输入总列数'))
# print(columns)
col_list=[]
while True:
col_list.append([input('请输入第{}列数据'.format(n+1))for n in range(columns)])
is_continue=input('是否继续呢?Y/N')
if is_continue!='Y':
break
# continue 跳出本次循环 下次循环继续执行
# return 结束循环和方法 return后面的代码统统不执行
print(col_list)
with open('test2.csv','w',newline='')as csv_file:
write = csv.writer(csv_file)
for row in col_list:
write.writerow(row)
# write_data()
data_dic=[{'name':'xiaochen','age':15},{'name':'chenye','age':25}]
with open('dict.csv','w',newline='')as csv_file:
keys=[]
for key in data_dic[0].keys():
print(key)
keys.append(key)
# 写入一个字典到CSV中 fieldnames 设置文本的标题
write = csv.DictWriter(csv_file,fieldnames=keys)
# 开始写入标题
write.writeheader()
for dict in data_dic:
write.writerow(dict)
with open('dict.csv','r')as csv_file:
read=csv.DictReader(csv_file)
print([row for row in read])