【Python机器人】selenium的安装并利用selenium实现【代理IP+自动登录+利用js点击和处理dom+自动填写文本+自动上传图片】

selenium官方教程:https://python-selenium-zh.readthedocs.io/zh_CN/latest/1.%E5%AE%89%E8%A3%85/

0. 说明:

selenium主要实现模仿人来操作来 自动填写数据,点击按钮,操作dom,缩放浏览器,切换浏览器标签,扩展外部js功能等。selenium不好操作的功能可以用js来操作,比如 自动填写数据,点击按钮,操作dom。

而bs4和scrapy是操作dom,这里还是和selenuim有很大区别。

1. 安装selenium:

推荐使用火狐来操作。

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浏览器能自动打开了百度就证明成功。

     推荐使用火狐来操作。

2. 原则:

1) selenium不能操作的,请使用js操作,比如未展示在可视窗口的标签不可用selenium点击,你可以用js的click()实现点击;

2.)尽量在每个步骤操作完延时0.5秒到3秒,模仿人的习惯操作,可使用time.sleep(s)来实现。值得注意的是selenium会等待页面加载完成才会操作下一步,出现中断可能是因为页面html没有异步渲染完;

3)利用浏览器检查代码功能将xpath快捷取出来,如下图:

【Python机器人】selenium的安装并利用selenium实现【代理IP+自动登录+利用js点击和处理dom+自动填写文本+自动上传图片】_第1张图片

4)打开页面前请使用ip代理,不然IP会被标记;

5)可能存在由一个域名跳入另外一个不同域名,由一个域名向iframe操作,注意主题切换;

6)可以运行jQ

3. 一个完成代码例子:


# 腾讯社交广告自动化素材上传
# 破解滑动验证码(暂时还没有破解)

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

-

你可能感兴趣的:(【Python机器人】selenium的安装并利用selenium实现【代理IP+自动登录+利用js点击和处理dom+自动填写文本+自动上传图片】)