Procházet zdrojové kódy

涌溢生猪python脚本

xyxie před 1 rokem
rodič
revize
e3afc18381

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 17 - 0
yongyi_pig/imgcode_ak.py


+ 29 - 0
yongyi_pig/readme.txt

@@ -0,0 +1,29 @@
+python+selunium定位已打开的浏览器
+参考文档:https://blog.51cto.com/u_15800928/6952328?articleABtest=0
+我们可以利用Chrome DevTools协议。它允许客户检查和调试Chrome浏览器。
+
+1、找到谷歌浏览器的安装地址,并开启一个新的端口,设置一个文件夹保存浏览器的数据
+mac 脚本:
+>/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222  --user-data-dir=/Users/xiexiaoyuan/data/selenium/automationProfile
+
+windows 脚本:
+打开cmd,输入命令:
+>cd C:\Program Files\Google\Chrome\Application\
+>chrome.exe   --remote-debugging-port=9222  --user-data-dir=D:\data\chrome_selunium\automationProfile
+
+-remote-debugging-port值,可以指定任何打开的端口
+-user-data-dir标记,指定创建新Chrome配置文件的目录。它是为了确保在单独的配置文件中启动chrome,不会污染你的默认配置文件。
+
+此时会打开一个浏览器页面,我们输入目标网址,输入账号密码,登录成功。
+登录之后,以后都不需要登录,它会把你这次登录的信息记入到--user-data-dir指定的目录 下
+后面你只需要python+selenium+webdriver定位到这个已经登录的浏览器进行操作就可以啦
+2、运行python脚本: yongyi_pig_manual.py
+
+注意:1、不确定涌溢的网址登录成功后的有效期有多长,目前测试来看至少有1天时间,如果超过登录有效期,需要人工重新登录网页,
+     2、如果本地机器断电重启,即浏览器被关闭,也需要人工重新运行浏览器的脚本
+
+
+python+selunium+第三方服务商识别图片验证码并自动登录
+我测试了20来次,图片验证码的识别准确率有80%,服务费用:0/500次, 298元/3万次
+第三方服务商网址:https://market.aliyun.com/apimarket/detail/cmapi00035185?spm=5176.730005.result.6.3fcb3524emVIdg&accounttraceid=020a0ff01c6848a592d9f028b5356d2chklv
+运行脚本:yongyi_pig.py

+ 185 - 0
yongyi_pig/yongyi_pig.py

