我发现自己网站有些页面不适合被爬虫记录(比如一篇文章的浏览量,应该记录真人访问的,结果浏览量全是机器人带来的),因此可以采取一些防爬措施,毕竟有些内容不是访问越多越好的
一.robots.txt
User-agent: *
Disallow:/private/
Disallow:/api/user/
但我不推荐robots.txt,一是会暴露敏感路径,二是太麻烦,后续多个页面不好逐一添加.
二.UA判断
python
BAD_UA_KEYWORDS=[
'bot', 'spider', 'crawl', 'slurp', 'baidu', 'yandex', 'sogou',
'bingpreview', 'facebookexternalhit', 'python-requests',
'curl', 'wget', 'httpclient', 'scrapy', 'headless', 'phantom',
'selenium', 'puppeteer', 'playwright', 'go-http-client',
'java/', 'okhttp', 'axios', 'libwww', 'lwp-', 'masscan', 'nmap']
def isLikelyBot():
ua=request.headers.get('User-Agent','').lower()
if not ua:#如果没有ua
return True
for kw in BAD_UA_KEYWORDS:#如果有ua黑名单
if kw in ua:
return True
正常的浏览器都会有UA,这一条可以拦住大部分低级爬虫,为了保险可以加上后面两条:
python
if not request.headers.get('Accept-Language'):
return True
if request.headers.get('Accept')=='*/*':
return True
三.限流
安装:
python
pip install Flask-Limiter
在服务端里添加:
python
from flask_limiter import Limiter
from flask_limiter.util import get_remote_address
limiter=Limiter(app=app,key_func=get_remote_address,default_limits=["200 per day","50 per hour","15 per minute"],
storage_uri="memory://",)#限制访问流量
第二第三条亲测比较好用,对于我这种低访问量的网站来说能拦住大部分爬虫
四.去重
python
import time
_seen = {}
def is_first_view(article_id, window=1800):
ip = request.remote_addr or '0.0.0.0'
key = (article_id, ip)
now = time.time()
last = _seen.get(key)
if last and now - last < window:
return False
_seen[key] = now
if len(_seen) > 20000:#防内存无限涨
for k in [k for k, v in _seen.items() if now - v > window]:
_seen.pop(k, None)
return True
如果短时间一直访问,浏览量只会加一
文章链接:flask服务端页面预防被爬措施