在数据为王的时代,训练一个优秀的模型,需要大量的数据。通过网络收集有效数据无疑是一个快捷有效的方式。在爬取网络数据时,需要频繁向同一个网站发送请求。这不,小梅同学在访问某食谱网站时遇到了错误
{"result":0,"code":-8,"msg":"operation too frequent."}
查资料后,尝试了以下几种方案,记录如下:
- 方案一:等等
def request_site(self, url):
# 随机产生一个等待时间值
duration = random.randint(10,20)
time.sleep(duration)
result = requests.get(url)
- 方案二:随机 user-agent
from fake_useragent import UserAgent
def request_site(self, url):
user_agent = UserAgent()
headers = dict()
headers['User-Agent'] = user_agent.random
result = requests.get(url, headers=header)
- 方案三:代理ip
首先需要获取代理ip。可购买(如 芝麻代理 , 代理蚂蚁 等),或从免费ip网站上爬取。不管付费还是免费的,只想说,谁用谁知道! 既然良莠不齐,那验证代理ip是否有效的方法就及其重要。目前发现常用的两种验证代理ip是否有效的方法。
方法1:响应状态码是200
def check_proxy(self,ip):
tar_url = "https://www.baidu.com/"
proxies = { "http": ip, }
try:
res = requests.get(tar_url, proxies=proxies, timeout=5)
# 响应状态码是200,则是有效的
if res.status_code == 200:
return True
else:
return False
except requests.RequestException as e:
return False
方法2:判断访问的ip是否为代理ip。
访问类似http://icanhazip.com/ 这样的网站,网站会返回访问者的ip,如果访问者的ip等于代理的ip。那么此代理IP就生效了。
def check_proxy(self,ip):
try:
this_proxy = "http://" + IP
this_ip = "".join(IP.split(":")[0:1])
res = requests.get(url="http://icanhazip.com/", timeout=8, proxies={"http": this_proxy })
# 判断返回的ip是否等于代理ip
if res.text.strip() == this_ip:
return True
else:
return False
except Exception as error:
return False
小梅同学分别从
http://www.data5u.com/, http://www.66ip.cn/,http://www.goubanjia.com/, https://www.kuaidaili.com,http://www.ip3366.net/free/, http://ip.jiangxianli.com/, http://www.89ip.cn/index.html, http://www.xiladaili.com/ 这几个网上上采集到了350个免费代理ip。方法一,测试代理ip全部通过,目前还没找到造成这种测试结果的原因(方法不对? or 代理ip无效?,后续如果有近一步进展,会同步文档)。方法二,350个免费代理ip,第一次过滤剩下约40个,接着第一次的过滤结果,进行第二次过滤剩下约30个,再次进行第三次过滤剩下约20个。充分说明了免费代理ip的正确性不足10%,也存在一定的不稳定性。
最后,实践证明,方案一最简单有效。哈哈哈~