当前位置: 首页 > 编程日记 > 正文

写了篇爬虫文章,收到律师函,怎么办

大家好,我是早起。

从写公众号开始,不论是私信还是交流群,常常都会有粉丝会问出类似下面的问题

  • xx网站能不能爬?

  • 爬xx数据有没有风险?

其实我并不是爬虫从业人员,充其量算爬虫爱好者,去年也转载过一篇相对理性的文章《请不要污名化爬虫!》,今年初还因为在公众号分享某网站的反爬破解收到了律师函,算是在作死的边缘徘徊了一波

今天就简单聊一下爬虫那些事儿。


当我们谈论爬虫

在这里,其实我想吐槽一下,对于大多数非爬虫从业者或者说大部分 Python 爱好者来说,我们写的“爬虫”和大家谈论的爬虫并不是一个东西。

因为基本上也就requests.get或者selenium折腾几下,就算你加个请求头、cookies什么的拿到数据,对方网站也有n种方式识别出来你,同时也不会涉及复杂的反爬、逆向、验证码处理、分布式、爬虫调度等技术,这样的程序在我看来根本算不上爬虫,顶多算是频率高点的模拟请求。

所以保持对爬虫的敬畏之心是好的,但requests或者selenium捣鼓两下,返回了一点数据分析一下,这样的程序和我要讨论的不是同一个爬虫,你随意折腾,一般情况下对方网站懒得理你,也不会有什么法律风险,但也要注意以下几点。


robots协议

其次要说的就是robots协议,相信如果对爬虫有进一步研究的读者都会知道,每个网站都有robots协议这么个玩意,且有些非技术类自媒体常说一定要遵守robots协议之类的文字!

但正如本文开头提到的文章所说,这个协议是一个君子协议,换句话说不论这个网站实际上是否允许你爬,在robots协议上都会限制你爬!

拿很多教程用来讲解Python爬虫入门的 「豆瓣250」 来说,查看豆瓣的robots协议如下

可以看到也是禁止了所有的请求头User-agent: *以及大部分路径下的页面,其中就包括搜索电影信息的Disallow: /search,如果完全遵循该协议,基本什么都玩不了。

其实不仅是robots协议,大部分网站基本上都会在用户服务协议上限制你使用任何爬虫,例如养活了很多技术博主的某团和某点评,在服务条款上就给出了明确的说明

但之所以基本见不到类似的案件主要就像前文所述,大部分人的爬虫程序都是小打小闹,人家懒得理你,但要知道对方是保留了起诉你的权利。

所以对于robots协议,我们应该是带着尊重进行谨慎合理的数据爬取。


数据

为什么说「涉及数据要小心」?因为大部分爬虫把自己爬进去了的案例都是在数据上翻车,不是用来盈利就是涉及隐私数据。

1. 别拿来搞钱

首先要申明的也是最重要的一点 「你爬人家数据想干嘛」,爬点公开数据自己玩一下基本是没有问题的,但若你把人家数据爬下来出售/盈利是绝对不行的。

打个比方说你爬美团数据做了个丑团来竞争,爬大众点评数据做个了付费的小众点评来出售等这都是不可以的,换句话说这和爬虫程序本身没关系,而是你非法使用对方的数据,目前因为爬虫喜提牢饭的案件也或多或少和盈利性活动有关

所以要明白就算你爬下来到本地的数据也是别人的,千万不要用于任何盈利活动!

2. 隐私数据别碰

其次关于数据还有一点需要注意的是,我们都知道公开的数据大部分可以采集,但如果数据涉及到隐私,尤其是公民信息相关数据,如第二小节里面的文章提到的手机号、身份证、公积金社保等数据,千万不要碰。

就算是公开的数据,也尽量不要使用爬虫程序来大批量、无限制的获取,不然小日子会越来越有判头。至于非公开数据,例如

  • 后台数据

  • 需要一定权限才能获得的数据

  • 付费后才能获得的数据

这类明面上都不让你拿的数据,更别说用爬虫手段获取了。


克制

克制,意思就是当对方网站识别出来你的爬虫行为,例如一些非常规的反爬措施,或者因为较高频率的请求而ban掉你的ip等情况时,我们就需要有所克制,例如合理的绕过反爬、降低请求速度等,尤其注意不要对对方的正常业务造成影响。

