selenium官方教程:https://python-selenium-zh.readthedocs.io/zh_CN/latest/1.%E5%AE%89%E8%A3%85/
selenium主要实现模仿人来操作来 自动填写数据,点击按钮,操作dom,缩放浏览器,切换浏览器标签,扩展外部js功能等。selenium不好操作的功能可以用js来操作,比如 自动填写数据,点击按钮,操作dom。
而bs4和scrapy是操作dom,这里还是和selenuim有很大区别。
推荐使用火狐来操作。
0)python3.7环境。
1)pip install --user -U selenium
2)下载对应版本或者对应win系统的
Chromedriver:http://npm.taobao.org/mirrors/chromedriver 下载对应chrome版本的驱动。
Geckodriver:https://npm.taobao.org/mirrors/geckodriver 下载最新驱动即可。
将文件解压后的exe一同放在D://python/driver目录(没有的话手动创建一个即可,exe都放在这里可以只添加一个path即可解决所有浏览器driver)。
并将D://python/driver路径直接添加在path环境中。
3)重启电脑
4)测试是否安装成功:
print("hello")
from selenium import webdriver
browser = webdriver.Chrome() # .Firefox() # 打开浏览器
browser.get('http://www.baidu.com/') # 打开页面
如果chrome浏览器或者Firefox浏览器能自动打开了百度就证明成功。
推荐使用火狐来操作。
1) selenium不能操作的,请使用js操作,比如未展示在可视窗口的标签不可用selenium点击,你可以用js的click()实现点击;
2.)尽量在每个步骤操作完延时0.5秒到3秒,模仿人的习惯操作,可使用time.sleep(s)来实现。值得注意的是selenium会等待页面加载完成才会操作下一步,出现中断可能是因为页面html没有异步渲染完;
3)利用浏览器检查代码功能将xpath快捷取出来,如下图:
4)打开页面前请使用ip代理,不然IP会被标记;
5)可能存在由一个域名跳入另外一个不同域名,由一个域名向iframe操作,注意主题切换;
6)可以运行jQ
# 腾讯社交广告自动化素材上传
# 破解滑动验证码(暂时还没有破解)
from selenium import webdriver
import time
import random
from selenium.webdriver.common.proxy import Proxy
from selenium.webdriver.common.proxy import ProxyType
import sys
from selenium.webdriver.common.keys import Keys
def upload(driver):
print('处理广告创意')
# 上传图片
# input id = form-1-image-upload
driver.find_element_by_name('resource').send_keys("D:\\python\\file\\img\\img001.jpg")
print('图片添加完成')
time.sleep(6)
# 落地页
js = "document.getElementsByClassName('selection-single')[4].click();"
driver.execute_script(js)
time.sleep(1)
js = "document.getElementsByClassName('selection-results')[4].childNodes[1].click();"
driver.execute_script(js)
time.sleep(1)
# 提交
# driver.find_element_by_class_name("//div[@class='btn-line'][3]").click()
js = "document.getElementsByClassName('btn-line')[2].childNodes[0].click();"
driver.execute_script(js)
print('提交完成')
# 确认提交
# js = "document.getElementsByClassName('modal-footer')[2].childNodes[1].click();"
# driver.execute_script(js)
print('程序完毕!')
pass
def close_alert(driver):
print('准备关闭弹窗')
# 清除页面提示
driver.find_element_by_xpath("//div[@class='guider']/div/div/div/div/div[1]").click()
print('清除提示页面2')
time.sleep(1)
# 清除页面提示
driver.find_element_by_xpath("//div[@class='guider']/div/div/div/div/div[1]").click()
print('清除提示页面3')
time.sleep(1)
upload(driver)
pass
def add_ad(driver):
# 处理推广计划
driver.find_element_by_xpath("//div[@id='order_subcontainer_campaign_select']/ul/li/div[1]").click()
print('点开选项')
time.sleep(1)
# 选择
driver.find_element_by_xpath("//ul[@class='selection-results']/li[1]").click()
time.sleep(1)
# 下一步
driver.find_element_by_xpath("//div[@id='order_container_campaign']/div/div[3]/button").click()
print('下一步')
time.sleep(3)
# 处理落地页
js = "document.getElementsByClassName('blk-options')[1].click();"
driver.execute_script(js)
time.sleep(1)
# 选择商品
js = "document.getElementsByClassName('selection-single')[1].click();"
driver.execute_script(js)
time.sleep(1)
js = "document.getElementsByClassName('selection-results')[1].childNodes[0].click();"
driver.execute_script(js)
time.sleep(1)
# 滚动浏览器滚动条
js = "window.scrollTo(0, document.getElementById('order_subcontainer_adgroup_creatives').offsetTop)"
driver.execute_script(js)
time.sleep(2)
# 清除页面提示
driver.find_element_by_xpath("//div[@class='guider']/div/div/div/div/div[1]").click()
print('清除提示页面1')
time.sleep(1)
# 处理定向
driver.find_element_by_class_name('connectiontype').click()
time.sleep(1)
driver.find_element_by_class_name('connectiontype').click()
time.sleep(1)
# 处理广告版位
# 滚动浏览器滚动条
js = "window.scrollTo(0, document.getElementById('order_subcontainer_adgroup_creatives').offsetTop-50)"
driver.execute_script(js)
time.sleep(2)
# 选中广告版位(利用js点击来解决selenium不能点击的问题)
# 利用js点击
js = "document.getElementsByClassName('fixed-table-container')[0].childNodes[1].firstChild.firstChild.childNodes[6].click();"
driver.execute_script(js)
print('选中广告版位')
time.sleep(1)
# 处理排期与出价
js = "window.scrollTo(0, document.getElementById('order_subcontainer_adgroup_adgroup').offsetTop)"
driver.execute_script(js)
time.sleep(1)
js = "document.getElementsByClassName('form-group')[2].childNodes[0].value = '微信-'+(new Date()).getFullYear()+'-'+((new Date()).getMonth()+1)+'-'+(new Date()).getDate();"
driver.execute_script(js)
print('填写广告名称')
time.sleep(1)
# 反复填写,消灭输入框填写被覆盖
js = "let input_p = document.getElementsByClassName('form-control')[2].getAttribute('placeholder');console.log(input_p);document.getElementsByClassName('form-control')[2].focus();document.getElementsByClassName('tit-wrap')[3].style.display = 'none';"
driver.execute_script(js)
time.sleep(1)
driver.find_element_by_xpath("//input[@class='form-control'][@placeholder='输入价格']").send_keys('1.4')
time.sleep(1)
js = "document.getElementsByClassName('form-control')[2].value = 1.5*1;"
driver.execute_script(js)
print('填写价格')
time.sleep(2)
# 下一步
js = "document.getElementsByClassName('path-btn-line')[1].childNodes[0].click()"
driver.execute_script(js)
print('下一步')
time.sleep(2)
close_alert(driver)
pass
# 进入管理后台
def into_backend():
browser.switch_to.default_content() # 退出iframe
time.sleep(2)
print('即将进入管理后台')
# browser.get('https://e.qq.com/ads/')
browser.find_element_by_id('loginBtn').click()
print('管理后台已经进入')
time.sleep(4)
browser.refresh() # 刷新页面,去除提示
print('刷新完成')
time.sleep(1)
browser.maximize_window()
print('登录过程完成')
time.sleep(3)
# 开始操作
driver = browser
# 新建广告
driver.find_element_by_id('createorder').click()
time.sleep(3)
# 切换浏览器窗口
windows = driver.window_handles
driver.switch_to.window(windows[-1])
print('切换浏览器窗口')
time.sleep(2)
# 添加广告
add_ad(driver)
pass
# 破解滑动验证码
def crack_slider():
print('准备破解验证码')
print('滑动验证码破解完成')
# 进入管理后台
into_backend()
pass
def iframe_login():
# browser切换到iframe里面
iframe = browser.find_element_by_id('ptlogin_iframe')
browser.switch_to.frame(iframe)
print('切换到iframe里面')
browser.find_element_by_id('switcher_plogin').click()
print('密码登录')
time.sleep(2)
browser.find_element_by_name('u').send_keys(qq)
time.sleep(1)
browser.find_element_by_name('p').send_keys(pwd)
print('自动填写账号、密码')
browser.find_element_by_id('login_button').click()
time.sleep(1)
# try: # 不报错,则进入破解滑动验证码
# browser.find_element_by_id('login_button').click()
# time.sleep(3)
# # 准备破解滑动验证码
# crack_slider()
# except(): # 报错则是是没有滑动验证码
# print('不需要滑动验证码')
# # 直接进入管理后台
# into_backend()
into_backend()
pass
# 必要参数设置
qq = '*********' # 账号
pwd = '*********' # 密码
browser = '' # 浏览器对象
ip = [ # 代理ip。https://www.xicidaili.com
# http
['119.101.116.244', 9999],
['119.101.117.134', 9999],
# https
['119.101.112.218', 9999],
['119.101.114.150', 9999],
]
if __name__ == '__main__':
print('启动登录程序')
that_ip = random.randint(0, len(ip)-1)
# IP代理。反复在一个IP上请求登录会激发qq的滑动二维码机制
profile = webdriver.FirefoxProfile()
profile.set_preference('network.proxy.type', 1)
profile.set_preference('network.proxy.http', ip[that_ip][0]) # 代理ip
profile.set_preference('network.proxy.http_port', ip[that_ip][1]) # 端口、int
profile.update_preferences()
print('设置代理IP')
# 打开浏览器
browser = webdriver.Firefox(firefox_profile=profile)
# 打开页面
browser.get(
'https://graph.qq.com/oauth2.0/show?which=Login&display=pc&response_type=code&client_id=101477621&redirect_uri=https%3A%2F%2Fsso.e.qq.com%2Fpassport%3Fsso_redirect_uri%3Dhttps%253A%252F%252Fe.qq.com%252Fads%252F%26service_tag%3D1&scope=get_user_info')
print('打开页面')
browser.implicitly_wait(2) # 隐式等待
iframe_login()
pass
pass
-