分类 其它 下的文章

XPath Helper

技术图片
相比较 Chrome 自身的 html 搜索,这款插件好用之处是可以显示匹配结果,在插件里写出正确的 XPath 语句后再复制到代码里即可。

Toggle JavaScript

技术图片
一键拦截网页所有的 JS,可以快速区分出哪些是异步加载的数据,绝对是爬虫必备神器。

FeHelper

技术图片
这款插件的强大之处不想多说,看上面的截图就行了,其中一些数据转换的功能,在分析请求时会经常用到。

User-Agent Switcher

技术图片
快速修改 UserAgent 的插件,当需要请求移动端页面时,或者需要传特殊的 UA 时,不要忘记它。

X-Forwarded-For Header

技术图片
有时候网站过滤 IP 是通过请求 Headers 中的 X-Forwarded-For 字段,通过这个插件就可以修改此字段,用来快速进行判断。

SwitchyOmega

技术图片
快速切换 HTTP / Socks 代理的插件,还能根据匹配地址自动切换。另一个技巧是配合 Charles、Burp Suite 这类抓包工具,这些工具使用时需要设置本地代理,可以提前设置好用时就切换。

PostMessage()

def keyHwnd(hwndEx, char):
    """
    向指定控件输入值
    :param hwndEx: 控件句柄
    :param char: 字符串
    :return: True or Flase
    """
    try:
        for _ in char:
            print('key:%s    ascii:%d'  % (_, ord(_)))
            win32api.PostMessage(hwndEx, win32con.WM_CHAR, ord(_), 0)
            time.sleep(random.uniform(0,0.2))
    except Exception as e:
        print(e)
        return False

    return True
    
hwnd = win32gui.FindWindow(None,'a.txt - 记事本')
print(hwnd)

win32gui.SetForegroundWindow(hwnd)
hwndex = win32gui.FindWindowEx(hwnd,None,'Edit', None)
keyHwnd(hwndex,'撒地方SDFkof;ldsojfdfdsjfd;slkjfdlksjfkldsjflkdsjlkfjkldsljkfjdssj')
   

切换键盘布局

该功能封装成了一个装饰器,函数执行完恢复了原键盘布局

import win32con
from win32con import WM_INPUTLANGCHANGEREQUEST
import win32gui
import win32api

def setKeyboardLayout_en(inner):

    def wrapper(*args, **kwargs):
        if win32api.LoadKeyboardLayout('0x0409', win32con.KLF_ACTIVATE) == None:
            return Exception('加载键盘失败')
        # 语言代码
        # https://msdn.microsoft.com/en-us/library/cc233982.aspx
        LID = {0x0804: "Chinese (Simplified) (People's Republic of China)",
               0x0409: 'English (United States)'}

        # 获取前景窗口句柄
        hwnd = win32gui.GetForegroundWindow()

        # 获取前景窗口标题
        title = win32gui.GetWindowText(hwnd)
        # 获取键盘布局列表
        im_list = win32api.GetKeyboardLayoutList()
        im_list = list(map(hex, im_list))
        print(im_list)
        oldKey = hex(win32api.GetKeyboardLayout())

        # 设置键盘布局为英文
        result = win32api.SendMessage(
            hwnd,
            WM_INPUTLANGCHANGEREQUEST,
            0,
            0x4090409)
        if result == 0:
            print('设置英文键盘成功!')


        inner(*args,*kwargs)

        result = win32api.SendMessage(
            hwnd,
            WM_INPUTLANGCHANGEREQUEST,
            0,
            oldKey)
        if result == 0:
            print('还原键盘成功!')
    return wrapper


ascii标准码

ascii标准码

keybd_event()

win32api.keybd_event(65, 0, 0, 0)
time.sleep(random.uniform(0, 0.5))
win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0)

microsoft键盘码参考

这位兄弟写的关于模拟键盘非常全

要求

利用python实现禁用键盘鼠标

思路

经过查阅资料目前最好的办法是采用ctypes中的dll文件进行编写

from ctypes import *
improt time

print(winll.shell32.IsUserAnAdmin())  #判断是否有管理员权限


user32 = windll.LoadLibrary("C:\\Windows\\System32\\user32.dll")
user32.BlockInput(True)  #该功能需要管理员权限 True  禁用
time.sleep(5)
user32.BlockInput(Flase)  #该功能需要管理员权限 
time.sleep(5)         

提权

def requireAdministrator(f):
    def inner(*args, **kwargs):
        if windll.shell32.IsUserAnAdmin():
            f()
        else:
            # Re-run the program with admin rights
            windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 0)
            f()
    return inner

