技术文章:网路爬虫:不生产内容,只是内容的搬运工
优采云 发布时间: 2022-11-24 04:27技术文章:网路爬虫:不生产内容,只是内容的搬运工
搜索引擎和聚合新闻APP之所以有源源不断的新内容供用户浏览,是网络爬虫技术的加持。网络爬虫的应用对用户来说是一个很大的好处——我们可以很方便地从搜索引擎中搜索到各个领域的信息。但是,对于原作者来说,这涉及到版权侵权的问题。工具理性并不意味着操作工具的人可以打着“工具理性”的幌子,任意侵犯他人的合法权益。网络爬虫技术的应用也应符合法律原则。
一、初识爬虫
工作中,如果想找“产品设计”,直接在搜索引擎上输入内容,就可以直接找到上百万的资料。
上下班路上,刷新闻APP时,只要你想,就会源源不断的新资讯,足够你一路走下去的时间。
搜索引擎和(大部分)新闻应用不生产自己的内容(虽然有些平台孵化自己的内容,但只占整个平台内容的一小部分,更重要的是成本非常高)。
那么,他们海量的内容从何而来?
“我们不生产内容,我们只是内容的搬运工”,把网上的内容“搬”到自己的服务器上,这就是爬虫。
首先,我们需要了解互联网的结构。
互联网上有数以亿计的内容。虽然它很复杂,但它是一个大网络。Internet 上的每个节点都是一个网页。连接网页的超链接(Hyperlinks)相当于线,线将所有节点连接在一起。,形成一个复杂的网络。
通过点击超链接的文字或图片,可以跳转到相应的网页。爬虫可以自动访问每个网页并保存网页内容。
世界上第一个网络爬虫是麻省理工学院的学生马修·格雷在 1993 年写的,后来的爬虫越来越复杂。
例如:可以实现更快的访问速度,访问更多的网页,更好的解析网站内容。但是爬虫的基本原理都是一样的,主要包括三个部分:获取网页链接、下载网页内容、解析网页内容。
爬虫的工作过程和我们寻找网页的过程是一样的。
比如我们要查看豆瓣上最新的电影:首先在浏览器地址栏输入url链接,浏览器就会跳转到豆瓣电影。最后,我们可以找到当前流行的电影。
同样,一个简单的爬虫可以分三步爬取网页——首先访问网页,然后下载网页内容,最后解析下载的内容。
二、7行代码爬取豆瓣电影
最简单的爬虫三步就可以爬取一个网页,那么你需要写多少行代码呢?
来写一个爬虫爬取豆瓣的“每周口碑榜”,只需7行代码!
这里我们使用Python语言。至于为什么选择Python语言,后面会解释清楚。不懂 Python 也没关系,只要了解爬虫的工作原理即可。
代码如下:
从 lxml 导入请求
import html url='' # 1.需要爬取数据的url
page=requests.Session.get(url) # 2.访问网页
tree=html.fromstring(page.text) # 3.解析网页的过程
result=tree.xpath('//td[@class="title"]//a/text') #3、解析网页的过程
print(result) # 打印出结果
在Python环境下运行这几行代码,就可以得到“本周单词榜”,结果如下:
[《迦百农》、《绿皮书》、《驯龙高手3》、《速成家族》、《阿丽塔:战斗天使》、《肤色》、《死亡天使》、《黎明之墙》、《小《小巨人》、《外·路》】
最重要的是解析网页的内容,主要是代码行('//td[@class="title"]//a/text'),大多数人可能会很困惑。
这就涉及到HTML网页的结构。你可以把一个网页理解为一个文件夹。打开一个文件夹,你会发现子文件夹,子文件夹也可能有文件夹。通过一个一个打开文件夹,你终于可以找到你需要的数据。
//td:这个相当于一个大目录;[@class="title"]:这个相当于一个小目录;//a:这个相当于最小的目录;/text:这个是提取里面的文字内容。
至于这行代码怎么写,可以在网页空白处右键查看源码,找到对应的td、class=”title”、a等标识。
大多数程序员选择python来写爬虫的原因很简单。
" />
首先,python有很多库,可以直接调用。比如上面的代码引入了requests和lxml库,分别实现访问网页和解析网页结构。如果有开源库,直接调用即可,避免重新造轮子。
其次,python写起来很方便,也很容易配置。几行代码就可以直接运行。如果使用C或Java,配置环境可能需要很长时间。
3.简答爬虫系统
通过将上述各步骤分别实现(模块化),就可以构成一个短答案爬虫系统。
使用URL(可以理解为URL链接)管理器管理所有的URL链接,使用HTML(可以理解为网页内容)下载器下载网页内容,使用HTML解析器解析下载的内容,加上数据存储模块,控制调度整个爬虫模块构成了一个简单的爬虫系统。
基本爬虫架构
更具体地说,URL管理器负责管理所有的URL链接,记录哪些URL已经被爬取,哪些还没有被爬取。如果已被抓取,则需要避免再次下载。如果没有,就需要加入队列等待HTML下载器下载。
HTML下载器可以从服务器上下载整个网页的内容,从URL管理器中获取未被爬取的URL链接,然后访问这些网页链接来下载网页。
HTML解析器负责解析下载的网页,主要有两个任务:一方面解析出需要的信息,比如上面的“每周口碑榜”;另一方面,它解析出新的URL链接,交给URL管理Downloader,继续下载,这个功能在上面的“7行代码”中没有实现。
数据存储实现了存储数据的功能,存储HTML解析器解析出来的信息,否则每次使用都要下载,会浪费很多时间。图片、文档等文件可以直接保存到服务器,文本文件可以通过数据库保存。
爬虫调度器作为系统的大脑,负责协调其他四个模块的协调工作。
不管是大型爬虫还是小型爬虫,虽然在设计细节和性能上存在差异,但都离不开这五个模块。
4.进一步考虑
乍看之下,每个模块实现起来都很简单,但是仔细想想,似乎每个模块都要考虑很多东西。
1.如何获取初始URL链接
7行代码爬取豆瓣电影,直接访问URL链接()爬取“每周口碑榜”。对于更大的爬虫系统或商业爬虫,需要更多的考虑。在保证获取足够信息的同时,也要保证下载的质量。
对于搜索引擎公司来说,有必要尽可能地收录互联网上的所有信息。对于垂直领域,更多的业务信息是偏向的。比如对于新闻app,主要包括一些新闻网站、政府网站等,他们可能对Github等编程网站不感兴趣。
巧妇难为无米之炊,初始URL链接基本靠人工凭经验获取。例如,对于新闻应用,其初始URL列表可能包括新浪、网易、搜狐等门户网站,以及各级政府网站。还有人民网、新华社、人民日报等媒体网站。
2、如何判断哪些网页已经下载
当一个页面被下载时,从该网页中提取URL链接,加入到等待下载队列中,这样就可以获得更多的URL链接。
如果一个网页已经下载过,重新下载会耗费大量时间和占用存储空间。更糟糕的是,如果你一直重复下载,你可能会陷入死循环。
那么,如何知道这个 URL 链接是否已经被下载过呢?
对于小型爬虫,可以使用列表来存放下载的URL链接。当有新的URL链接时,首先检查列表中是否有这样的URL链接。如果有,则无需插入,如果没有,则插入列表,等待访问下载。
对于大型爬虫来说,有数百个“小爬虫”(更专业的说法叫分布式爬虫),分布在不同的服务器上,同时爬取URL链接,需要考虑的东西更多。
比如:不同爬虫之间的分工和通信,如何共同维护上面的列表。
当数据量很大时,需要考虑分布、通信、存储、带宽等各个环节的限制。无论哪一个环节没做好,都可能成为系统的瓶颈。这就像木桶效应中的一个短期问题。盘子。
如果数据量增加10倍,可能要重写之前的代码,工作量可能增加100倍。这也是量变引起质变的一个很好的例子。
在计算机领域,这样的例子比比皆是。当数据增加到一定程度,原有的算法可能无法继续使用,需要重新开发,随之而来的就是超时、DEBUG、延迟上线。
3.页面分析
爬取豆瓣电影“周口碑榜”,需要研究网页源代码,编写相应的解析代码。但是,网页的结构不同。用这段代码爬知乎,什么也解析不出来。
以一个新闻APP为例:一个好消息APP需要爬取上亿个网页,解析出里面的文字、视频、图片。难度可想而知。
好消息是有些网站会遵守RSS规范(遵守RSS规范的网页结构和代码都相似,订阅者可以获取主要信息),一种爬虫可以爬取大量类似的网页。但是大多数网站的结构都不尽相同,这就需要算法工程师花费大量的时间和精力进行分析。
5.反爬虫
新闻类APP通过爬虫获取大量优质资源,读者乐于在一个平台上看到所有内容,但被“爬”到的网站就不太高兴了。对于大部分靠广告收入的网站来说,没有流量,连生存都成了问题,更别说盈利了。
一些自成体系的平台,比如:大型电商平台,他们希望所有的用户都在自己的平台上找到信息,所有的商家都在自己的平台上吸引卖家(*敏*感*词*不能付给搜索引擎) . 希望爬虫受到骚扰。
搜索引擎希望爬取更多信息,优质内容提供者不希望被爬虫骚扰,利益冲突难以调和,因此创建了 Robots 协议来解决这个问题。
来自Robots协议网站服务器的声明通常是保存在网站根目录下的TXT格式文件。网站通过Robots协议告诉搜索引擎:哪些页面可以被抓取?哪些页面不能被抓取?
" />
爬虫访问站点时,首先会检查站点根目录下是否存在robots.txt。如果存在,爬虫会根据文件内容来判断访问范围;如果该文件不存在,所有爬虫将能够访问站点上所有不受密码保护的页面。
我们在使用搜索引擎时,经常会看到“系统无法提供该页面的内容描述,因为robots.
值得注意的是,机器人协议是互联网社区共同的道德准则,不具有强制约束力。
一些“*敏*感*词*”的爬虫也会爬取带有robots.txt限制说明的网站。这时候就需要一些技术来实现反爬虫。
最常见的方式有以下三种:
1、网站会根据IP地址访问频率判断是否为爬虫
每台电脑都有一个唯一的IP地址,每个爬虫也有一个唯一的IP地址。当计算机或爬虫访问网站时,网站会记录这个IP地址。如果同一个IP在短时间内多次访问同一个网站,网站可能会倾向于认为这是爬虫而采取一些措施。
当然,在反爬的同时,也会给用户带来一些不好的体验。
反观一些优秀的网站或APP,会根据用户点击频率、时间间隔等信息判断是爬虫还是误点击,进而判断是否需要验证。
更好的用户体验背后是更大的开发成本和更长的开发周期。
2、网站还可以根据用户请求的headers判断是否是爬虫
当我们使用浏览器访问网站时,浏览器会自动在访问请求中添加一些信息,例如:浏览器使用的编码方式、使用的操作系统、浏览器版本等访问开始时的信息request,作为Headers,但是爬虫一般不会附上这些信息。
网站会根据头部信息是否存在以及头部信息的内容判断对方是否为爬虫,必要时拒绝访问。
3、动态页面反爬虫
以前的 HTML 网页都是静态的。随着HTML代码的生成,页面的内容和显示效果不会发生变化。这不是动态网页的情况。动态网站是由脚本语言(如PHP)生成的,有些内容是不直接可见的,只有运行一些脚本才能看到。
URL后缀为htm、html、shtml、xml的网页为静态网页,而动态网页则以aspx、.asp、.jsp、.php、.perl、.cgi等形式为后缀,并且有一个标志性的符号“?”,这些不同的后缀基本上代表了网页使用的语言。
访问静态网页只需要直接访问链接即可。访问一个动态网站,需要进行一些特定的操作(比如点击)来显示更多的内容,这就增加了爬取的难度。一些简单的爬虫可以被拒之门外。
介绍完三种主流的反爬虫方法,最后要说的是:反爬虫技术不是一劳永逸的。在反爬虫的发展过程中,爬虫也进化出了一系列反“反爬虫”的方法。
针对反爬虫验证IP机制,爬虫“进化”了一个IP代理池,让爬虫可以不断改变自己的IP地址来迷惑反爬虫。对于headers验证,爬虫也会生成一个headers信息,即使是动态页面,它也会模拟浏览器的行为。
尽管如此,反爬虫在一定程度上增加了爬虫的成本,降低了爬虫的效率,可以将大量的爬虫挡在门外。
从爬虫和反爬虫的例子也可以看出:大多数时候,没有绝对有效的方法。提高对方的成本,让对方觉得成本太高,得不偿失,才是解决问题的好办法。
6、爬虫实现冷启动——胜利就是正义?
上面讲了爬虫的工作原理和常见的反爬虫机制。最后说一个爬虫应用场景的例子,可以帮助我们更好的理解爬虫。
冷启动是每个产品经理、运营者和创业者面临的一大难题。没有优质的内容就无法吸引用户,没有大量的用户就无法吸引优质的内容,陷入先有鸡还是先有蛋的悖论。
爬虫,低成本快速解决这个问题!
“我们不生产新闻,我们只是新闻的搬运工。” 通过爬虫,我们可以低成本快速爬取整个互联网的优质内容,并依托海量数据,利用算法实现内容分类和个性化推荐(个性化推荐系统将在未来发布。在中介绍)详见序章),吸引大量用户,最后通过广告变现。
结果证明这是一个非常成功的商业模式。但是媒体平台和新闻网站大量雇佣编辑,花费大量的时间和金钱写出高质量的内容,二话不说,就这样被人拿走,这不是侵犯他人的权利吗?版权?
于是,多家媒体联合发起侵权诉讼或抗议,最终迫使这家新闻巨头支付版权费用。然而,无论存在多少法律和道德问题,都不会影响公司商业成功的既定事实。
类似的事情也在其他垂直领域发生。
一个新成立的科技博客平台,爬取竞争对手的文章,快速聚合优质内容。如果原博主发现自己的文章被盗用,新平台将交出账号,并视情况给予一定补偿。对方要是不高兴,直接注销账号就好了,就当什么都没发生过一样。通过这种操作模式,成功实现了冷启动。
短视频应用的后来者也可以通过类似的方式实现用户积累和优质内容的聚合。
胜利就是正义?
这似乎是一个过于武断的评估。
前述视频应用走得太远,引起公愤,最终不得不关闭自己的平台。
对于通过爬虫获取内容的平台来说,内容的获取只是万里长征的第一步。通过运营手段降低内容生产成本,通过利益共享鼓励优质内容生产,通过技术降低信息成本吸引用户。任重而道远。
而版权永远是悬在头顶的达摩克利斯之剑。
本文由@linghu原创发表于人人都是产品经理,未经允许,禁止转载
题图来自Unsplash,基于CC0协议
技术文章:【PHP网页数据正则采集】的更多相关文章
使用正则和网络编程抓取网页数据(有用)
使用正则和网络编程抓取网页数据(有用) 使用正则和网络编程抓取网页数据(有用) /// /// 抓取网页对应的内容 /// ///
收件地址
///
起始字符
///
API示例:使用Python驱动Firefox采集网页数据
1.简介 本文介绍如何使用Python驱动Firefox浏览器编写一个简单的网页数据采集器。开源的Python实时网络爬虫项目会集成Scrapy(一个基于twisted的异步网络框架),所以本例将使用Scrapy采集淘宝。收录
大量ajax代码的网页数据,但要注意本例中的一个严重缺陷:Selenium加载网页的过程发生在Spider中,破坏了Scrapy的架构原则。因此,本例仅用于测试Firefox驱动和ajax网页数据采集。必须修改两个技术点才能在正式运行环境中使用。后续文章会具体讲解修改后的实现...
使用js采集网页数据插入数据库最快的方法
今天教大家一个快速采集网站数据的方法,因为来不及了,直接上例子,这里以采集易车网的产品数据为例。思路:利用js获取网页数据并生成sql命令,执行sql命令向数据库中插入数据。1、使用谷歌浏览器或火狐浏览器打开网站:(品牌采集
)、(型号采集
) 2、按F12进入调试模式,选择控制台,输入以下代码 // JavaScript Document (function() { var hm = ...
C#+HtmlAgilityPack+XPath带你采集数据(以天气数据为例)
第一次接触 HtmlAgilityPack 是在 5 年前。一些意外导致我暂时从技术部调到销售部。我负责建立一些流程并寻找潜在客户。最后在阿里巴巴找到了很多客户资料。它非常全面。一开始是手动复制到Excel,真的很累。虽然那时候C#还是很牛的,但是想着能不能通过一个程序批量获取(所以还是多点想法比较好)。几经周折,终于发现了HtmlAgilityPack这个神器。近几年也用HtmlAgilityPack来采集很多类型的数据,尤其是足球比赛数据库的数据采集和天气数据的采集,都是用到HtmlAgilityPack,所以...
Java爬取网页数据(原创
网页+Javascript返回数据)
" />
有时候因为各种原因,我们需要采集
某个网站的数据,但是因为不同的网站对数据的展示方式略有不同!本文使用Java向大家展示如何抓取网站的数据:(1)抓取原创
网页数据:(2)抓取网页上Javascript返回的数据。1.抓取原创
网页。本例中,我们要从上面抓取ip查询的结果: 第一步:打开这个网页,然后输入IP:111.142.55.73,点击查询按钮,就可以看到网页上显示的结果: 第二步:查看网页源码,我们可以看到源码中有这么一段话: 从这里可以看出,查询的结果是重新请求...
Python数据网络获取5--处理Javascript和重定向
Python资料网合集5--处理Javascript和重定向 到目前为止,我们与web服务器通信的唯一方式就是发送HTTP请求获取页面。对于某些网页,我们可以在不单独请求的情况下与Web服务器进行交互(发送和接收信息)),那么这个网页可能会使用Ajax技术来加载数据。使用之前的采集方式,可能只会采集加载前的数据,并不会采集到重要的数据。与 Ajax 一样,动态 HTML(DHTML)也是一系列用于解决 Web 问题的技术的集合。DHTML 使用客户端语言(例如 JavaScript)来控制页面的 HTML 元素。通常,当我们抓取一个网站时,从……
java网页数据抓取实例
在很多行业中,需要对行业数据进行分类汇总,及时分析行业数据,对公司未来的发展有很好的参考和横向比较。因此,在实际工作中,我们可能会遇到数据采集的概念,数据采集的最终目的是获取数据,提取有用的数据,用于数据抽取和数据分类汇总。很多人在刚开始了解数据采集的时候可能不知道如何下手,尤其是作为一个新手,会感到非常的无所适从。所以,在这里分享一下自己的经验,希望能把技术分享给大家。如有不足之处,请指正。写这篇文章的目的是希望大家一起成长。我也相信技术之间没有区别,
Java通过url抓取网页数据
在很多行业中,需要对行业数据进行分类汇总,及时分析行业数据,对公司未来的发展有很好的参考和横向比较。因此,在实际工作中,我们可能会遇到数据采集的概念,数据采集的最终目的是获取数据,提取有用的数据,用于数据抽取和数据分类汇总。很多人在刚开始了解数据采集的时候可能不知道如何下手,尤其是作为一个新手,会感到非常的无所适从。所以,在这里分享一下自己的经验,希望能把技术分享给大家。如有不足之处,请指正。写这篇文章的目的是希望大家一起成长。我也相信技术之间没有区别,
热点话题
输入正整数判断是否为质数
墨菲原理
解决ansible首次连接host服务器需要验证的问题
abap alv 细胞可编辑
SQL 服务器时差
mysql如何从*敏*感*词*中提取出生日期
" />
layui.open关闭事件
使用promise发起请求,不超过最大请求数
preHandle 修改头部
js正则获取根目录
.net core Engine.Razor 生成html
vs2015无法运行“rc.exe
即easyui下面的两种滚动条
怎么查看手机的mtu值
modelsim的wave中如何显示位宽表示
sybase tempdb 截断日志
C# dataGridView 光标定位指定单元格
Delphi语言HMACSHA1加密
html js canvas画五角星
app ui自动化清除输入框文字