并且这个 「正常业务」是否受到影响的解释权完全在对方网站,就算你1秒请求1次,理论上他也能告你影响其正常业务开展。

其次要克制的就是在成功对某网站成功进行了反爬/逆向等操作后,不要太得瑟,不要指名道姓的说出对方网站,就像我一样,仅仅发了篇反爬绕过讲解文章,就光速收到律师函(发文后第二天),当我问到「为什么那么多人发,就给我发律师函」,对方表示看到你就要处理你

结果就像前面说的,对方有多种方式来告你,更别说反爬绕过了,我只能配合删除相关文章。

所以在反爬、频率控制等操作上,一定要克制+谨慎,尤其注意在分享反爬技术上不要太明目张胆,一个好的做法是自己复制一个类似的案例网站(可惜我不会),然后就可以为所欲为的进行技术拆解。


补充

需要额外注意的是,如果是基于别人的需求去开发爬虫程序,比如帮别人写个爬虫程序赚点零花钱、完成boss的任务等,就需要明确需求本身是否有侵权行为,以及需求方基于你的爬虫程序是否用于侵权活动。

例如老板让你用爬虫爬点某网站公开评论数据,然后简单分析下数据写个报告,我认为这是不会有太大风险的,而如果是让你爬取某付费数据或爬数据用于自己公司的商业行为,那完全可以拒绝并拉黑,员工被老板坑的案例实在太多了,希望大家在遇到此种情况下可以正确判断。


小结

以上仅是从我一个非爬虫从业人员角度的一些看法,其实核心就是爬虫无罪,大多数翻车的案例与爬虫本质上没有太大关系,在写爬虫程序时需要保持尊重、谨慎的心态,尊重对方网站的反爬、数据,谨慎、合理去写代码。同时爬虫的水很深,要学的知识很多,绝对不只是 requests 请求两下就算爬虫,基本上涉及到计算、编程开发的方方面面,希望大家可以一起学习、进步。

相关文章:

在SQL中使用CRL函数示例

在SQL中使用CRL函数 实验目标: 1. 在SQL中创建CRL函数,使之能够向指定的计算机发送消息 实验步骤 2. 在VS中创建类发送消息的类 3. 将以下代码黏贴进去 using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; …

ASP.NET的(HttpModule,HttpHandler)

在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务。截获之后它会将这个请求转交给asp.dll进程,这个进程就会解释这个asp页面,然后将解释…

页面GBK,用jquery.post乱码问题

2019独角兽企业重金招聘Python工程师标准>>> jquery ajax默认为UTF-8,所以页面上要 encodeURIComponent ("内容") 后台代码 再 URLDecoder.decode("内容" "utf-8") 转载于:https://my.oschina.net/wangchongya/blog/34651…

专访陈天桥:把钱投给甘坐冷板凳的AI研究员

作者:钱童心 责编:刘佳“别的投资人听陶虎说,要10年才能做出消费级产品,就不投了,我跟陶虎说,我给你20年时间做。”人工智能(AI)技术正在为各行各业赋能,这使得一场人才…

使用DPM2007备份还原Exchange2007邮箱数据库

创建演示环境1. 在这里,由于要演示备份和还原,所以我们先让用户bob给alice发一封信以作测试验证。2. 用户alice登录OWA后,可以看到bob发来的一封信,主题为“DPM Test For Exchange”,如图1.创建保护组并备份Exchange…

大有乾坤,售前机器人背后的 AI 技术

作者 | 伍杏玲出品 | AI科技大本营(ID:rgznai100)我们在网上购物时,无论多晚找客服咨询,对面均会回复一句“在呢,请问有什么可以帮助您?”,屏幕背后大部分为智能客服机器人。在不同业务场景对话…

c3p0数据库连接池使用报错【 You can't operate on a closed Connection!!!】解决方案

一般情况下&#xff0c;我们的项目中都有一个获取数据库连接的方法。我获取数据库连接的方法是这样实现的&#xff1a;1. 创建一个 ComboPooledDataSource对象&#xff0c;使用它的getConnection()方法获取连接。2. 创建一个泛型为Connection的ThreadLocal<Connection>对…

