Python请求获取一个应该正常工作的URL的错误页面

时间:2015-07-29 15:31:09

标签: python http curl python-requests

我正在尝试使用python脚本在政府网站上搜索一些页面。我让它访问a 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

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

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>

为了便于阅读,这里的错误页面基本上是这样的:

  

拒绝访问

     

您无权访问“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>

2 个答案:

答案 0 :(得分:2)

好吧这是最愚蠢的问题,我真的不明白为什么会这样,但我解决了。无论如何,我的帖子中的脚本是有效的,因为我不小心将我的用户代理更改为“nyc_contractors.py”。脚本在我结束时失败,因为在我运行的实际版本中,我有“nyc_contractor_scraper.py”,并且由于某种原因它不喜欢那个特定的用户代理(可能是黑名单“刮刀”?谁知道)

答案 1 :(得分:1)

我遇到了同样的事情。问题是网站阻止了python请求用户代理。

您可以通过@Yohann在httplib级别调试explained in this answer来检查您的用户代理是什么。

您可以将requests使用的用户代理更改为explained here @birryree。

将用户代理更改为未阻止的用户代理可以解决问题,如果这也是您正在发生的事情。