如何让 Python 遍历文本文件中的 URL,检查它们的状态代码,并排除所有 404 错误?

How to make Python go through URLs in a text file, check their status codes, and exclude all ones with 404 error?

我尝试了以下脚本,但遗憾的是输出文件与输入文件相同。我不确定它有什么问题。

import requests

url_lines = open('banana1.txt').read().splitlines()

remove_from_urls = []

for url in url_lines:
    remove_url = requests.get(url)
    print(remove_url.status_code)
    if remove_url.status_code == 404:
        remove_from_urls.append(url)
        continue
        
url_lines = [url for url in url_lines if url not in remove_from_urls]
print(url_lines)

# Save urls example
with open('banana2.txt', 'w+') as file:
    for item in url_lines:
        file.write(item + '\n')

您的代码似乎没有错误,但有几项有助于提高代码的可读性和一致性。第一步应该是确保至少有一个 url 会 return 404 状态代码。

编辑:提供实际 URL 后。

404问题

在你的情况下,问题是 Twitter 实际上 而不是 return 404 错误“未找到”url。您可以使用 curl:

对其进行测试
$ curl -o /dev/null -w "%{http_code}" "https://twitter.com/davemeltzerWON/status/1321279214365016064"
200

或使用Python:

import requests
response = requests.get("https://twitter.com/davemeltzerWON/status/1321279214365016064")
print(response.status_code)

两者的输出应该是200

由于 Twitter 是一个 JavaScript 应用程序,其内容在浏览器中处理后加载,因此您无法在 HTML 响应中找到您要查找的信息。您需要使用像 Selenium 这样的东西来为您实际处理 JavaScript,然后您就可以在网页上查找像“未找到”这样的实际文本。

代码审查

请确保正确关闭文件。此外,file 对象是一个行迭代器,你可以很容易地将它转换为列表。使代码更具可读性的另一个技巧是使用 Python set。所以你可以这样阅读文件:

with open("banana1.txt") as fid:
    url_lines = set(fid)

然后您只需删除所有不起作用的链接:

not_working = set()
for url in url_lines:
    if requests.get(url).status_code == 404:
        not_working.add(url)

working = url_lines - not_working

with open("banana2.txt", "w") as fid:
    fid.write("\n".join(working))

此外,如果某些链接指向同一服务器,您应该使用 requests.Session class:

from requests import Session
session = Session()

然后将 requests.get 替换为 session.get,您应该会得到一些性能提升,因为会话使用 keep-alive 连接和许多其他东西。