Ethernet shield permanently returning 0.0.0.0 after working for a few hours

This is incorrect.

Ethernet.begin(mac, ip, gateway, subnet);
  Serial.println(Ethernet.localIP());

V1.0 uses a different format. If you specify more than just the ip, you must specify a dns server ip. Normally, if you do not plan on resolving any domain names, you can use the gateway for that ip. My routers will provide localnet ips with dns service.

Ethernet.begin(mac, ip, gateway, gateway, subnet);
  Serial.println(Ethernet.localIP());

edit: And you are not reading the response from the server. You requested the page. At least be polite enough to read it. You don't have to do anything with it. Let the server close the connection.

while(client.connected())
{
   // stay in this loop until the server closes the connection
   while(client.available())
   {
      client.read();
   }
}
// now close your end
client.stop();

Also, if your ethernet shield has a microSD card reader, you need to disable the SD SPI interface if you do not plan on using it. In setup() before Ethernet.begin() call:

pinMode(4,OUTPUT);
digitalWrite(4,HIGH);