@@ -0,0 +1,185 @@
+# coding:utf-8
+from time import sleep
+import datetime
+import openpyxl
+import requests
+from selenium import webdriver
+
+# 设置Chrome浏览器选项
+from selenium.common import exceptions
+from selenium.webdriver.chrome.service import Service
+from selenium.webdriver.common.by import By
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.support.wait import WebDriverWait
+
+from imgcode_ak import image_code
+
+"""
+根据table的id属性和table中的某一个元素定位其在table中的位置
+table包括表头,位置坐标都是从1开始算
+tableId:table的id属性
+queryContent:需要确定位置的内容
+"""
+
+
+def get_table_content(driver, tableId, queryContent):
+    # 按行查询表格的数据,取出的数据是一整行,按空格分隔每一列的数据
+    table_tr_list = driver.find_element(By.ID, tableId).find_elements(By.TAG_NAME, "tr")
+    table_list = []  # 存放table数据
+    for tr in table_tr_list:  # 遍历每一个tr
+        # 将每一个tr的数据根据td查询出来,返回结果为list对象
+        table_td_list = tr.find_elements(By.TAG_NAME, "td")
+        row_list = []
+        print(table_td_list)
+        for td in table_td_list:  # 遍历每一个td
+            row_list.append(td.text)  # 取出表格的数据,并放入行列表里
+        table_list.append(row_list)
+
+    # 循环遍历table数据,确定查询数据的位置
+    # for i in range(len(table_list)):
+    #     for j in range(len(table_list[i])):
+    #         if queryContent == table_list[i][j]:
+    #             print("%r坐标为(%r,%r)" % (queryContent, i + 1, j + 1))
+
+
+# 写入文件
+def write_excel_xlsx(path, sheet_name, value):
+    index = len(value)  # 列表中所含元组的个数,从而确定写入Excel的行数
+    # 打开Excel
+    wb = openpyxl.Workbook()
+    # wb = load_workbook(path)
+    sheet = wb.active  # 获得一个的工作表
+    sheet.title = sheet_name
+    # 设置格式
+    sheet.column_dimensions['B'].width = 115
+    # 按行加入
+    for i in range(index):
+        sheet.append(value[i])
+    # 保存文件
+    print(sheet.values)
+    wb.save(path)
+    print("题目写入数据成功!")
+
+
+def send_file(url, file_path):
+    with open(file_path, 'rb') as file:
+        files = {'file': file}
+        response2 = requests.post(url, files=files)
+    return response2
+
+
+def get_element(my_driver, xpaths):
+    """
+    判断是否存在元素并获取元素对象
+    :param my_driver:
+    :param xpaths: xpaths表达式
+    :return: 元素对象或为空
+    """
+    try:
+        target = my_driver.find_element(By.XPATH, xpaths)
+    except exceptions.NoSuchElementException:
+        return False
+    else:
+        return target
+
+
+if __name__ == "__main__":
+    # 创建一个 Chrome WebDriver 实例
+    options = webdriver.ChromeOptions()
+    # options.add_argument("headless")
+    # options.add_argument('--headless')
+    options.add_argument('--disable-gpu')
+    options.add_argument('--no-sandbox')
+    options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, '
+                         'like Gecko) Chrome/118.0.5993.70 Safari/537.36')
+    options.add_argument(" window-size=1920,1080")
+    prefs = {'download.prompt_for_download': False, 'download.default_directory': '/Users/xiexiaoyuan/Downloads/'}
+    options.add_experimental_option('prefs', prefs)
+    s = Service(executable_path='/Users/xiexiaoyuan/chromedriver_mac64_114/chromedriver')
+    # s = Service(executable_path='/Users/xi/Desktop/chromedriver')
+    driver = webdriver.Chrome(service=s, options=options)
+    # driver.maximize_window()
+    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
+        "source": """
+                            Object.defineProperty(navigator, 'webdriver', {
+                              get: () => undefined
+                            })
+                          """
+    })
+    driver.get('https://data.yongyizixun888.com/index.php?s=member&c=login&m=index')
+    sleep(2)
+
+    admin_name = 'huawen001'
+    admin_pwd = 'abcd1234'
+    table = driver.find_element(By.XPATH, '//*[@id="myform"]/div[3]/div/div[2]/img')
+    table.screenshot(r'pig.png')
+
+    sleep(2)
+    # 解析图片验证码
+    code = image_code('pig.png')
+    if code == "":
+        print("获取图片验证码失败")
+
+    print(code)
+    # 模拟登录
+    # 输入账号
+    username = driver.find_element(By.XPATH, '//*[@id="myform"]/div[1]/div/input')
+    username.send_keys(admin_name)
+    sleep(1)
+    # 输入密码
+    password = driver.find_element(By.XPATH, '//*[@id="myform"]/div[2]/div/input')
+    password.send_keys(admin_pwd)
+    sleep(1)
+    # 输入验证码
+    capter = driver.find_element(By.XPATH, '//*[@id="myform"]/div[3]/div/div[1]/input')
+    capter.send_keys(code)
+
+    sleep(1)
+    # 登录
+    signup = driver.find_element(By.XPATH, '//*[@id="myform"]/div[4]/button')
+    signup.click()
+
+    sleep(5)
+    # 没有登录成功重试
+    account = driver.find_element(By.XPATH, '//*[@id="dr_member_info"]/a[1]').text
+    print(account)
+    if account != admin_name:
+        # 解析图片验证码
+        table = driver.find_element(By.XPATH, '//*[@id="myform"]/div[3]/div/div[2]/img')
+        table.screenshot(r'pig.png')
+        code = image_code('pig.png')
+        if code == "":
+            print("获取图片验证码失败")
+            # 输入验证码
+        capter = driver.find_element(By.XPATH, '//*[@id="myform"]/div[3]/div/div[1]/input')
+        capter.clear()
+        capter.send_keys(code)
+
+        sleep(1)
+        # 登录
+        signup = driver.find_element(By.XPATH, '//*[@id="myform"]/div[4]/button')
+        signup.click()
+
+    sleep(2)
+
+    account = driver.find_element(By.XPATH, '//*[@id="dr_member_info"]/a[1]').text
+    print(account)
+    if account == admin_name:
+        # 跳转首页
+        driver.find_element(By.XPATH, '/html/body/div[1]/div/div/div[3]/ul/li[1]/a').click()
+        sleep(2)
+        a = driver.find_element(By.XPATH, '/html/body/div[4]/div[1]/div[2]/div[2]/a')
+        print(a.get_attribute("href"))
+        a.click()
+
+        # 下载涌溢完整数据库
+        sleep(1)
+        b = driver.find_element(By.XPATH, '/html/body/div[4]/div[1]/div[2]/div[3]/a')
+        print(b.get_attribute("href"))
+        b.click()
+        sleep(10)
+        print("下载成功")
+    else:
+        print("登录失败")
+
+    driver.close()

+ 140 - 0
yongyi_pig/yongyi_pig_manual.py