Asp.Net下通过切换CSS换皮肤

换皮肤的方式有很多种&#xff0c;最简单的通常就是切换页面CSS&#xff0c;而CSS通常写在外部CSS文件里。那么切换css其实就是更换html里的link href路径。我在网上搜索了下。一般有两种方式&#xff1a; 1,在页面放一个holder控件。然后用编程方式把当前用户的风格css link写…

用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)

上一节我们讨论了 Service 部署的两种模式&#xff1a;global mode 和 replicated mode。无论采用 global mode 还是 replicated mode&#xff0c;副本运行在哪些节点都是由 Swarm 决定的&#xff0c;作为用户我们有没有可能精细控制 Service 的运行位置呢&#xff1f; 答案是&…

oracle11g数据库升级

Oracle支持周期Oracle对自己产品也一样&#xff0c;对于自己的产品在不同的时期&#xff0c;支持的强度是不一样的。大体分来&#xff0c;支持的强度分为三个级别&#xff1a;Premier Support&#xff08;最高优先级的支持&#xff09;,Extended Support&#xff08;中等优先级…

DPU加持下的阿里云如何做加密计算?

作者&#xff1a;谭婧来源&#xff1a;亲爱的数据人在干&#xff0c;天在看&#xff0c;云在算。云计算越发展&#xff0c;云安全越重要。故事得从小小的芯片讲起。一家以色列的芯片公司&#xff0c;名叫Annapurna Labs&#xff0c;以喜马拉雅山脉的最高十峰之一——安娜普尔纳…

Fastcgi是什么

一、FastCGI是什么&#xff1f;FastCGI是语言无关的、可伸缩架构的CGI开放扩展&#xff0c;其主要 行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知&#xff0c;CGI解释器的反复加载是CGI性能低下的主要原因&#xff0c;如果CGI解释器保持在内存 中并接受Fas…

Android 中文 API (25) —— ZoomControls

正文 一、结构 public class ZoomControls extends LinearLayout java.lang.Object android.view.View android.view.ViewGroup android.widget.LinearLayout android.widget.ZoomControls 二、概述 ZoomControls显示一个简单的设置来控制缩放并回调已注册的事件。 三、 公共方…

你知道吗?你可以在异常中解退调用栈

[原文作者]&#xff1a;Bill Horst [原文链接]&#xff1a;Did you know? You can unwind the call stack from exceptions (Bill Horst) 解退一个异常堆栈的能力是Visual Basic.NET 2005的一个新引进的特性。当调式器触发了一个异常&#xff0c;你可以解退这个堆栈以便于使用…

