curl 抓取网页([toc]网络数据收集DataScrapingvsDataCrawling的协调关系)
优采云 发布时间: 2022-03-18 09:20curl 抓取网页([toc]网络数据收集DataScrapingvsDataCrawling的协调关系)
[目录]
网络数据采集
参考:
数据采集是直接从在线网站 中提取公开可用数据的过程。数据采集不仅依赖于官方信息来源,
保持合法和道德
合法性
道德数据采集
Data Scraping vs DataCrawling 爬取最难区分的事情之一就是如何协调连续爬取。我们的蜘蛛在爬行时需要足够礼貌,以避免目标服务器不堪重负而踢出蜘蛛。最后,不同爬虫之间可能存在冲突,但在数据抓取上不会发生这种情况。
需要爬取解析解析器
数据爬取API数据提取工具
为了防止抓取(也称为 Webscraping、Screenscraping、Web Data Mining、Web Harvesting 或 Web Data Extraction),了解这些抓取工具的工作原理以及了解阻止它们正常工作的原因会很有帮助。
有几种类型的刮刀,每种的工作方式不同:
HTML Parser Shell Script Screenscrapers Web Scraping Service Manual Copy-Paste:人们复制和粘贴内容以在其他地方使用。
这些不同类型的爬虫之间有很多重叠之处,即使它们使用不同的技术和方法,它们的行为也会相似。
网络爬虫基础
例如,如果你使用的是谷歌搜索引擎,爬虫会通过服务器中索引的结果访问指定的页面,然后将其检索并存储在谷歌的服务器中。网络爬虫还通过 网站 中的超链接访问其他 网站。所以当你向搜索引擎询问“软件开发课程”时,所有符合条件的页面都会被返回。网络爬虫被配置为管理这些网页,以便生成的数据快速而新鲜。
大多数网络爬虫会自动将数据转换为用户友好的格式。他们还将它编译成随时可用的可下载包,以便于访问。Google 内部的搜索机制是什么?数据挖掘 当网络爬虫从不同的网站中爬取大量数据时,数据仍然是非结构化的,例如JSON、CSV或XML格式。
数据挖掘就是从这些数据中获取有用的信息。所以你可以说网络爬虫是数据挖掘过程的第一步。
企业越来越重视管理数据挖掘和遵循分析实践。在医学、保险、商业等领域有很多这样的例子。 Image Mining - A Data Mining Application Data Extraction Web Crawling with Apache Nutch
看看 Nutch 的主要构建块 Elasticsearch 如何提取信息。
一些不错的爬虫 Storm-crawler。Elasticsearch 河网。攻击
可能适用于初学者刮刀的事情:
通常有帮助的事情:
有帮助但会让你的用户讨厌你的事情:
防止 网站 爬取
我有一个相当大的音乐 网站 和一个庞大的艺术家数据库。我一直注意到其他音乐网站s 正在抓取我们的网站 数据(我在这里和那里输入虚拟艺术家的名字并在谷歌上搜索它们)。如何防止屏幕划伤?甚至可能吗?
你不能完全阻止它,因为无论你做什么,一个坚固的刮刀仍然可以弄清楚如何刮。但是,可以通过执行以下操作来停止*敏*感*词*刮擦:
监控日志和流量模式以限制访问
具体来说,一些想法:
使用其他指标:这对于运行 JavaScript 的屏幕抓取工具非常有用,因为可以从中获取大量信息。速率限制:不要暂时阻止访问,而是使用验证码:
安全堆栈交换相关问题:
基于 IP 的限制根本不起作用——这里有太多的公共代理服务器,而且 TOR……它不会减慢爬网速度(对于那些_真的_想要你的数据的人)。
确保所有用户标头都有效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
---
#### 如果用户代理为空/丢失,则不接受请求
- 通常爬虫不会随其请求发送用户代理标头,而所有浏览器和搜索引擎蜘蛛都会
- 如果收到不存在用户代理标头的请求,可以显示验证码,或者简单地阻止或限制访问。
> 基于**用户代理**的过滤根本没有帮助。任何认真的数据挖掘者都会在他的抓取工具中将其设置为正确的数据。
---
#### 如果用户代理是常见的抓取工具 则不要接受请求 黑名单
- 可以在发现已知屏幕抓取器用户代理字符串时设置黑名单。
- 在某些情况下,scraper 会使用一个没有真正的浏览器或搜索引擎蜘蛛使用的用户代理,例如:
- “Mozilla”(仅此而已,仅此而已。我在这里看到了一些关于抓取的问题,使用它。真正的浏览器永远不会只使用它)
- “Java 1.7.43\_u43”(默认情况下,Java 的 HttpUrlConnection 使用类似的东西。)
- “BIZCO EasyScraping Studio 2.0”
- "wget", "curl", "libcurl",..(Wget 和 cURL 有时用于基本抓取)
- 屏蔽常见的抓取用户代理,你会在主要/大型网站中看到这个,因为你不可能用“python3.4”作为你的用户代理来抓取它们。
- 如果发现网站上的爬虫使用了特定的用户代理字符串,而真实浏览器或合法蜘蛛并未使用该字符串,也可以将其添加到黑名单中。
> 知道自己在做什么的程序员可以设置用户代理字符串来模拟 Web 浏览器。
---
#### 需要注册和登录
- 如果网站可行,则需要创建帐户才能查看内容。这对爬虫来说是一个很好的威慑
- 创建和登录帐户,可以准确地跟踪用户和爬虫操作。
- 可以轻松检测特定帐户何时被用于抓取并禁止它。
- 诸如速率限制或检测滥用(例如短时间内大量搜索)之类的事情变得更容易,因为可以识别特定的抓取工具而不仅仅是 IP 地址。
为了避免脚本创建多个帐户"
- 需要一个用于注册的电子邮件地址,并通过发送必须打开才能激活帐户的链接来验证该电子邮件地址。每个电子邮件地址只允许一个帐户。
- 需要在注册/帐户创建期间解决验证码。
> 需要创建帐户才能查看内容将把用户和搜索引擎赶走;
> 需要创建帐户才能查看文章,用户将前往别处。
> 打败它的最简单方法(无需任何分析和/或编写登录协议脚本)就是以普通用户身份登录站点,使用 Mozilla,然后运行基于 Mozrepl 的抓取工具...
> _要求登录_对匿名机器人有帮助,但对想要抓取数据的人没有帮助。他只是将自己注册到网站作为普通用户。
> 屏幕抓取工具可能会设置一个帐户并可能巧妙地编写脚本来为他们登录。
---
#### 阻止来自云托管和抓取服务 IP 地址的访问
- 有时,抓取工具会通过 Web 托管服务运行,例如 Amazon Web Services 或 GAE,或 VPS。限制来自此类云托管服务使用的 IP 地址的请求访问网站(或显示验证码)。
- 可以限制来自代理或 VPN 提供商使用的 IP 地址的访问,因为抓取工具可能会使用此类代理服务器来避免检测到许多请求。
- 通过阻止来自代理服务器和 VPN 的访问,将对真实用户产生负面影响。
---
#### 使错误消息变得难以描述
如果阻止/限制访问,应该确保没有告诉刮板是什么导致了堵塞,从而为他们提供了如何修复刮板的线索。
不好的错误页面:
- 来自 IP 地址的请求过多,请稍后重试。
- 错误,用户代理标头不存在!
友好的错误消息
- 不会告诉刮板是什么原因造成的
- 抱歉,出了一些问题。如果`helpdesk@example.com`问题仍然存在,可以通过 联系支持。
- 应该考虑为后续请求显示验证码而不是硬块,以防真实用户看到错误消息,这样就不会阻止,从而导致合法用户与联系。
---
#### 使用验证码
- 验证码(“完全自动化的测试以区分计算机和人类”)对于阻止抓取工具非常有效。
- 使用验证码并要求在返回页面之前完成验证。
- 当怀疑可能存在抓取工具并希望停止抓取时,它们非常有用,而且不会阻止访问,以防它不是抓取工具而是真实用户。如果怀疑是抓取工具,可能需要考虑在允许访问内容之前显示验证码。
使用验证码时需要注意的事项:
- 不要自己动手
- 使用类似 Google 的reCaptcha 之类的东西:
- 它比自己实现验证码要容易得多,
- 它比自己可能想出的一些模糊和扭曲的文本解决方案更用户友好(用户通常只需要勾选一个框),
- 而且对于脚本编写者来说,解决它比从站点提供的简单图像要困难得多
- 不要在 HTML 标记中包含验证码的解决方案
- 网站,它_在页面本身中_提供了验证码的解决方案, 使它变得毫无用处。
- 验证码可以批量解决:
- 除非的数据非常有价值,否则不太可能使用这种服务。
- 有验证码解决服务,实际的、低薪的人工批量解决验证码。
- 使用 reCaptcha 是一个好主意,因为它们有保护措施(例如用户有相对较短的时间来解决验证码)。
> **Captcha**(好的 - 像 reCaptcha)有很大帮助
---
#### 将文本内容作为图像提供
- 可以将文本渲染到图像服务器端,然后将其显示出来,这将阻碍简单的抓取工具提取文本。
- 这是非常可靠的,并且比 CAPTCHA 对用户的痛苦要小,这意味着他们将无法剪切和粘贴,并且无法很好地缩放或访问。
- 然而
- 这对屏幕阅读器、搜索引擎、性能以及几乎所有其他方面都是不利的。
- 在某些地方它也是非法的(由于可访问性,例如美国残疾人法案),并且使用某些 OCR 也很容易规避,所以不要这样做。
- 可以用 CSS 精灵做类似的事情,但会遇到同样的问题。
> 很难抓取隐藏在图像中的数据。(例如,简单地将数据转换为服务器端的图像)。
> 使用“tesseract”(OCR)多次有帮助 - 但老实说 - 数据必须值得刮板的麻烦。(很多时候不值得)。
---
#### 不要公开完整数据集
- 如果可行,不要为脚本/机器人提供获取所有数据集的方法。
- 例子:
- 新闻网站,有很多单独的文章。
- 可以使这些文章只能通过站点搜索来访问它们,
- 如果没有站点上 _所有_ 文章及其 URL的列表,则只能通过使用搜索来访问这些文章特征。
- 这意味着想要从网站上删除所有文章的脚本必须搜索可能出现在文章中的所有可能的短语才能找到它们,
- 这将非常耗时,效率极低,并且有望使刮板放弃。
如果出现以下情况,这将无效:
- 机器人/脚本 无论如何都不需要/需要完整的数据集。
- 文章是从类似于`example.com/article.php?articleId=12345`. 这(以及类似的东西)将允许抓取器简单地遍历所有`articleId`s 并以这种方式请求所有文章。
- 还有其他方法可以最终找到所有文章,例如通过编写脚本来跟踪文章中指向其他文章的链接。
- 搜索诸如“and”或“the”之类的内容几乎可以揭示所有内容,因此需要注意这一点。(可以通过仅返回前 10 或 20 个结果来避免这种情况)。
- 需要搜索引擎来查找内容。
---
#### 使用网站的Java小程序或Flash
- 最难的是其使用网站的**Java小程序或Flash**,和小程序使用**安全的HTTPS**内部请求本身
- 目前很少有网站使用它们。
---
#### 加密/编码数
- 仅限小型站点
- 许多提供加密/编码数据的网站,这些数据在任何编程语言中都无法解密,因为加密方法不存在。
- 通过加密和最小化输出(警告:这对大型网站来说这不是一个好主意)在 PHP 网站中实现了这一点,响应总是混乱的内容。
在 PHP 中最小化输出的示例(如何最小化 php 页面 html 输出?):
1
2
3
4
5
6
7
8
9
10
11
12
13
```
不要暴露您的 API、端点和类似的东西:频繁更改 URL 路径可以防止 HTML 解析器和爬虫根据用户的位置更改 HTML 频繁更改 HTML
频繁更改 HTML 和页面结构
如果它不能从标记中找到它需要的东西,爬虫将根据 HTML 的结构来寻找它。
需要注意的事项:
聪明的爬虫仍然可以通过推断实际内容的位置来获取内容
本质上,确保脚本不容易找到每个相似页面的实际需要。
示例:网站 上有一个搜索功能,位于 /search?query=somesearchquery,它返回以下 HTML:
1
2
3
4
5
6
Stack Overflow has become the world's most popular programming Q & A website
The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...
Read more</a>
(And so on, lots more identically structured divs with search results)
</p>
1
2
3
4
5
6
7
8
9
10
11
12
Stack Overflow has become the world's most popular programming Q & A website
The website Stack Overflow has now become the most popular programming Q & A website, with 10 million questions and many users, which...
Read more</a>
Visit Example.com now, for all the latest Stack Overflow related news !
Example.com is so awesome, visit now !</p>
Visit Now !</a>
(More real search results follow)
</p>
这意味着根据类或 ID 从 HTML 中提取数据的爬虫似乎会继续工作,但它们会得到假数据,甚至是真实用户永远看不到的广告,因为它们被 CSS 隐藏了。
将虚假的、不可见的蜜罐数据插入页面
1
2
3
4
5
6
This search result is here to prevent scraping
<p class="/spanspan class="n"search/spanspan class="o"-/spanspan class="n"result/spanspan class="o"-/spanspan class="n"excerpt/spanspan class="s"">If you are a human and see this, please ignore it. If you are a scraper, please click the link below :-) Note that clicking the link below will block access to this site for 24 hours.
<a class"/spanspan class="n"search/spanspan class="o"-/spanspan class="n"result/spanspan class="o"-/spanspan class="n"link/spanspan class="s"" href="/spanspan class="o"//spanspan class="n"scrapertrap/spanspan class="o"//spanspan class="n"scrapertrap/spanspan class="o"./spanspan class="na"php/spanspan class="err""/spanspan class="o">I am a scraper !
(The actual, real, search results follow.)
</p>
将不可见的蜜罐项添加到 HTML 以捕获刮板。
scrapertrap.php 可以做点什么吗
将此与之前频繁更改 HTML 的技术结合起来。
如果检测到爬虫,则提供虚假和无用的数据 如果它不请求资产(CSS、图像),则它不是真正的浏览器。使用和需要 cookie 跟踪用户和抓取操作 使用 cookie 可能不起作用,因为爬虫也可以发送带有请求的 cookie 并根据需要丢弃它们。如果该站点仅使用 cookie,它还将阻止禁用 cookie 的真实用户访问。使用 JavaScript 设置和检索 cookie 将阻止不运行 JavaScript 的爬虫,因为它们无法检索和发送带有请求的 cookie。
–
使用 JavaScript + Ajax 加载内容
意识到:
混淆标签、来自脚本的网络请求以及其他所有内容。如果您确实使用 Ajax 加载数据,您应该在不先加载页面的情况下使端点难以使用
例如,一些会话密钥需要作为参数,可以嵌入到 JavaScript 或 HTML 中。
混淆后的数据也可以直接嵌入到初始 HTML 页面中,使用 JavaScript 进行去混淆和显示,从而避免额外的网络请求。这样做会使使用不运行 JavaScript 的纯 HTML 解析器提取数据变得更加困难,因为编写爬虫程序的人必须对 JavaScript 进行逆向工程(并且应该对其进行混淆)。
但是,这样做有几个缺点:
非技术性使数据可用,提供各种 API 的 robots.txt
假设 robots.txt 已经设置好了。
正如其他人所提到的,爬虫几乎可以伪造其活动的每个方面,并且很难识别来自不良行为者的请求。
考虑:
设置一个页面,/jail.html。禁止访问 robots.txt 页面(因此受人尊敬的蜘蛛永远不会访问)。在其中一个页面上放置一个链接,用 CSS 隐藏它( display: none )。将访问者的 IP 地址记录到 /jail.html。
如果一个特定的IP地址访问速度非常快,那么在几次访问之后(5-10)把它的IP地址+浏览器信息放到一个文件或数据库中。(这将是一个后台进程并且一直运行或者安排在几分钟内。)制作另一个脚本来继续检查那些可疑的 IP 地址。
如果用户代理是已知的搜索引擎,例如 Google、Bing、Yahoo(您可以通过谷歌搜索找到有关用户代理的更多信息)。那你得看看。此列表并尝试匹配模式。如果它看起来像一个假的用户代理,请在下次访问时要求验证码。(需要对机器人 IP 地址进行更多研究。我知道这是可能的,也可以尝试使用 whois 作为 IP 地址。它可能会有所帮助。) 没有搜索机器人的用户代理:只要求下次访问 填写验证码。
第一的:
不值得尝试使用一些技术障碍,导致:
纯 HMTL
可以动态生成 HTML 结构,以及 CSS 类名(和 CSS 本身)(例如,通过使用一些随机类名)
没有办法改变每个响应的结构,因为普通用户会讨厌它。此外,这会比刮刀造成更多的麻烦(维护)。XPath 或 CSS 路径可以通过基于已知内容的爬网脚本自动确定。
Ajax - 一开始有点难,但很多时候加速了抓取过程:) - 为什么?
所以,_ajax_ 并没有多大帮助......
使用大量 javascript 函数的页面。
这里可以使用两种基本方法:
这种抓取速度很慢(抓取是在常规浏览器中完成的),但它是
请记住:如果您想(以友好的方式)向普通用户发布数据,隐藏数据几乎是不可能的。
所以,
设置正确的使用权限(例如必须引用来源) 许多数据没有版权 - 很难保护它们 添加一些虚假数据(如已经完成的那样)并使用合法工具
一个快速的方法是设置一个诱杀/机器人陷阱。
制作一个页面,如果它打开一定次数或根本不打开,则采集某些信息,如 IP 等(也可以考虑违规或模式,但页面根本不必打开)。
在使用 CSS 隐藏的页面中创建指向此内容的链接 display:none; . 或左:-9999px;位置:绝对;尝试将其放置在不太可能被忽略的位置,例如内容而不是页脚的位置,因为有时机器人会选择忘记页面的某些部分。
在 robots.txt 文件中,为不希望友好机器人(哈哈,就像他们有笑脸!)的页面设置一大堆无规则来采集信息并使此页面成为其中之一。
现在,如果一个友好的机器人通过它应该忽略该页面。是的,但这还不够好。制作更多这些页面或以某种方式重新路由页面以接受不同的名称。然后在 robots.txt 文件中的这些陷阱页面旁边放置更多阻止规则,以及您要忽略的页面。
采集这些机器人或访问这些页面的任何人的 IP,不要禁止它们,但可以在内容中显示混乱的文本,如随机数、版权声明、特定文本字符串、显示可怕的图片,基本上是任何妨碍它们的东西好的内容。也可以设置一个链接到一个需要永远加载的页面,即。在 php 中,您可以使用 sleep() 函数。如果它有某种检测来绕过加载时间过长的页面,这将反击爬虫,因为一些编写良好的机器人被设置为一次处理 X 个链接。
制作特定的文本字符串/句子,转到您最喜欢的搜索引擎并搜索它们,它可能会显示内容的结束位置。
无论如何,如果从战术上和创造性地思考,这可能是一个很好的起点。最好的方法是了解机器人的工作原理。
我还会考虑欺骗页面元素上的某些 ID 或属性的显示方式:
1
<a class="someclass" href="../xyz/abc" rel="nofollow" title="sometitle">
它每次都会改变其形式,因为可能会设置一些机器人来寻找页面或目标元素中的特定模式。
1
2
3
<a title="sometitle" href="../xyz/abc" rel="nofollow" class="someclass">
id="p-12802" > id="p-00392"
预格式化文本
.