当今互联网一大抄,搜索引擎遍布重复内容,大站采集小站,小站苟延残喘,作为一名网站主该如何杜绝爬虫,防止内容被抓取呢?附送私家内容:采集三大绝招。
本文来自著名MJJ论坛ID: 委员,仅供参考,本篇内容无版权,任意COPY,所引起的任何法律纠纷与本ID无关。
防采集三大招
1、防采集三大招第一招之加钱可及
最简单直接的方法,在DNS层面过滤爬虫IP,Dnspod付费版提供了分线路解析,针对机房IP解析到127.0.0.1。很多大站采用了这种方式,可以规避大部分垃圾国内爬虫。
2、防采集三大招第二招之触不可及
通过user_agent判断特征码过滤蜘蛛,主要针对国外数据收集爬虫,有些蜘蛛真的是玩命爬,很容易造成宕机。Nginx 配置代码
set $flag 0; if ($http_user_agent ~* (spider|bot|X11|Scrapy|colly|curl|HttpClient|python|php|Java|SM-G900P)) { set $flag "${flag}1"; } if ($http_user_agent !~* (baidu|so|360|sogou|toutiao|google|bing|sm|yandex)){ set $flag "${flag}2"; } if ($flag = "012") { return 403; set $logfile /home/wwwlogs/black.log; access_log /$logfile; }
简单说明下,一般蜘蛛都会有bot或者Spider特征码,比如Baiduspider,过滤掉不需要的非主流蜘蛛,还有些是Python和Go写的爬虫,用的默认头,也可以过滤掉。
高级玩法: Bash脚本定期分析black.log日志,提取垃圾蜘蛛IP加到Iptables,把蜘蛛拦截在防火墙外,效率更高。
当然你也可以和我抬杠说,我伪造user_agent爬不就得了,但是IP是不可能伪造的,比如百度蜘蛛就beijing和山西两个IP归属地,作为网站站长养成看日志的习惯,人工判断才是最有效的。
3、防采集三大招第三招之一触即发
在Nginx中限制Ip爬取频率,限制同一IP最大并发数和爬取速率,但这种方式有可能误伤。
在nginx.conf里的http{}里加上如下代码:
limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m;
在需要限制并发数和下载带宽的网站配置server{}里加上如下代码:
limit_conn perip 2; limit_conn perserver 20; limit_rate 100k;
补充下参数说明:
$binary_remote_addr是限制同一客户端ip地址;
$server_name是限制同一server最大并发数;
limit_conn为限制并发连接数;
limit_rate为限制下载速度;
私家内容:采集三大绝招
这里仅讨论Python采集思路,高i铁头这种门槛较低,只适合小规模爬内容。
1、Selenium WebDrive
Selenium WebDriver本用于web应用程序的自动化测试,因为是通过浏览器的驱动(web driver)来驱动操作浏览器,所以可以100%的模拟浏览器的行为,主要针对一些有交互动作的站,比如下拉才能显示内容的。因为涉及内容较多,有兴趣的可以自行Google,这里分享个自用函数。
from selenium import webdriver from selenium.webdriver.common.keys import Keys def fetch_html(url): chrome_options = webdriver.ChromeOptions() chrome_options.add_argument("--headless") chrome_options.add_argument('no-sandbox') chrome_options.add_argument(" --window-size=1920x1080") chrome_options.add_argument('disable-dev-shm-usage') chrome_driver = os.getcwd() +"/chromedriver" driver = webdriver.Chrome(chrome_options=chrome_options,executable_path=chrome_driver) driver.get(url) elem = driver.find_element_by_tag_name("body") no_of_pagedowns = 2 while no_of_pagedowns: elem.send_keys(Keys.PAGE_DOWN) time.sleep(0.2) no_of_pagedowns-=1 html_source = driver.page_source driver.quit() return html_source
2、fake_useragent 伪造浏览器特征
前面也说了可以通过特征码屏蔽爬虫,反过来也可以伪造浏览器特征码,推荐fake_useragent,使用方法:
from fake_useragent import UserAgent header = { "user-agent": UserAgent().chrome }
3、无论是模拟浏览器还是随机浏览头,都容易因为爬取过多被屏蔽IP,比如百度下面的栏目,几乎都作了IP限制,最多爬个几千条就会被Ban,这时候就要用到另一神器动态IP代*理,可以自建代*理池,也可以用现成的,这里只说使用方法:
def get_proxie(random_number): ip_random = -1 url = ' '#代*理API result = requests.get(url).text ip_list = result.split() if random_number == -1: random_number = random.randint(0, len(ip_list) - 1) ip= ip_list[random_number].strip() proxies = { 'https': ip} return proxies proxies = get_proxie(ip_random) requests.get(url, headers=headers,params=params,proxies=proxies,timeout=10)
随机UserAgen+动态IP,只要池子足够大基本可以做到百战百胜,无所不能爬,如果有验证码,还要把验证码识别加进去,这就是更高级的玩法了。