官方文档

强制等待

设置等待最简单的方法就是强制等待,其实就是time.sleep()方法,不管它什么情况,让程序暂停运行一定时间,时间过后继续运行;缺点时不智能,设置的时间太短,元素还没有加载出来,那照样会报错;设置的时间太长,则会浪费时间,不要小瞧每次几秒的时间,case多了,代码量大了,很多个几秒就会影响整体的运行速度了;所以尽量少用这个

隐形等待

driver.implicitly_wait(),隐性等待设置了一个时间,在一段时间内网页是否加载完成,如果完成了,就进行下一步;在设置的时间内没有加载完成,则会报超时加载;

# -*- coding: utf-8 -*-  
from selenium import webdriver
import time

driver = webdriver.Chrome()  
driver.implicitly_wait(20) # 隐性等待,最长等30秒  
driver.get('https://www.baidu.com')
time.sleep(3)
driver.quit()

 缺点也是不智能,因为随着ajax技术的广泛应用,页面的元素往往都可以时间局部加载,也就是在整个页面没有加载完的时候,可能我们需要的元素已经加载完成了,那就么有必要再等待整个页面的加载,执行进行下一步,而隐性等待满足不了这一点;

  另外一点,隐性等待的设置时全局性的,在开头设置过之后,整个的程序运行过程中都会有效,都会等待页面加载完成;不需要每次设置一遍;

显性等待

WebDriverWait(driver, 20, 0.5).until(expected_conditions.presence_of_element_located(locator)),selenium中的wait模块的WebDriverWait()方法,配合until或者until_not方法,再辅助以一些判断条件,就可以构成这样一个场景:每经过多少秒就查看一次locator的元素是否可见,如果可见就停止等待,如果不可见就继续等待直到超过规定的时间后,报超时异常;当然也可以判断某元素是否在规定时间内不可见等等的各种场景吧,需要根据你自己实际的场景选择判断条件;

# -*- coding: utf-8 -*-  
from selenium import webdriver  
from selenium.webdriver.support.wait import WebDriverWait  
from selenium.webdriver.support import expected_conditions as EC  
from selenium.webdriver.common.by import By  
driver = webdriver.Firefox()
driver.get('https://huilansame.github.io')  
WebDriverWait(driver,20,0.5).until(
    EC.presence_of_element_located((By.LINK_TEXT, 'CSDN')))  
print driver.find_element_by_link_text('CSDN').get_attribute('href')
driver.close()

expected_conditions模块中提供了很多可以提供判断的条件:

selenium.webdriver.support.expected_conditions(模块)  

这两个条件类验证title,验证传入的参数title是否等于或包含于driver.title  

title_is  

title_contains  

这两个人条件验证元素是否出现,传入的参数都是元组类型的locator,如(By.ID, 'kw')  

顾名思义,一个只要一个符合条件的元素加载出来就通过;另一个必须所有符合条件的元素都加载出来才行  

presence_of_element_located  

presence_of_all_elements_located  

这三个条件验证元素是否可见,前两个传入参数是元组类型的locator,第三个传入WebElement  

第一个和第三个其实质是一样的  

visibility_of_element_located  

invisibility_of_element_located  

visibility_of  

这两个人条件判断某段文本是否出现在某元素中,一个判断元素的text,一个判断元素的value  

text_to_be_present_in_element  

text_to_be_present_in_element_value  

这个条件判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement  

frame_to_be_available_and_switch_to_it  

这个条件判断是否有alert出现  

alert_is_present  

这个条件判断元素是否可点击,传入locator  

element_to_be_clickable  

这四个条件判断元素是否被选中,第一个条件传入WebElement对象,第二个传入locator元组  

第三个传入WebElement对象以及状态,相等返回True,否则返回False  

第四个传入locator以及状态,相等返回True,否则返回False  

element_to_be_selected  

element_located_to_be_selected  

element_selection_state_to_be  

element_located_selection_state_to_be  

最后一个条件判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了  

staleness_of

参考链接

chromedriver设置下载路径

在下载文件时如果不设置下载路径,这种情况就会弹出一个windows弹窗让你选在下载路径,假如是人操作无所谓,但是要是进行自动化操作那种比较麻烦了,还要通过控制windows窗体设置下载路径。

但是对于selenium只需要简单的设置一个chrome_options参数就ok了

from selenium import webdriver
options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': r'd:\'}
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(chrome_options=options)
driver.maximize_window()
driver.get(r'测试url')

profile.default_content_settings.popups:0 禁止弹出窗口

download.default_directory 设置下载位置