网页抓取不会被阻止
网页抓取是指使用 HTTP 协议或网络浏览器从网站抓取/提取数据的过程。该过程可以是手动的,也可以是使用机器人或网络爬虫实现的自动化。此外,人们对网页抓取是非法的存在误解,事实是,除非您尝试访问非公开数据(如登录凭据等公众无法访问的数据),否则它是完全合法的。
当您浏览小型网站时,您可能不会遇到任何问题。但是当您尝试在一些大型网站甚至 Google 上进行网络抓取时,您可能会发现您的请求被忽略,甚至您的 IP 被阻止。
在本文中,我们将向您推荐一些可以在从网络上抓取数据时可以遵循的最佳实践,而不会阻止您自己(您的 IP)。
方法 1:使用轮换代理
如果您从同一 IP 发送重复请求,网站所有者可以检测到您的足迹,并可能通过检查服务器日志文件来阻止您的网络爬虫。为避免这种情况,您可以使用轮换代理。
轮换代理是一种代理服务器,它从代理池中存储的一组代理中分配一个新的 IP 地址。我们需要使用代理并轮换我们的 IP 地址,以避免被网站所有者检测到。我们需要做的就是编写一个脚本,让我们使用池中的任何 IP 地址,并让我们使用相同的 IP 地址进行请求。使用轮换 IP 概念的目的是让您看起来不是机器人而是人类,从世界不同地区的不同位置访问数据。
第一步涉及寻找代理:有许多网站通过互联网提供免费代理。其中之一是 https://free-proxy-list.net/ 。
这里使用的代理:
- IP:180.179.98.22
- 端口:3128
类似地,我们可以从 https://free-proxy-list.net/ 手动或使用刮刀自动获取代理列表。
程序:
Python
import requests
# use to parse html text
from lxml.html import fromstring
from itertools import cycle
import traceback
def to_get_proxies():
# website to get free proxies
url = 'https://free-proxy-list.net/'
response = requests.get(url)
parser = fromstring(response.text)
# using a set to avoid duplicate IP entries.
proxies = set()
for i in parser.xpath('//tbody/tr')[:10]:
# to check if the corresponding IP is of type HTTPS
if i.xpath('.//td[7][contains(text(),"yes")]'):
# Grabbing IP and corresponding PORT
proxy = ":".join([i.xpath('.//td[1]/text()')[0],
i.xpath('.//td[2]/text()')[0]])
proxies.add(proxy)
return proxies
Python
proxies = to_get_proxies()
# to rotate through the list of IPs
proxyPool = cycle(proxies)
# insert the url of the website you want to scrape.
url = ''
for i in range(1, 11):
# Get a proxy from the pool
proxy = next(proxyPool)
print("Request #%d" % i)
try:
response = requests.get(url, proxies={"http": proxy, "https": proxy})
print(response.json())
except:
# One has to try the entire process as most
# free proxies will get connection errors
# We will just skip retries.
print("Skipping. Connection error")
输出:
proxies={‘160.16.77.108:3128’, ‘20.195.17.90:3128’, ‘14.225.5.68:80’, ‘158.46.127.222:52574’, ‘159.192.130.233:8080’, ‘124.106.224.5:8080’, ‘51.79.157.202:443’, ‘161.202.226.194:80’}
现在我们有一组可用的代理 IP 地址列表。我们将使用循环法轮换 IP。
程序:
Python
proxies = to_get_proxies()
# to rotate through the list of IPs
proxyPool = cycle(proxies)
# insert the url of the website you want to scrape.
url = ''
for i in range(1, 11):
# Get a proxy from the pool
proxy = next(proxyPool)
print("Request #%d" % i)
try:
response = requests.get(url, proxies={"http": proxy, "https": proxy})
print(response.json())
except:
# One has to try the entire process as most
# free proxies will get connection errors
# We will just skip retries.
print("Skipping. Connection error")
输出:
Request #1
Skipping. Connection error
Request #2
Skipping. Connection error
Request #3
Skipping. Connection error
Request #4
Skipping. Connection error
Request #5
Skipping. Connection error
Request #6
Skipping. Connection error
Request #7
Skipping. Connection error
Request #8
Skipping. Connection error
Request #9
Skipping. Connection error
Request #10
Skipping. Connection error
使用代理轮换时要记住的事情:
- 避免使用某种顺序的代理 IP 地址:
如果请求来自类似的子网或连续连续,则任何反抓取插件都会检测到抓取器。例如:132.12.12.1, 132.12.12.2, 132.12.12.3, 132.12.12.4 的顺序相同。您应该避免使用此类 IP,因为大多数反抓取插件旨在阻止某些范围内或某些特定序列中的 IP。
- 使用付费代理:
免费代理往往很快就会消失。此外,免费代理在互联网上被过度使用,并且已经被大多数反抓取工具列入黑名单。此外,如果您使用免费代理来防止抓取过程中断,则可以自动化该过程。
方法二:使用谷歌云平台IP
将 Google Cloud Functions 用作网络抓取工具的托管平台,同时将用户代理更改为 GoogleBot,这可能会有所帮助。网站会显示您是 GoogleBot 而不是抓取工具。 GoogleBot 是由 Google 设计的网络爬虫,它每隔几秒钟访问一次站点,并从站点收集文档,为 Google 搜索引擎构建可搜索索引。由于大多数网站都不会阻止 GoogleBot,因此如果您使用 Google Cloud 功能作为托管平台,则您的抓取工具不会被阻止的可能性更高。
方法三:慢慢爬网
当我们使用自动抓取工具抓取数据时,抓取工具会以非人的速度抓取数据,反抓取插件很容易检测到这种速度。通过向我们的爬虫添加随机延迟和动作,我们可以使其类似于人类,因此网站所有者不会检测到它。发送请求太快可能会使所有用户的网站崩溃。将请求数量保持在限制范围内,以免网站服务器过载并阻止您的 IP。
此外,您可以使用站点的 robots.txt 检查两个请求之间的延迟应该是多少。通常,您可以在 robots.txt 页面上找到 crawl-delay 字段,该字段准确说明请求之间的延迟应该是多少,以避免被识别为爬虫。
方法四:不同时段的网页抓取
在不同的一天登录同一个网站也会减少您的足迹。例如:如果您每天早上 8:00 开始抓取,那么接下来几天从早上 8:20 或 8:25 这样的时间开始抓取。每天在您的开始时间增加几分钟可以证明对逃避爬虫的检测算法非常有帮助。
方法 5:使用 CAPTCHA 解决服务
大多数网站使用 CAPTCHA 来检测机器人流量。我们可以使用 CAPTCHA 解决服务轻松绕过这一额外的安全层。有一些 CAPTCHA 解决服务,例如:
- 反验证码。
- 死亡验证码
要记住的一点是,这些服务需要额外收费,并且可能会增加从网站上抓取数据的时间。因此,如果您选择使用 CAPTCHA 解决服务,您应该考虑可能需要承担的额外时间和费用。
方法 6:从 Google 缓存中抓取:
为了从那些数据不经常变化的网站上抓取数据,我们可以使用谷歌缓存。 Google 会保留一些网站的缓存副本。您可以向其缓存数据发出请求,而不是向原始数据发出请求。要访问任何网页上的缓存,请在此 URL 前面添加网站的 URL
句法:
http://webcache.googleusercontent.com/search?q=cache:URL(URL of the website you want to scrape).
方法 7:用户代理
这是一个,让服务器和对等识别应用程序或请求用户的操作系统的版本。如果不是来自主要浏览器,某些站点会阻止用户代理。如果未设置,许多网站将不允许访问内容。您可以通过两种方式找到您的用户代理:
- 打字 – “我在 Google 上的用户代理是什么”
- 您可以在此网站上找到用户代理字符串- http://www.whatsmyuseragent.com/。
此问题的解决方案是您需要创建用户代理列表或使用诸如 fake-useragent(Python) 之类的库。
方法 8:无头浏览器
网站会根据您请求数据的浏览器更改其内容。抓取某些网站时的问题是内容是由 JavaScript 代码(抓取时)呈现的,而不是 HTML。要抓取此类网站,您可能需要部署自己的自定义无头浏览器。 Selenium和 Puppeteer 等自动化浏览器也可用于控制和抓取此类动态网站。这是一个很大的努力,但这是最有效的方法。