一直以来不管是编程语言排行榜还是在互联网行业,Python一直备受争议,到底是Java热门还是Python热门也是一直让人争吵的话题。随着信息时代的迭代更新,人工智能的兴起,Python编程语言也随之被人们广泛学习,Python数据分析、Python web全栈、Python自动化运维等等都很受欢迎,其中还包括了Python爬虫。但是很对人觉得Python爬虫是违法的行为,也在怀疑自己到底要不要学爬虫,之前有一篇文章特别火,就是《 只因写了一段爬虫,公司200多人被抓!》,文章里写了因为一名技术人员因爬取数据被抓,那么爬虫真的违法吗?今天我们来好好研究一下。
1
网络爬虫犯法吗?
网络爬虫领域目前还属于早期的拓荒阶段,虽然互联网世界已经通过自身的协议建立起一定的道德规范(Robots协议),但法律部分还在建立和完善中。从目前的情况来看,如果抓取的数据属于个人使用或科研范畴,基本不存在问题;而如果数据属于商业盈利范畴,就要就事而论,有可能属于违法行为,也有可能不违法。
Robots协议
Robots协议(爬虫协议)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。该协议是国际互联网界通行的道德规范,虽然没有写入法律,但是每一个爬虫都应该遵守这项协议。
下面以淘宝网的robots.txt为例进行介绍。
User-agent: Baiduspider #百度爬虫引擎 Allow: /article #允许访问/article.htm、/article/12345.com Allow: /oshtml Allow: /ershouDisallow: /product/ #禁止访问/product/12345.com Disallow: / #禁止访问除Allow规定页面外的其他所有页面 User-Agent: Googlebot #谷歌爬虫引擎 Allow: /articleAllow: /oshtml Allow: /product #允许访问/product.htm、/product/12345.com Allow: /spuAllow: /dianpuAllow: /wenzhang Allow: /oversea Disallow: /
淘宝的Robots协议对谷歌爬虫的待遇则不一样,和百度爬虫不同的是,它允许谷歌爬虫爬取产品的页面Allow:/product。因此,当你在谷歌搜索“淘宝iphone7”的时候,可以搜索到淘宝中的产品,如图所示。当你爬取网站数据时,无论是否仅供个人使用,都应该遵守Robots协议。
网络爬虫的约束
除了上述Robots协议之外,我们使用网络爬虫的时候还要对自己进行约束:过于快速或者频密的网络爬虫都会对服务器产生巨大的压力,网站可能封锁你的IP,甚至采取进一步的法律行动。因此,你需要约束自己的网络爬虫行为,将请求的速度限定在一个合理的范围之内。
实际上,由于网络爬虫获取的数据带来了巨大的价值,网络爬虫逐渐演变成一场网站方与爬虫方的战争,你的矛长一寸,我的盾便厚一寸。在携程技术微分享上,携程酒店研发部研发经理崔广宇分享过一个“三月爬虫”的故事,也就是每年的三月份会迎来一个爬虫高峰期。因为有大量的大学生五月份交论文,在写论文的时候会选择爬取数据,也就是三月份爬取数据,四月份分析数据,五月份交论文。
因此,各大互联网巨头也已经开始调集资源来限制爬虫,保护用户的流量和减少有价值数据的流失。
2007年,爱帮网利用垂直搜索技术获取了大众点评网上的商户简介和消费者点评,并且直接大量使用。大众点评网多次要求爱帮网停止使用这些内容,而爱帮网以自己是使用垂直搜索获得的数据为由,拒绝停止抓取大众点评网上的内容,并且质疑大众点评网对这些内容所享有的著作权。为此,双方开打了两场官司。2011年1月,北京海淀法院做出判决:爱帮网侵犯大众点评网著作权成立,应当停止侵权并赔偿大众点评网经济损失和诉讼必要支出。
2013年10月,百度诉360违反Robots协议。百度方面认为,360违反了Robots协议,擅自抓取、复制百度网站内容并生成快照向用户提供。2014年8月7日,北京市第一中级人民法院做出一审判决,法院认为被告奇虎360的行为违反了《反不正当竞争法》相关规定,应赔偿原告百度公司70万元。
虽然说大众点评上的点评数据、百度知道的问答由用户创建而非企业,但是搭建平台需要投入运营、技术和人力成本,所以平台拥有对数据的所有权、使用权和分发权。
以上两起败诉告诉我们,在爬取网站的时候需要限制自己的爬虫,遵守Robots协议和约束网络爬虫程序的速度;在使用数据的时候必须遵守网站的知识产权。如果违反了这些规定,很可能会吃官司,并且败诉的概率相当高。
所以只要你合理利用就不会违法,爬虫还是可以学的哦,毕竟爬虫对数据分析真的非常有用,那么爬虫该怎么学呢?今天来教大家编写一个简单的爬虫吧!
2
编写第一个简单的爬虫
#!/usr/bin/python
# coding: utf-8 import requests #引入包requestslink = "http://www.santostang.com/" #定义link为目标网页地址 # 定义请求头的浏览器代理,伪装成浏览器headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} r = requests.get(link, headers= headers) #请求网页print (r.text) #r.text是获取的网页内容代码
上述代码就能获取博客首页的HTML代码,HTML是用来描述网页的一种语言,也就是说网页呈现的内容背后都是HTML代码。如果你对HTML不熟悉的话,可以先去w3school(http://www.w3school.com.cn/html/index.asp)学习一下,大概花上几个小时就可以了解HTML。
在上述代码中,首先import requests引入包requests,之后获取网页。
(1)首先定义link为目标网页地址。
(2)之后用headers来定义请求头的浏览器代理,进行伪装
(3)r是requests的Response回复对象,我们从中可以获取想要的信息。r.text是获取的网页内容代码。
运行上述代码得到的结果如图所示。
#!/usr/bin/python # coding: utf-8 import requestsfrom bs4 import BeautifulSoup #从bs4这个库中导入BeautifulSoup link = "http://www.santostang.com/"headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} r = requests.get(link, headers= headers) soup = BeautifulSoup(r.text, "html.parser") #使用BeautifulSoup解析 #找到第一篇文章标题,定位到class是"post-title"的h1元素,提取a,提取a里面的字符串,strip()去除左右空格title = soup.find("h1", class_="post-title").a.text.strip()print (title)
在获取整个页面的HTML代码后,我们需要从整个网页中提取第一篇文章的标题。
这里用到BeautifulSoup这个库对页面进行解析,BeautifulSoup将会在第4章进行详细讲解。首先需要导入这个库,然后把HTML代码转化为soup对象,接下来用soup.find(“h1”,class_=“post-title”).a.text.strip()得到第一篇文章的标题,并且打印出来
soup.find(“h1”,class_=“post-title”).a.text.strip()的意思是,找到第一篇文章标题,定位到class是"post-title"的h1元素,提取a元素,提取a元素里面的字符串,strip()去除左右空格。
对初学者来说,使用BeautifulSoup从网页中提取需要的数据更加简单易用。
那么,我们怎么从那么长的代码中准确找到标题的位置呢?
这里就要隆重介绍Chrome浏览器的“检查(审查元素)”功能了。下面介绍找到需要元素的步骤。
步骤01 使用Chrome浏览器打开博客首页www.santostang.com。右击网页页面,在弹出的快捷菜单中单击“检查”命令,如图所示。
步骤02 出现如下图所示的审查元素页面。单击左上角的鼠标键按钮,然后在页面上单击想要的数据,下面的Elements会出现相应的code所在的地方,就定位到想要的元素了。
步骤03 在代码中找到标蓝色的地方,为
import requests from bs4 import BeautifulSoup #从bs4这个库中导入BeautifulSoup link = "http://www.santostang.com/"headers = {'User-Agent' : 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'} r = requests.get(link, headers= headers) soup = BeautifulSoup(r.text, "html.parser") #使用BeautifulSoup解析title = soup.find("h1", class_="post-title").a.text.strip()print (title)
# 打开一个空白的txt,然后使用f.write写入刚刚的字符串titlewith open('title_test.txt', "a+") as f: f.write(title)
存储到本地的txt文件非常简单,在第二步的基础上加上2行代码就可以把这个字符串保存在text中,并存储到本地。txt文件地址应该和你的Python文件放在同一个文件夹。
以上就是编写第一个爬虫的方法,你们学会了吗?暂时没学会也没关系,你可以慢慢学哦!
原文链接:https://blog.csdn.net/weixin_37649168/article/details/104265388