Getting error "pywintypes.error: (5, 'OpenClipboard', 'Access is denied.')"
Getting error "pywintypes.error: (5, 'OpenClipboard', 'Access is denied.')"
我正在尝试将 selenium 与 python 结合使用,以从 this 站点获取纬度和经度。我也在使用 win32lipboard。但是每当我 运行 我的代码时,它随机地抛出这个错误 pywintypes.error: (5, 'OpenClipboard', 'Access is denied.')
.
这是我的代码:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import csv
import win32clipboard
csvreader = csv.reader(open("master_data.csv", 'r'))
csvwriter = csv.writer(open('final_master_data.csv', 'w', newline=''))
headers = next(csvreader)
headers.append("latitude")
headers.append("longitude")
csvwriter.writerow(headers)
locations = list(csvreader)
chromedriver = 'C:\Users\UserName\Downloads\chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.get('http://www.whatsmygps.com')
for places in locations:
place = places[6] + ", " + places[4] + ", " + places[2]
location = driver.find_element_by_id("address")
location.send_keys(Keys.CONTROL, 'a')
location.send_keys(place)
location.submit()
time.sleep(3)
lat_input = driver.find_element_by_id("latitude")
lat_input.send_keys(Keys.CONTROL, 'a')
lat_input.send_keys(Keys.CONTROL, 'c')
win32clipboard.OpenClipboard()
lat = win32clipboard.GetClipboardData()
places.append(lat)
win32clipboard.CloseClipboard()
lon_input = driver.find_element_by_id("longitude")
lon_input.send_keys(Keys.CONTROL, 'a')
lon_input.send_keys(Keys.CONTROL, 'c')
win32clipboard.OpenClipboard()
lon = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
places.append(lon)
print(places)
csvwriter.writerow(places)
driver.close()
所以,每当我 运行 这段代码开始时,它都没有问题,它读取 csv 文件并将位置名称输入到该站点,然后开始从该站点复制经纬度并将其插入另一个 csv文件。但一段时间后,它会随机抛出错误 pywintypes.error: (5, 'OpenClipboard', 'Access is denied.')
。从昨天开始我就找不到解决办法了。
UPDATE: 我正在使用 Anaconda 并且我 运行ning anaconda shell 作为管理员,所以访问权限没有问题。
如果剪贴板被另一个进程锁定,可能会出现拒绝访问错误。为避免 python 消息,您可以使用 WinAPI 版本的剪贴板,如 SO link 中所述:
作为替代方案,使用需要 API 键的 BingMap。在撰写本文时,您可以在 https://www.bingmapsportal.com 注册一个开发者帐户以获得免费的 API 密钥(我不确定配额)。
import pythoncom
import win32com.client
import json
pythoncom.CoInitialize()
winhttp = win32com.client.Dispatch('WinHTTP.WinHTTPRequest.5.1')
def bing_find_gps(addressLine, postalCode, country):
q = 'http://dev.virtualearth.net/REST/v1/Locations?key='
q = q + 'my_api_key'
if country: q = q + '&countryRegion=' + country
if postalCode: q = q + '&postalCode=' + postalCode
if addressLine: q = q + '&addressLine=' + addressLine
try:
winhttp.Open('GET', q, False)
winhttp.Send()
if not winhttp.responseText:
return 0
list = json.loads(winhttp.responseText)
if list['statusCode'] != 200:
return 0
gps = list['resourceSets'][0]['resources'][0]['point']['coordinates']
if gps:
return (1, gps[0], gps[1])
except:
return 0
res = bing_find_gps('One Microsoft Way, Redmond, WA, 98052-6399', '0', 'United States')
if res:
print("lat/long %s, %s" % (res[1], res[2]))
res = bing_find_gps(0, '98052-6399', 'United States')
if res:
print("lat/long %s, %s" % (res[1], res[2]))
或者使用 openstreetmap.org:
address = "98052-6399" #Testing with Microsoft zip code
url = "https://nominatim.openstreetmap.org/search?format=json&q=" + address
winhttp.Open('GET', url, False)
winhttp.Send()
list = json.loads(winhttp.responseText)
print(list[0].get('lat'))
print(list[0].get('lon'))
预期输出:
Latitude: 47.670119
Longitude: -122.118237
或者您可能还希望避免完全复制元素,使用 get_attribute('value')
读取 latitude
和 longitude
中的值。示例:
chromedriver = 'C:\Users\UserName\Downloads\chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.get('http://www.whatsmygps.com')
element = driver.find_element_by_id("address")
element.send_keys(Keys.CONTROL, 'a')
#enter Microsoft's zip code
element.send_keys('98052-6399')
element.submit()
time.sleep(3)
lat_input = driver.find_element_by_id("latitude")
print('latitude: ')
print(lat_input.get_attribute('value'))
lon_input = driver.find_element_by_id("longitude")
print('longitude: ')
print(lon_input.get_attribute('value'))
driver.close()
我正在尝试将 selenium 与 python 结合使用,以从 this 站点获取纬度和经度。我也在使用 win32lipboard。但是每当我 运行 我的代码时,它随机地抛出这个错误 pywintypes.error: (5, 'OpenClipboard', 'Access is denied.')
.
这是我的代码:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import csv
import win32clipboard
csvreader = csv.reader(open("master_data.csv", 'r'))
csvwriter = csv.writer(open('final_master_data.csv', 'w', newline=''))
headers = next(csvreader)
headers.append("latitude")
headers.append("longitude")
csvwriter.writerow(headers)
locations = list(csvreader)
chromedriver = 'C:\Users\UserName\Downloads\chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.get('http://www.whatsmygps.com')
for places in locations:
place = places[6] + ", " + places[4] + ", " + places[2]
location = driver.find_element_by_id("address")
location.send_keys(Keys.CONTROL, 'a')
location.send_keys(place)
location.submit()
time.sleep(3)
lat_input = driver.find_element_by_id("latitude")
lat_input.send_keys(Keys.CONTROL, 'a')
lat_input.send_keys(Keys.CONTROL, 'c')
win32clipboard.OpenClipboard()
lat = win32clipboard.GetClipboardData()
places.append(lat)
win32clipboard.CloseClipboard()
lon_input = driver.find_element_by_id("longitude")
lon_input.send_keys(Keys.CONTROL, 'a')
lon_input.send_keys(Keys.CONTROL, 'c')
win32clipboard.OpenClipboard()
lon = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
places.append(lon)
print(places)
csvwriter.writerow(places)
driver.close()
所以,每当我 运行 这段代码开始时,它都没有问题,它读取 csv 文件并将位置名称输入到该站点,然后开始从该站点复制经纬度并将其插入另一个 csv文件。但一段时间后,它会随机抛出错误 pywintypes.error: (5, 'OpenClipboard', 'Access is denied.')
。从昨天开始我就找不到解决办法了。
UPDATE: 我正在使用 Anaconda 并且我 运行ning anaconda shell 作为管理员,所以访问权限没有问题。
如果剪贴板被另一个进程锁定,可能会出现拒绝访问错误。为避免 python 消息,您可以使用 WinAPI 版本的剪贴板,如 SO link 中所述:
作为替代方案,使用需要 API 键的 BingMap。在撰写本文时,您可以在 https://www.bingmapsportal.com 注册一个开发者帐户以获得免费的 API 密钥(我不确定配额)。
import pythoncom
import win32com.client
import json
pythoncom.CoInitialize()
winhttp = win32com.client.Dispatch('WinHTTP.WinHTTPRequest.5.1')
def bing_find_gps(addressLine, postalCode, country):
q = 'http://dev.virtualearth.net/REST/v1/Locations?key='
q = q + 'my_api_key'
if country: q = q + '&countryRegion=' + country
if postalCode: q = q + '&postalCode=' + postalCode
if addressLine: q = q + '&addressLine=' + addressLine
try:
winhttp.Open('GET', q, False)
winhttp.Send()
if not winhttp.responseText:
return 0
list = json.loads(winhttp.responseText)
if list['statusCode'] != 200:
return 0
gps = list['resourceSets'][0]['resources'][0]['point']['coordinates']
if gps:
return (1, gps[0], gps[1])
except:
return 0
res = bing_find_gps('One Microsoft Way, Redmond, WA, 98052-6399', '0', 'United States')
if res:
print("lat/long %s, %s" % (res[1], res[2]))
res = bing_find_gps(0, '98052-6399', 'United States')
if res:
print("lat/long %s, %s" % (res[1], res[2]))
或者使用 openstreetmap.org:
address = "98052-6399" #Testing with Microsoft zip code
url = "https://nominatim.openstreetmap.org/search?format=json&q=" + address
winhttp.Open('GET', url, False)
winhttp.Send()
list = json.loads(winhttp.responseText)
print(list[0].get('lat'))
print(list[0].get('lon'))
预期输出:
Latitude: 47.670119 Longitude: -122.118237
或者您可能还希望避免完全复制元素,使用 get_attribute('value')
读取 latitude
和 longitude
中的值。示例:
chromedriver = 'C:\Users\UserName\Downloads\chromedriver.exe'
driver = webdriver.Chrome(chromedriver)
driver.get('http://www.whatsmygps.com')
element = driver.find_element_by_id("address")
element.send_keys(Keys.CONTROL, 'a')
#enter Microsoft's zip code
element.send_keys('98052-6399')
element.submit()
time.sleep(3)
lat_input = driver.find_element_by_id("latitude")
print('latitude: ')
print(lat_input.get_attribute('value'))
lon_input = driver.find_element_by_id("longitude")
print('longitude: ')
print(lon_input.get_attribute('value'))
driver.close()