Python-数据挖掘-请求伪装
一、超时设置
假设有个请求,要爬取1000个网站,如果其中有100个网站需要等待30s才能返回数据,如果要返回所有的数据,至少需要等待3000s。
可以为 HTTP 请求设置超时时间,一旦超过这个时间,服务器还没有返回响应内容,就会抛出一个超时异常,这个异常需要使用 try 语句来捕获。
例如,使用一个 IP,它的响应速度需要2秒。如果将超时时间设置为 1s,程序就会抛出异常。
import urllib.request
try:
url = "http://47.104.14.43:8000"
# timeout 设置超时的时间
file = urllib.request.urlopen(url, timeout=1)
result = file.read()
print(result)
except Exception as error:
print(error)
二、网络异常
使用 urlopen() 方法发送 HTTP 请求时,如果 urlopen() 不能处理返回的响应内容,就会产生错误。
① URLError 异常和捕获
URLError 产生的原因主要有以下几种:
可以使用 try...except 语句捕获相应的异常。
import urllib.request
import urllib.error
request = urllib.request.Request("http://www.shujuyuntuan.com")
try:
urllib.request.urlopen(request, timeout=5)
except urllib.error.URLError as err:
print(err)
输出结果为:
<urlopen error [Error 11004] getaddrinfo failed>
报错信息是 urlopen error,错误代码是11004。发生错误的原因是没有找到指定的服务器。
② HttpError 异常和捕获
每个服务器的 HTTP 响应都有一个数字响应码,这些响应码有些表示无法处理请求内容。如果无法处理,urlopen() 会抛出 HTTPError。HTTPError 是 URLError 的子类,它的对象拥有一个整型的 code 属性,表示服务器返回的错误代码。
import urllib.request
import urllib.error
request = urllib.request.Request("http://47.104.14.43/index")
try:
urllib.request.urlopen(request)
except urllib.error.HTTPError as e:
print(e.code)
如果输出了 404 的错误码,表示没有找到这个页面。