Python中常见的反爬机制及其破解方法总结

Python中常见的反爬机制及其破解方法总结

1. 反爬机制简介

随着互联网技术的快速发展,数据量剧增,各种网络爬虫不断涌现,研究数据更成为人们的一项重要工作。然而,由于缺乏有效的反爬机制,爬虫爬取数据也变得越来越容易,因此各大网站也都升级了自己的反爬手段,以抵御爬虫。常见的反爬手段有以下几种:

  • IP封禁:对频繁访问、请求量过大的IP地址进行屏蔽。
  • User-Agent过滤:检查请求头中的User-Agent,对白名单以外的User-Agent进行拦截(例如,对机器人而言,User-Agent列表搜藏机器人也是一种有效的反爬手段)。
  • 验证码:分布式请求时,往往需要验证码进行验证。
  • 动态页面加载:Ajax和JavaScript动态加载,导致数据源地址的变化。
  • 带cookie认证: 登录的session验证,不同身份的用户访问同一地址,获取到的数据不同。

2. 反爬破解方法

2.1 IP封禁

  • 使用代理IP或者VPN进行请求。
  • 使用多台主机,分部进行爬取,降低单个IP的访问量。

2.2 User-Agent过滤

在爬取时,我们可以通过伪装User-Agent来避免被网站禁止访问。

例如在python中,使用requests库可以设置HTTP请求头,修改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.3'}
url = 'https://www.baidu.com'
response = requests.get(url, headers=headers)

2.3 验证码

在爬取时,使用分布式爬虫框架或者使用验证码识别API,通过OCR识别验证码进行验证。

2.4 动态页面加载

使用Selenium+PhantomJS进行模拟用户操作来爬取动态加载的页面。

例如,在python中使用Selenium+PhantomJS爬去淘宝搜索页面:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

browser = webdriver.PhantomJS()#PhantomJS
browser.get('https://www.taobao.com/')

elem = browser.find_element_by_name("q")#寻找淘宝搜索窗口
elem.send_keys("迅游加速器")
elem.send_keys(Keys.RETURN)#输入关键词并模拟搜索

print(browser.page_source)#返回当前页面资源代码
browser.close()

2.5 带cookie认证

在爬取时,使用requests库中的Session对象保存cookies,在下一次请求时,传递cookies。

例如,在python中,模拟登录Github账号:

import requests

# login
session = requests.Session()
login_url = 'https://github.com/login'
response_login = session.get(login_url)


# csrf token
headers_login = response_login.headers
ghs = headers_login.setdefault('Set-Cookie', '').split(';')[0]
_, csrf_token = [c.split('=')[-1] for c in headers_login['Set-Cookie'].split(';') if c.startswith('_gh_sess=') or c.startswith('user_session=')]
headers_login['Cookie'] = ghs
headers_login['Referer'] = 'https://github.com/'
soup = bs4.BeautifulSoup(response_login.content)

form = soup.find('form')
inputs = form.find_all('input')
for _input in inputs:
    if _input.get('name') == 'commit':
        submit_value = _input.get('value')
    if _input.get('name') == 'utf8':
        utf8_value = _input.get('value')
        continue
    headers_login.setdefault(_input.get('name'), _input.get('value'))
headers_login.pop('None', None)

headers_login.update({
    'Host': 'github.com',
    'Origin': 'https://github.com',
    'Referer': 'https://github.com/login',
})

headers_login['Accept-Language'] = 'en-US,en;q=0.8'
headers_login['Content-Type'] = 'application/x-www-form-urlencoded'
data_login = {x.get('name'): x.get('value') for x in form.find_all('input')}

post_url = 'https://github.com/session'
response_post = session.post(post_url, headers=headers_login, data=data_login)

# enter the homepage of our own
entry = session.get('https://github.com/settings/profile').text