UnicodeDecodeError: ‘ascii’ codec can’t decode...: ordinal not in range(128 问题解决

今天在使用yum源安装时出现UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 108: ordinal not in range(128原因就是python的str默认是ascii编码&#xff0c;和unicode编码冲突&#xff0c;就会报这个标题错误。那么该怎样解决呢&#xff1f;/usr/li…

女程序员也有35岁危机焦虑吗?

作者 | 郭雪 信通院云大所 责编 | 张红月出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【CSDN 编者按】在程序员界&#xff0c;我们鲜少会去关注女性的职场处境及工作危机&#xff0c;本文从女性是否适合做开发谈起&#xff0c;到35岁女性职场现状&#xff…

android:关于主工程和library project

1、如何将一个android工程作为库工程&#xff08;library project&#xff09;library project是作为jar包被其它android工程使用的&#xff0c;首先它也是普通的android工程。然后&#xff1a;1&#xff09;在eclipse Package Explorer, 右键android工程选择Properties2&#…

JavaScript 读写文件

<script> /* object.OpenTextFile(filename[, iomode[, create[, format]]]) 参数 object 必选项。object 应为 FileSystemObject 的名称。 filename 必选项。指明要打开文件的字符串表达式。 iomode 可选项。可以是三个常数之一&#xff1a;ForReading 、 ForWriting 或…

css3箭头效果

css3 record1 尝试用css写了个箭头效果 思路就是通过span和span子元素i分别通过设置他们的伪元素构造两个箭头,但是i构造的箭头两条线height都是0,hover的时候渐近的动画效果就是i箭头的高度变化而来的,还有rotate相同的角度 css3知识&#xff1a; transitiontransform伪元素::…

计算机视觉,凉了?

机器学习是目前比较热门的技术&#xff0c;包含深度学习、强化学习、对抗学习、对偶学习、迁移学习、分布式学习、以及元学习等内容。得益于大数据、大模型、大计算的发展&#xff0c;深度学习在计算机视觉、语音处理、自然语言方面相继取得了突破&#xff0c;达到甚至超过了人…

用koa mongodb 做了个简单的博客系统

最近在研究koa和mongodb&#xff0c;简单做了个博客系统&#xff0c;目前还未开放评论和发帖功能&#xff0c;欢迎大家吐槽~ ?安装 git clone https://github.com/oliyg/alljscc.git npm install ?启动 cd server node app.js ?DEMO地址 alljs http://alljs.cc ?功能 用户登…

.net 实现 URL重写,伪静态

一&#xff0c;获得Mircosoft URLRewriter.dll&#xff1a;获得Mircosoft URLRewriter.dll可以到http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx?mfrtrue 下载完毕后&#xff0c;导入工程&#xff0c;我这里没有对该工程做任何修改&…

AI 技术升级,这一新方法遏制在线语言骚扰

编译 | 禾木木图源 | IC photo出品 | AI科技大本营(ID:rgznai100)哥本哈根IT大学的 Nina Nrgaard 和她的组员正在参与一项非同寻常的工作&#xff0c;更好地方法来识别网络上的偏见。研究人员对数千条 Facebook、Reddit 和 Twitter 帖子进行了调查&#xff0c;并验证这些帖子是…

MFC中快速应用OpenCV(转)

转载链接&#xff1a;http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV 简介和缘起 本教程原始讨论主题&#xff0c;请见 【原创】MFC中快速应用OpenCV教程&#xff0c;制作此教程的目的&#xff0c;就是为了方便广大windows下面使…

liunx软件安装

RPM包 1. -qa显示当前系统中以RPM方式安装的所有软件列表。 2. -qi查看指定软件包的名称、版本、许可协议、用途描述等详细信息&#xff08;--info&#xff09;。 3. -ql显示指定的软件包在当前系统中安装的所有目录、文件列表&#xff08;--list&#xff09;。 4. -qf查看指定…

程序员因开发速度太慢而遭公司起诉,索赔金额高达90万!

作为程序员&#xff0c;你最头疼的事情是什么&#xff1f;下面这个算吗&#xff1f;在需求不停并更地前提下&#xff0c;项目还得如期上线。本文程序员因未能如期上线项目&#xff0c;公司直接起诉至法院&#xff0c;并提出90万元的索赔。一起来看看这个案件中法院是如何判决的…

c程序性能优化

一段c程序&#xff0c;功能开发完成&#xff0c;开始性能优化。当然是先用 -pg 编译&#xff0c;再gprof看“热点”在哪里&#xff0c;很快找到&#xff0c;是计算hash值的函数&#xff0c;于是换了个更快的hash函数——fnv ( http://isthe.com /chongo/tech/comp/fnv/)&#x…

struts2上传图片的全过程

转载自&#xff1a;http://blog.sina.com.cn/s/blog_6608320c0100j6no.html1、写一个上传的jsp页面upload_p_w_picpath.jsp,内容如下&#xff1a;<body><center> <font color"red"><s:fielderror/></font> <s:form actio…

Java中 与,||与|的区别

阅读目录 区别短路运算举例回到顶部区别 && || 是逻辑运算&#xff0c;支持短路运算 & | 是位运算&#xff0c;不支持短路运算 回到顶部短路运算 当有多个表达式时,左边的表达式值可以确定结果时,就再继续运算右边的表达式的值; 回到顶部举例 例1 Testpublic void…

保持dropdownlist选中值

RowDataBound事件 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { int i; for (i 0; i < GridView1.Rows.Count; i) { if (e.Row.RowType DataControlRowType.DataRow) { e.Row.Attributes.Ad…