@@ -0,0 +1,140 @@
+# coding:utf-8
+from time import sleep
+import datetime
+import openpyxl
+import requests
+from selenium import webdriver
+
+# 设置Chrome浏览器选项
+from selenium.common import exceptions
+from selenium.webdriver.chrome.service import Service
+from selenium.webdriver.common.by import By
+from selenium.webdriver.support import expected_conditions as EC
+from selenium.webdriver.support.wait import WebDriverWait
+
+from imgcode_ak import image_code
+
+"""
+根据table的id属性和table中的某一个元素定位其在table中的位置
+table包括表头,位置坐标都是从1开始算
+tableId:table的id属性
+queryContent:需要确定位置的内容
+"""
+
+
+def get_table_content(driver, tableId, queryContent):
+    # 按行查询表格的数据,取出的数据是一整行,按空格分隔每一列的数据
+    table_tr_list = driver.find_element(By.ID, tableId).find_elements(By.TAG_NAME, "tr")
+    table_list = []  # 存放table数据
+    for tr in table_tr_list:  # 遍历每一个tr
+        # 将每一个tr的数据根据td查询出来,返回结果为list对象
+        table_td_list = tr.find_elements(By.TAG_NAME, "td")
+        row_list = []
+        print(table_td_list)
+        for td in table_td_list:  # 遍历每一个td
+            row_list.append(td.text)  # 取出表格的数据,并放入行列表里
+        table_list.append(row_list)
+
+    # 循环遍历table数据,确定查询数据的位置
+    # for i in range(len(table_list)):
+    #     for j in range(len(table_list[i])):
+    #         if queryContent == table_list[i][j]:
+    #             print("%r坐标为(%r,%r)" % (queryContent, i + 1, j + 1))
+
+
+# 写入文件
+def write_excel_xlsx(path, sheet_name, value):
+    index = len(value)  # 列表中所含元组的个数,从而确定写入Excel的行数
+    # 打开Excel
+    wb = openpyxl.Workbook()
+    # wb = load_workbook(path)
+    sheet = wb.active  # 获得一个的工作表
+    sheet.title = sheet_name
+    # 设置格式
+    sheet.column_dimensions['B'].width = 115
+    # 按行加入
+    for i in range(index):
+        sheet.append(value[i])
+    # 保存文件
+    print(sheet.values)
+    wb.save(path)
+    print("题目写入数据成功!")
+
+
+def send_file(url, file_path):
+    with open(file_path, 'rb') as file:
+        files = {'file': file}
+        response2 = requests.post(url, files=files)
+    return response2
+
+
+def get_element(my_driver, xpaths):
+    """
+    判断是否存在元素并获取元素对象
+    :param my_driver:
+    :param xpaths: xpaths表达式
+    :return: 元素对象或为空
+    """
+    try:
+        target = my_driver.find_element(By.XPATH, xpaths)
+    except exceptions.NoSuchElementException:
+        return False
+    else:
+        return target
+
+
+if __name__ == "__main__":
+    # python+selunium定位已打开的浏览器
+    # 创建一个 Chrome WebDriver 实例
+    options = webdriver.ChromeOptions()
+    # options.add_argument("headless")
+    # options.add_argument('--headless')
+    options.add_argument('--disable-gpu')
+    options.add_argument('--no-sandbox')
+    # 谷歌浏览器运行的默认调试端口:先用以下命令启动浏览器
+    # 找到谷歌浏览器的程序地址,开启一个新的端口,并设置一个文件夹来保存浏览器的数据
+    # /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222  --user-data-dir=/Users/xiexiaoyuan/data/selenium/automationProfile
+    # --remote-debugging-port值,可以指定任何打开的端口
+    # --user-data-dir标记,指定创建新Chrome配置文件的目录。它是为了确保在单独的配置文件中启动chrome,不会污染你的默认配置文件。
+    #
+    # 此时会打开一个浏览器页面,我们输入目标网址,输入账号密码,登录成功。
+    # 登录之后,以后都不需要登录,它会把你这次登录的信息记入到 --user-data-dir指定的目录下
+    # 后面你只需要python + selenium + webdriver定位到这个已经登录的浏览器进行操作就可以啦
+    options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
+    # 修改下载地址
+    options.add_argument("--download.default_directory=/Users/xiexiaoyuan/Downloads/")
+    options.add_argument('--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, '
+                          'like Gecko) Chrome/118.0.5993.70 Safari/537.36')
+    options.add_argument(" window-size=1920,1080")
+
+    s = Service(executable_path='/Users/xiexiaoyuan/chromedriver_mac64_114/chromedriver')
+    # s = Service(executable_path='/Users/xi/Desktop/chromedriver')
+    driver = webdriver.Chrome(service=s, options=options)
+    # driver.maximize_window()
+    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
+        "source": """
+                            Object.defineProperty(navigator, 'webdriver', {
+                              get: () => undefined
+                            })
+                          """
+    })
+    driver.get('https://data.yongyizixun888.com/')
+    sleep(3)
+
+    account = driver.find_element(By.XPATH, '//*[@id="dr_member_info"]/a[1]').text
+    print(account)
+
+    # 下载涌溢日度数据库
+    sleep(1)
+    a = driver.find_element(By.XPATH, '/html/body/div[4]/div[1]/div[2]/div[2]/a')
+    print(a.get_attribute("href"))
+    a.click()
+
+    # 下载涌溢完整数据库
+    sleep(1)
+    b = driver.find_element(By.XPATH, '/html/body/div[4]/div[1]/div[2]/div[3]/a')
+    print(b.get_attribute("href"))
+    b.click()
+    sleep(10)
+    # WebDriverWait(driver, 10).until(
+    #     EC.element_to_be_clickable((By.XPATH, '/html/body/div[4]/div[1]/div[2]/div[2]/a'))).click()

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů