CAPTCHA is the most well-known solution, but if you're looking for something simple, I've found that this works quite well: set your form's submit URL to blank (or something invalid) and introduce it via JavaScript. So far, I haven't seen a bot that executes JavaScript to get past forms. This does mean that users need to have JavaScript enabled, but most do anyway.
Example:
<form id="myform" action="" onsubmit="return doSubmit();">
...
</form>
<script type="text/javascript">
function doSubmit() {
// You can also do any validation here if required
document.getElementById('myform').action = 'real_submit_url';
return true;
}
</script>