我刚开始学习Python,知道就是专家。我的专业领域是VBA。
当涉及从网络中提取数据时,如果你是通过VBA这样做的话,那么winHttp是最好的方法。但是,对于VBA,您仅限于单线程。解决这个问题的一种方式是使用VBScript。虽然VBScript路由是最简单的方法,因为VBA和VBS几乎完全相同,但Python在我阅读的内容中似乎是最好的语言。
我在下面提供了两个示例,一个用VBA编写(工作),另一个用Python编写(不工作)。
VBA
Dim postData As String
Dim myHttp2 As WinHttp.WinHttpRequest
'postData is the form data sent in the request body that contains a users login credentials
postData = "SMNC-ISO&LOC=US&target=HTTPS%3AIntranetSite.net&postpreservationdata=&USER=usr123&PASSWORD=pwd123"
set myHttp2 = CreateObject("winHTTP.WinHTTPrequest.5.1")
myHttp2.Open "GET", "https://login.someintranetsite.net", true
myHttp2.setRequestHeader "Request", "GET /abcd123/4567 HTTP/1.1"
myHttp2.setRequestHeader "Accept", "stuff"
myHttp2.setRequestHeader "Accept-Language", "en-US"
myHttp2.setRequestHeader "User-Agent", "stuff"
myHttp2.setRequestHeader "Accept-Encoding", "stuff"
myHttp2.setRequestHeader "Host", "login.someintranetsite.net"
myHttp2.send postData
myHttp2.WaitForResponse
Debug.Print myHttp2.responseText
'obtains the session cookie needed for other requests not shown here
cookie = myHttp2.getResponseHeader("Set-Cookie")
以上结果是来自服务器的有效响应..但是使用Python ......
的Python
from bs4 import BeautifulSoup
import requests
payload = 'SMNC-ISO&LOC=US&target=HTTPS%3AIntranetSite.net&postpreservationdata=&USER=usr123&PASSWORD=pwd123'
headers = {'Request': 'GET /abcd123/4567 HTTP/1.1',
'Accept' : 'stuff',
'Accept-Language': 'en-US',
'Connection': 'stuff',
'Host': 'someintranetsite.net',
'User-Agent': 'stuff',
'Accept-Encoding': 'stuff'
}
result = requests.get(url="https://login.someintranetsite.net", headers=headers, data=payload)
print result.content
当我尝试运行上面的python时,我得到以下结果:
File "C:\Program Files (x86)\Anaconda\lib\site-packages\requests\api.py", line 55, in get
return request('get', url, **kwargs)
File "C:\Program Files (x86)\Anaconda\lib\site-packages\requests\api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Program Files (x86)\Anaconda\lib\site-packages\requests\sessions.py", line 456, in request
resp = self.send(prep, **send_kwargs)
File "C:\Program Files (x86)\Anaconda\lib\site-packages\requests\sessions.py", line 559, in send
r = adapter.send(request, **kwargs)
File "C:\Program Files (x86)\Anaconda\lib\site-packages\requests\adapters.py", line 378, in send
raise ProxyError(e)
ProxyError: ('Cannot connect to proxy.', error(10061, 'No connection could be made because the target machine actively refused it'))
我搜索并搜索了这个问题的解决方案,并尝试了一些不同的方法但没有成功。我究竟做错了什么? (顺便说一下上面是在Spyder / IPython中完成的)
奖金问题..如何在Python中获取会话cookie?非常感谢帮助!谢谢!
答案 0 :(得分:0)
该问题应该由代理身份验证失败引起。
解决此问题的两种解决方案:
如果是基本身份验证,请将您的代理传递给requests.get / post,如下所示:
proxies = {
"http": 'http://user:password@proxy.com/',
"https": 'https://user:password@proxy.com/',
}
response = requests.get(url, proxies=proxies)
您可以参考The Official Website of Python Requests了解如何为其他方法进行身份验证。
代码如下:
import requests
url = "http://test:180/test.aspx"
session = requests.Session()
session.trust_env = False #disable OS proxy
headers = {}
response = session.get(url, headers=headers)
print(response.text)
#use empty proxy instead
proxies = {
"http": None,
"https": None,
}
response = requests.get(url, auth=HTTPBasicAuth('test', 'test'), proxies=proxies)
print (response)