如何让 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 连接和许多其他东西。
我尝试了以下脚本,但遗憾的是输出文件与输入文件相同。我不确定它有什么问题。
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 连接和许多其他东西。