以上就是Python中常见的反爬机制及其破解方法的总结,当然,不同网站的反爬手段各不相同,所以在你的爬虫实现中也需要根据具体情况来处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中常见的反爬机制及其破解方法总结 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python 字符串和整数的转换方法

    Python 中字符串与整数的转换方法非常简单,我们可以使用内置的函数实现这一功能。 从字符串转换为整数 将字符串转换为整数的过程叫做“字符串转整数”,在 Python 中有两种方法可以实现。 方法1: 使用 int() 函数 我们可以使用 int() 函数将字符串转换为整数。int() 函数接受一个字符串作为参数,返回一个整数。 num_str = &qu…

    python 2023年6月5日
    00
  • Python模仿POST提交HTTP数据及使用Cookie值的方法

    首先,我们需要了解一下Python中进行POST提交HTTP数据的基本方法。 Python模拟POST提交HTTP数据的基本方法 要实现POST提交HTTP数据,可以使用Python中的requests库。requests库是Python HTTP库的一种,它允许您以简单而优雅的方式发送HTTP/1.1请求。 首先需要安装requests库: pip ins…

    python 2023年6月3日
    00
  • Python OpenCV实现图片预处理的方法详解

    Python OpenCV实现图片预处理的方法详解 介绍 在进行机器视觉相关任务时,我们经常需要进行图片预处理,以得到更好的视觉效果或者更好的算法结果。Python OpenCV是一个非常流行的图像处理库,其中包含了丰富的图像处理工具,可用于加速并简化图像预处理的过程。 本文将详细讲解如何通过Python OpenCV实现图片预处理的方法,包括调整大小、裁剪…

    python 2023年5月18日
    00
  • openCV提取图像中的矩形区域

    要从图像中提取矩形区域,需要使用OpenCV的矩形框架(Rectangles)。以下是使用OpenCV提取图像中矩形区域的完整攻略。 确定矩形框的坐标 首先,需要确定矩形区域的坐标。可以手动指定框的坐标,或者通过其他算法自动获取坐标。OpenCV提供了丰富的算法,比如轮廓检测等。 代码示例1:手动指定矩形框坐标 import cv2 img = cv2.im…

    python 2023年5月19日
    00
  • 使用python检查值是否已经存在于字典列表中

    当我们操作字典列表的时候,有时候需要检查某个值是否已经存在于字典列表中。在Python中,我们可以使用以下几种方式来实现这个功能: 方式一:使用循环遍历字典列表 当字典列表中的元素比较少时,我们可以使用循环遍历字典列表来检查某个值是否已经存在于字典列表中,具体步骤如下: # 定义一个字典列表 users = [ {‘name’: ‘Tom’, ‘age’: …

    python 2023年5月13日
    00
  • 爬虫—文件存储—CSV存储

    一,简介       CSV,全称Comma—Separated Values,可以称为逗号分隔或者字符分隔值,其文件以纯文本形式存储表格数据。该文件是一个字符序列,可以有任意的数目记录组成,记录间已某种换行符分隔。每条记录由字段组成,字段间的分隔符是其他字符或字符串,最常见的是逗号或制表符。相比EXcel更加简洁,就是特定字符分隔的纯文本。 二,写入CSV…

    爬虫 2023年4月13日
    00
  • opencv+python实现鼠标点击图像,输出该点的RGB和HSV值

    实现鼠标点击图像,输出该点的RGB和HSV值,需要用到OpenCV和Python。以下是完整攻略: 确定环境及安装依赖 首先需要确认本地环境已经安装好以下软件和库: Python3 OpenCV库 NumPy库 如果上述环境还没有安装,可以前往官网下载并安装。 打开终端窗口,使用pip命令安装OpenCV和NumPy库: pip install opencv…

    python 2023年5月18日
    00
  • python开发App基础操作API使用示例过程

    Python开发App基础操作API使用示例过程 Python是一种流行的编程语言,可以用于开发各种类型的应用程序,包括桌面应用程序、Web应用程序和移动应用。本文将为您供一个完整攻略,详细讲解Python开发App基础操作API的使用示例过程,包括环境搭建、API使用和两个示例说明。 1. 环境搭建 在Python中,我们可以使用第三方库来开发移动应用程序…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部