📜  网页抓取不会被阻止(1)

📅  最后修改于: 2023-12-03 15:27:40.962000             🧑  作者: Mango

网页抓取不会被阻止

网页抓取是指程序自动地从网页上获取数据的行为。这种行为对于网络爬虫和其他自动化工具来说是必要的。但是,有时候我们会遇到网页抓取被网站阻挡的情况。本文将介绍一些技巧,以确保您的网页抓取不会被阻止。

常见的网页抓取防护

网站防护机制主要包括以下几个方面:

  • User-Agent 检测
  • IP 黑名单
  • Cookie 检测
  • 访问频率限制
  • 行为检测

针对这些防护机制,我们可以采取以下措施,确保我们的网页抓取不会被阻止。

User-Agent 检测

User-Agent 是 HTTP 请求头的一部分,它用来描述客户端的软件信息和操作系统信息。很多网站都会根据 User-Agent 来判断请求的来源。如果发现请求是由著名的爬虫程序发送的,有些网站会直接封锁这个客户端的 IP 地址。

因此,我们应该在编写爬虫程序时尽可能模拟普通用户的行为。比如,我们可以在请求头中加入一些常见的 User-Agent,并随机选择一个 User-Agent 来发送请求。这样,我们的程序就不容易被网站识别为爬虫程序。

以下是一个随机选择 User-Agent 的代码片段:

import random

user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
    'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0',
    'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'
]

headers = {'User-Agent': random.choice(user_agents)}
IP 黑名单

一些网站会维护一个 IP 黑名单,如果发现某个 IP 多次发送异常请求,就会将这个 IP 加入黑名单。如果您的程序所使用的 IP 地址被封锁,那么您的网页抓取就无法进行。

为了解决这个问题,我们可以使用一些提供代理 IP 的服务商来获取多个 IP 地址。再加上一些轮询的逻辑,保证每次请求都使用不同的 IP 地址,这样就可以避免因为 IP 被封锁而无法进行网页抓取。

以下是一个使用代理 IP 的代码片段:

import requests

proxy_url = 'http://yourproxy.com/proxy' # 代理 IP 的获取地址
proxy_list = requests.get(proxy_url).json() # 从代理 IP 供应商获取代理 IP 列表

for proxy in proxy_list:
    try:
        response = requests.get(url, proxies=proxy, headers=headers, timeout=10) # 请求时指定代理 IP
        # 处理响应
        break
    except:
        # 如果请求失败,继续尝试下一个 IP
        continue
Cookie 检测

一些网站会在服务器端设置 Cookie,用来记录用户的登录状态和行为。如果我们的程序没有正确处理 Cookie,有些网站会将我们的请求视为异常请求。

为了解决这个问题,我们可以使用 requests 库,让它自动处理 Cookie。在使用 requests 发送请求时,如果服务器在响应头中设置了 Set-Cookie,requests 会将这个 Cookie 自动保存到本地,并在下一次请求时自动发送这个 Cookie。

以下是一个使用 requests 处理 Cookie 的代码片段:

import requests

url = 'https://example.com'
session = requests.Session() # 创建一个 Session 对象

response = session.get(url, headers=headers) # 发送请求,并自动处理 Cookie

# 以后的请求都使用同一个 Session,这样 requests 会自动处理 Cookie
response = session.post(url, headers=headers, data=data, timeout=10)
访问频率限制

为了防止恶意程序对网站的访问频率过高,很多网站都会设置访问频率限制。如果我们的程序频繁地发送请求,被视为恶意行为的几率就会增加。

为了避免这种情况,我们可以在程序中加入一个随机的时间间隔,以模拟人类的行为。可以通过 random 模块来实现这个功能。

以下是一个随机时间间隔的代码片段:

import random
import time

# 随机等待 1 到 3 秒
wait_time = random.randint(1, 3)
time.sleep(wait_time)
行为检测

一些网站通过检测程序的行为来判断请求是否为异常请求。例如,网站可能会检测请求中携带的参数是否正确,请求是否符合正常的操作流程等等。

为了应对这种情况,我们需要仔细研究网站的操作流程,并模拟人类的操作方式。比如,我们可以在程序中模拟登录流程,并使用登录后的账号来爬取网站的数据。

以下是一个模拟登录的代码片段:

import requests

login_url = 'https://example.com/login'
url = 'https://example.com/data'

# 发送登录请求,如果登录成功,requests 会自动保存 Cookie
data = {'username': 'yourusername', 'password': 'yourpassword'}
response = requests.post(login_url, data=data, headers=headers)

# 使用保存的 Cookie 发送数据请求
response = requests.get(url, headers=headers, timeout=10)

通过以上措施,我们可以最大程度地避免网页抓取被阻止的情况。但请注意,如果您的程序过于频繁地访问网站,仍然可能被视为恶意程序而被封锁。因此,一定要尊重网站的规定,避免对网站造成过大的负担。