Python Scraping,发送和请求正文'数据

时间:2018-02-08 21:19:24

标签: python web-scraping python-requests httprequest

我刚开始学习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?非常感谢帮助!谢谢!

1 个答案:

答案 0 :(得分:0)

该问题应该由代理身份验证失败引起。

解决此问题的两种解决方案:

  1. 尝试联系您的网络管理员以获取身份验证方法(如NTLM,Basic Auth,Digest等)以及用户名和密码。 据我所知,Python请求并不支持NTLM。因此,如果NTLM,您无法进行代理身份验证。
  2. 如果是基本身份验证,请将您的代理传递给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了解如何为其他方法进行身份验证。

    1. 另一种解决方案是忽略操作系统代理设置。(但由于贵公司的安全策略,访问外部网络资源时可能会阻止请求)有两种方法可以实现此目的(session.trust_env = false;或your_proxy = {' http':无,' https:':无'}。
    2. 代码如下:

      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)