嘟嘟社区

纯技术分享:关于采集和反采集的那些事


   当今互联网一大抄,搜索引擎遍布重复内容,大站采集小站,小站苟延残喘,作为一名网站主该如何杜绝爬虫,防止内容被抓取呢?附送私家内容:采集三大绝招。

  本文来自著名MJJ论坛ID: 委员,仅供参考,本篇内容无版权,任意COPY,所引起的任何法律纠纷与本ID无关。

   防采集三大招

1、防采集三大招第一招之加钱可及

   最简单直接的方法,在DNS层面过滤爬虫IP,Dnspod付费版提供了分线路解析,针对机房IP解析到127.0.0.1。很多大站采用了这种方式,可以规避大部分垃圾国内爬虫。

2、防采集三大招第二招之触不可及

   通过user_agent判断特征码过滤蜘蛛,主要针对国外数据收集爬虫,有些蜘蛛真的是玩命爬,很容易造成宕机。Nginx 配置代码

  1. set $flag 0;
  2. if ($http_user_agent ~* (spider|bot|X11|Scrapy|colly|curl|HttpClient|python|php|Java|SM-G900P)) {
  3.     set $flag "${flag}1";
  4. }
  5. if ($http_user_agent !~* (baidu|so|360|sogou|toutiao|google|bing|sm|yandex)){
  6.     set $flag "${flag}2";
  7. }
  8. if ($flag = "012") {
  9.     return 403;
  10.     set $logfile  /home/wwwlogs/black.log;
  11.    access_log /$logfile;
  12. }

复制代码

简单说明下,一般蜘蛛都会有bot或者Spider特征码,比如Baiduspider,过滤掉不需要的非主流蜘蛛,还有些是Python和Go写的爬虫,用的默认头,也可以过滤掉。

高级玩法: Bash脚本定期分析black.log日志,提取垃圾蜘蛛IP加到Iptables,把蜘蛛拦截在防火墙外,效率更高。

当然你也可以和我抬杠说,我伪造user_agent爬不就得了,但是IP是不可能伪造的,比如百度蜘蛛就beijing和山西两个IP归属地,作为网站站长养成看日志的习惯,人工判断才是最有效的。

3、防采集三大招第三招之一触即发

在Nginx中限制Ip爬取频率,限制同一IP最大并发数和爬取速率,但这种方式有可能误伤。

在nginx.conf里的http{}里加上如下代码:

  1. limit_conn_zone $binary_remote_addr zone=perip:10m;
  2. limit_conn_zone $server_name zone=perserver:10m;

复制代码

在需要限制并发数和下载带宽的网站配置server{}里加上如下代码:

  1. limit_conn perip 2;
  2. limit_conn perserver 20;
  3. 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,这里分享个自用函数。

  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. def fetch_html(url):
  4.         chrome_options = webdriver.ChromeOptions()
  5.         chrome_options.add_argument("–headless")
  6.         chrome_options.add_argument(‘no-sandbox’)
  7.         chrome_options.add_argument(" –window-size=1920×1080")
  8.         chrome_options.add_argument(‘disable-dev-shm-usage’)
  9.         chrome_driver = os.getcwd() +"/chromedriver"
  10.         driver = webdriver.Chrome(chrome_options=chrome_options,executable_path=chrome_driver)
  11.         driver.get(url)
  12.         elem = driver.find_element_by_tag_name("body")
  13.         no_of_pagedowns = 2
  14.         while no_of_pagedowns:
  15.             elem.send_keys(Keys.PAGE_DOWN)
  16.             time.sleep(0.2)
  17.             no_of_pagedowns-=1
  18.         html_source = driver.page_source
  19.         driver.quit()
  20.         return html_source

复制代码

2、fake_useragent 伪造浏览器特征

前面也说了可以通过特征码屏蔽爬虫,反过来也可以伪造浏览器特征码,推荐fake_useragent,使用方法:

  1. from fake_useragent import UserAgent
  2. header = {
  3.     "user-agent": UserAgent().chrome
  4. }

复制代码

3、无论是模拟浏览器还是随机浏览头,都容易因为爬取过多被屏蔽IP,比如百度下面的栏目,几乎都作了IP限制,最多爬个几千条就会被Ban,这时候就要用到另一神器动态IP代*理,可以自建代*理池,也可以用现成的,这里只说使用方法:

  1. def get_proxie(random_number):
  2.     ip_random = -1
  3.     url = ‘ ‘#代*理API
  4.     result = requests.get(url).text
  5.     ip_list = result.split()
  6.     if random_number == -1:
  7.       random_number = random.randint(0, len(ip_list) – 1)
  8.       ip= ip_list[random_number].strip()
  9.       proxies = { ‘https’: ip}
  10.     return proxies
  11. proxies = get_proxie(ip_random)
  12. requests.get(url, headers=headers,params=params,proxies=proxies,timeout=10)

复制代码

随机UserAgen+动态IP,只要池子足够大基本可以做到百战百胜,无所不能爬,如果有验证码,还要把验证码识别加进去,这就是更高级的玩法了。

好贴 mark
@cpuer 进来学习
其实直接找个比较全的IDC机房IP端全给屏蔽了就差不多了,但是也会把搜索引擎IP也给拦住。然后后端接入第三方防爬虫与风控系统。
好文!支持多发技术贴
采集偶尔用用都是高铁,Selenium WebDrive还没用过。。。。
最大的绝招,在自己的文章里加入大量违禁词语,等被采集以后,再编辑掉。

落英缤纷 发表于 2022-6-14 18:57
最大的绝招,在自己的文章里加入大量违禁词语,等被采集以后,再编辑掉。 …

对面还没来得及采集,你先进去了

作个记号
其实如果是用Cloudflare的话,直接就可以一键在防火墙里面开启防止自动程序,非常方便。还可以设置防火墙屏蔽相关IP,签名站https://bks.thefuture.top 就用这种方法,感觉效果应该还行,目前没发现有人能顺利大量的爬取。
电子书搜索引擎

还有一些帖子被系统自动隐藏,点此展开
下一页 »
12下一页