如何识别和防止 Python 爬虫的反爬虫机制?

2023-04-17 00:00:00 爬虫 机制 如何识别
  1. User-Agent识别

很多网站会对不同类型的访问者进行不同的限制,例如不同类型的浏览器、操作系统等。因此,可以通过修改爬虫的User-Agent,让其伪装成浏览器访问,以此来避免被检测出来。

示例代码:

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
response = requests.get('https://pidancode.com', headers=headers)
print(response.text)
  1. IP识别

一些网站会限制同一IP地址的访问频率,以防止爬虫的恶意攻击。因此,可以通过使用代理IP的方式来避免被限制住。

示例代码:

import requests

# 首先需要获取代理IP的地址
proxy_url = 'http://www.xicidaili.com/wt/'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
response = requests.get(proxy_url, headers=headers)
# 在这里使用正则表达式进行匹配,获取一个可用的代理IP
# 如 121.69.29.162:53281
proxies = {
    'http': 'http://121.69.29.162:53281',
    'https': 'https://121.69.29.162:53281'
}
response = requests.get('https://pidancode.com', proxies=proxies)
print(response.text)
  1. Cookie识别

有一些网站会使用Cookie技术来识别用户,例如实现登录等。因此,可以通过模拟登录的方式来获取Cookie,以此来达到爬虫不被识别的效果。

示例代码:

import requests

# 先登录获取Cookie
login_url = 'https://baidu.com/login'
login_data = {'username': 'xxx', 'password': 'xxx'}  # 填写真实的用户名和密码
response = requests.post(login_url, data=login_data)
print(response.cookies)
# 输出类似以下这样的结果
# <RequestsCookieJar[<Cookie SESSION=xxx for .baidu.com/>]>

# 然后访问需要登录才能访问的网站
cookies = {'SESSION': 'xxx'}
response = requests.get('https://pidancode.com', cookies=cookies)
print(response.text)
  1. JS逆向识别

一些网站会使用JavaScript技术对用户进行识别和限制。因此,我们需要反向分析网站的JavaScript代码,找到其识别的关键代码,再根据其特征加以规避。

示例代码:

假设网站的JavaScript代码中有以下关键代码:

function getUserName() {
    return document.cookie.match(/username=([^;]+)/)[1];
}

则可以通过在请求头中添加一个伪造的Cookie“username=pidancode”来规避识别:

import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
    'Cookie': 'username=pidancode'
}
response = requests.get('https://pidancode.com', headers=headers)
print(response.text)

相关文章