Python 请求得到一个应该可以正常工作的 URL 的错误页面

Hay*_*iff 5 python curl http python-requests

我正在尝试使用 python 脚本来抓取政府网站上的一些页面。我让它访问一个在我的网络浏览器中加载正常网页的 URL,但由于某种原因,该脚本得到一个“访问被拒绝”页面而不是预期的页面。

此外,这个“拒绝访问”错误与我在政府网站上见过的任何错误都不同。除了我的 python 脚本之外,我无法通过任何方式实现此错误。

这是我的脚本的精简版本(它相当大,所以我删除了我认为不相关的部分):

import requests

headers = {
    'Accept': "*/*",
    'User-Agent': "nyc_contractors.py",
    'X-Love': "hey sysadmin! you're awesome! <3"
}

print "and we're off!"

qLicensetype="C"
qBizname = "a"

baseUrl = "http://a810-bisweb.nyc.gov/bisweb/ResultsByNameServlet?bizname="+qBizname+"&licensetype="+qLicensetype
nextUrl = baseUrl

while nextUrl != None:

    print
    print "URL:", nextUrl

    r = requests.get(nextUrl, headers=headers)
    nextUrl = None # kill the url (if there's a next page, we'll restore the url later)
    print "actual url:",r.url

    lines = r.text.splitlines()

    for line in lines:
        print "L:", line
Run Code Online (Sandbox Code Playgroud)

这是运行该脚本的日志输出:

and we're off!

URL: http://a810-bisweb.nyc.gov/bisweb/ResultsByNameServlet?bizname=a&licensetype=C
actual url: http://a810-bisweb.nyc.gov/bisweb/ResultsByNameServlet?bizname=a&licensetype=C
L: <HTML><HEAD>
L: <TITLE>Access Denied</TITLE>
L: </HEAD><BODY>
L: <H1>Access Denied</H1>
L:  
L: You don't have permission to access "http&#58;&#47;&#47;a810&#45;bisweb&#46;nyc&#46;gov&#47;bisweb&#47;ResultsByNameServlet&#63;" on this server.<P>
L: Reference&#32;&#35;18&#46;85600317&#46;1438181595&#46;a09a236f
L: </BODY>
L: </HTML>
Run Code Online (Sandbox Code Playgroud)

为了便于阅读,该错误页面基本上如下所示:

拒绝访问

您无权访问“ http://a810-bisweb.nyc.gov/bisweb/ResultsByNameServlet?” 在此服务器上。

参考#18.85600317.1438181008.a0891486

需要注意的一些事项:

  • 这台机器同时运行一个不同的脚本,该脚本也使用请求从不同的网站下载页面。这不会干扰……可以吗?
  • 我想也许这个网站阻止了我,因为它不喜欢我的用户代理或其他东西,所以我尝试通过 cURL 访问 URL,它在我的浏览器中运行得一样好。

有谁知道问题可能是什么?非常感谢。

编辑:我忘记提及的事情。我注意到它处理多个请求的速度比看起来可行的速度要快,所以我想它可能以某种方式连接到本地计算机上运行的 Web 服务器,但我没有看到任何看起来像是我的源中的请求。本地服务器的访问日志。

编辑:@Alik 建议我在启用日志记录的情况下重新运行本地脚本,因此输出如下:

URL: http://a810-bisweb.nyc.gov/bisweb/ResultsByNameServlet?bizname=s&licensetype=B
INFO:urllib3.connectionpool:Starting new HTTP connection (1): a810-bisweb.nyc.gov
DEBUG:urllib3.connectionpool:"GET /bisweb/ResultsByNameServlet?bizname=s&licensetype=B HTTP/1.1" 403 309
actual url: http://a810-bisweb.nyc.gov/bisweb/ResultsByNameServlet?bizname=s&licensetype=B
L: <HTML><HEAD>
L: <TITLE>Access Denied</TITLE>
L: </HEAD><BODY>
L: <H1>Access Denied</H1>
L:  
L: You don't have permission to access "http&#58;&#47;&#47;a810&#45;bisweb&#46;nyc&#46;gov&#47;bisweb&#47;ResultsByNameServlet&#63;" on this server.<P>
L: Reference&#32;&#35;18&#46;85600317&#46;1438184686&#46;a0f4b341
L: </BODY>
L: </HTML>
Run Code Online (Sandbox Code Playgroud)

Hay*_*iff 3

好吧,这是最愚蠢的问题,我真的不明白为什么会发生这种情况,但我解决了。不管怎样,我帖子中的脚本是有效的,因为我不小心将我的用户代理更改为“nyc_contractors.py”。该脚本在我这边失败了,因为在我运行的实际版本中,我有“nyc_contractor_scraper.py”,并且由于某种原因它不喜欢那个特定的用户代理(也许它会将“scraper”列入黑名单?谁知道)