【问题标题】:How do I stop the 302 url redirection in a simple web crawl?如何在简单的网络爬网中停止 302 url 重定向?
【发布时间】:2017-05-12 12:40:55
【问题描述】:

我正在尝试使用 Python 中的 Requests 库来抓取网站,当我尝试时:

r = requests.get('http://www.cell.com/cell-stem-cell/home', allow_redirects = False)
>>> r.status_code
302
>>> r.text
'The URL has moved <a href="https://secure.jbs.elsevierhealth.com/action/getSharedSiteSession?redirect=http%3A%2F%2Fwww.cell.com%2Fcell-stem-cell%2Fhome&rc=0&code=cell-site">here</a>\n'

当我尝试时:

>>> r = requests.get("https://secure.jbs.elsevierhealth.com/action/getSharedSiteSession?redirect=http%3A%2F%2Fwww.cell.com%2Fcell-stem-cell%2Fhome&rc=0&code=cell-site")
>>>
>>> r.text
'\n\n\n\n\n<style type="text/css">\n    .hidden {\n        display: none;\n        visibility: hidden;\n    }\n</style>\n\n<!-- hidden iFrame for each of the SSO URLs -->\n<div class="hidden">\n    \n        <iframe src="//acw.secure.jbs.elsevierhealth.com/SSOCore/update?utt=81c120bb854495181ef4ef3f679b12261e956c5-JKh">Your browser doesn\'t support iFrames!</iframe>\n    \n        <iframe src="//acw.sciencedirect.com/SSOCore/update?utt=81c120bb854495181ef4ef3f679b12261e956c5-JKh">Your browser doesn\'t support iFrames!</iframe>\n    \n        <iframe src="//acw.scopus.com/SSOCore/update?utt=81c120bb854495181ef4ef3f679b12261e956c5-JKh">Your browser doesn\'t support iFrames!</iframe>\n    \n        <iframe src="//acw.sciverse.com/SSOCore/update?utt=81c120bb854495181ef4ef3f679b12261e956c5-JKh">Your browser doesn\'t support iFrames!</iframe>\n    \n        <iframe src="//acw.mendeley.com/SSOCore/update?utt=81c120bb854495181ef4ef3f679b12261e956c5-JKh">Your browser doesn\'t support iFrames!</iframe>\n    \n        <iframe src="//acw.elsevier.com/SSOCore/update?utt=81c120bb854495181ef4ef3f679b12261e956c5-JKh">Your browser doesn\'t support iFrames!</iframe>\n    \n</div>\n\n\n\n<noscript>\n    <a href="CANT POST LINK BECAUSE OF LACK OF REPUTATION POINTS OF STACK OVERFLOW">Redirect</a>\n</noscript>\n\n<!-- redirect to the product page after all iFrames are rendered -->\n<script>\n    setTimeout(redirectFun,2000);\n    var iFramesList = document.getElementsByTagName("iframe");\n    var renderedIFramesCount = 0;\n    var numberOfIFrames = iFramesList.length;\n    for (var i = 0; i < iFramesList.length; i++) {\n        var iFrame = iFramesList[i];\n        bindEvent(iFrame, \'load\', function(){\n            renderedIFramesCount = renderedIFramesCount + 1;\n            if (renderedIFramesCount >= numberOfIFrames)\n            {\n                redirectFun();\n            }\n        });\n    }\n    var doRedirect = true;\n    function redirectFun() {\n        if (doRedirect)\n            window.location.href = "CANT POST THIS WEBSITE BECAUSE OF MY REPUTATION POINTS ON STACKOVERFLOW";\n        doRedirect = false;\n    }\n\n    function bindEvent(el, eventName, eventHandler) {\n        if (el.addEventListener){\n            el.addEventListener(eventName, eventHandler, false);\n        } else if (el.attachEvent){\n            el.attachEvent(eventName, eventHandler);\n        }\n    }\n</script>\n\n'

我只想获取原始网站的 HTML。

【问题讨论】:

  • 注意:r.text 内容为:URL 已移至此处\n ,第二个获取请求中的链接带有“a href”
  • 尝试使用硒。它模拟了一个浏览器,所以它可能没有这个问题。
  • 我认为您的问题不是 302 重定向问题。这更像是一个抓取身份验证问题。

标签: python http python-requests httpresponse http-status-code-302


【解决方案1】:

您必须在请求标头中发送 User-agent 以使网站相信请求来自真实的 Web 浏览器。因此,如果您想要非重定向 url 的内容,您的代码应该是

from requests import get
content = get('http://www.cell.com/cell-stem-cell/home', headers = {'User-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36
 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'},allow_redirects = False).content
print content

输出将是:

The URL has moved <a href="https://secure.jbs.elsevierhealth.com/action/getShar
edSiteSession?redirect=http%3A%2F%2Fwww.cell.com%2Fcell-stem-cell%2Fhome&rc=0&co
de=cell-site">here</a>

如果您想要重定向 url 的内容,则允许重定向,但包括用户代理标头。此方法适用于大多数不在其网站上使用动态内容的网站。如果您想从动态内容网站抓取数据,则必须使用网络浏览器模拟器,例如 selinium

【讨论】:

  • 这绝对是有道理的,但是您能否扩展“如果您想要重定向 url 的内容然后允许重定向,但包括用户代理标头。”,好吗?
  • 如果您想要来自重定向 url 的数据,那么您的请求应该是 content= get('http://www.cell.com/cell-stem-cell/home', headers = {'User-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'}).content 其中内容将具有重定向 url 的 html 源。默认情况下,请求处理重定向,因此不需要allow_redirects =True
【解决方案2】:

您只需要很少的工作就可以直接获得它。需要重定向时,服务器会发送 Location 标头。您只需要访问该 Location 标头中的 URL。

r = requests.get('http://www.cell.com/cell-stem-cell/home')
if r.status_code==302:
    r1 = requests.get(r.headers['Location'])

您将在r1.contentr1.text 中获得所需的数据

【讨论】:

  • 为了处理上述代码中的所有重定向,您可以像这样检查。 if r.status_code/100==3: 所以这将适用于所有重定向,如 300,301,303,304,....
猜你喜欢
  • 2023-03-13
  • 2014-09-23
  • 1970-01-01
  • 2017-01-26
  • 2016-06-23
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多