我使用 python3.3 和 requests 模块从任意网页抓取链接。我的程序的工作原理如下:我有一个 url 列表,其中一开始只有起始 url。程序遍历该列表并将 URL 提供给过程 GetLinks,在该过程中我使用 requests.get 和 Beautifulsoup 来提取所有链接。在该程序将链接附加到我的 urllist 之前,它会将它们提供给另一个程序 testLinks,以查看它是内部链接、外部链接还是损坏的链接。在 testLinks 中,我也使用 requests.get 来处理重定向等。
到目前为止,该程序运行得非常好,我在相当多的网站上对其进行了测试,并且能够获取包含 2000 个站点等的所有页面链接。但是昨天我在卡巴斯基网络监视器上查看时在一个页面上遇到了问题。在这个页面上,一些 TCP 连接只是没有重置,在我看来,在这种情况下,我的第一个 url 的初始请求不会被重置,连接时间只要我的程序运行。
到目前为止还好。我的第一次尝试是在我的 testLinks 过程中使用 requests.head 而不是 .get。然后一切正常!根据需要释放连接。但问题是,我从 requests.head 获得的信息是不够的,我无法看到重定向的 url 以及发生了多少重定向。然后我尝试了 requests.head 与
allow_redirects=True
但不幸的是,这不是一个真正的 .head 请求,而是一个普通的 .get 请求。所以我遇到了同样的问题。我也尝试使用来设置参数
keep_alive=False
但它也没有工作。我什至尝试在我的 testLinks 中使用 urllib.request(url).geturl() 来解决重定向问题,但是这里发生了同样的问题,TCP 连接没有被重置。为了避免这个问题,我做了很多尝试,我使用了请求会话,但它也遇到了同样的问题。我还尝试了一个带有标题信息 Connection: close 的 request.post,但它没有用。
我分析了一些我认为它被击中的链接,到目前为止,我认为它与 301->302 之类的重定向有关。但我真的不确定,因为在我测试过的所有其他网站上肯定有这样的重定向,它们很常见。
我希望有一个人可以帮助我。对于使用 VPN 连接能够查看所有网站的信息,因为我所在的国家/地区现在阻止了一些页面,这对我来说很有趣。但当然我在没有 VPN 的情况下对其进行了测试,我也遇到了同样的问题。
也许有一个解决方法,因为 testLinks 中的 request.head 就足够了,如果我能够在重定向的情况下看到芬兰 url,也许还有重定向的数量。
如果文本可读性不好,我将提供我的代码方案。
非常感谢!