网站有反爬机制就爬不了数据?那是你不会【反】反爬

news2024/12/23 11:00:46

目录

前言

一、什么是代理IP

二、使用代理IP反反爬

1.获取代理IP

2.设置代理IP

3.验证代理IP

4.设置代理池

5.定时更新代理IP

三、反反爬案例

1.分析目标网站

2.爬取目标网站

四、总结


前言

爬虫技术的不断发展,使得许多网站都采取了反爬机制,以保护自己的数据和用户隐私。常见的反爬手段包括设置验证码、IP封锁、限制访问频率等等。

但是,这些反爬机制并不能完全阻止爬虫的进攻,因为只要有技术,就一定有方法来破解。本文将介绍如何使用代理IP来反反爬,以及相关的Python代码和案例。 

一、什么是代理IP

代理IP(Proxy IP)是指在访问网络时,使用的是代理服务器的IP地址,而不是自己的IP地址。代理服务器相当于一座桥梁,将我们请求的数据先代理一下,再转发到目标网站,从而达到隐藏我们真实IP地址的效果。

代理IP具有隐藏身份、突破访问限制、提高访问速度、保护个人隐私等作用。在反爬方面,使用代理IP可以很好地避免被封锁IP,从而爬取目标网站的数据。

二、使用代理IP反反爬

1.获取代理IP

获取代理IP最常见的方式是通过爬取免费代理网站或者购买收费代理服务。免费代理网站的免费IP质量参差不齐,且容易被封锁,而收费代理服务的IP质量相对较高,可靠性更高。

在获取代理IP时,需要注意以下几点:

  1. 获取的代理IP必须是可用的,否则无法正常访问目标网站;
  2. 获取的代理IP需要定时更新,避免被封锁或失效;
  3. 不要过于频繁地使用同一个代理IP,否则容易被目标网站识别出来。
2.设置代理IP

在使用代理IP时,需要将其设置到请求头中。以requests库为例,可以通过以下代码设置代理IP:

import requests

proxies = {
    'http': 'http://ip:port',
    'https': 'https://ip:port'
}

response = requests.get(url, proxies=proxies)

其中,`ip`和`port`是代理IP的地址和端口号,根据实际情况进行设置。

3.验证代理IP

在进行爬取之前,需要先验证代理IP是否可用。一般来说,验证代理IP的可用性可以通过访问http://httpbin.org/ip网站来进行验证。以requests库为例,可以通过以下代码验证代理IP是否可用:

import requests

proxies = {
    'http': 'http://ip:port',
    'https': 'https://ip:port'
}

try:
    response = requests.get('http://httpbin.org/ip', proxies=proxies, timeout=10)
    if response.status_code == 200:
        print('代理IP可用')
    else:
        print('代理IP不可用')
except:
    print('代理IP请求失败')
4.设置代理池

单个代理IP的可用时间有限,而且代理IP的质量也参差不齐,因此需要设置一个代理池,从中随机选择一个可用的代理IP进行访问。

代理池的实现可以通过列表、队列或数据库等方式进行。以列表为例,可以通过以下代码实现代理池的设置:

proxy_pool = [
    'http://ip1:port1',
    'http://ip2:port2',
    'http://ip3:port3',
    ...
]

proxy = random.choice(proxy_pool)

proxies = {
    'http': proxy,
    'https': proxy
}

其中,`random.choice(proxy_pool)`表示从代理池中随机选择一个代理IP进行访问。

5.定时更新代理IP

为了避免代理IP被封锁或失效,需要定时更新代理IP。更新代理IP的方法有很多种,可以通过爬取免费代理网站、购买收费代理服务或者自己搭建代理服务器等方式进行。在更新代理IP时,需要注意以下几点:

  1. 更新的代理IP必须是可用的;
  2. 更新的代理IP需要添加到代理池中,并在下一次请求中随机选择使用。

三、反反爬案例

下面以爬取豆瓣电影TOP250为例,介绍如何使用代理IP来反反爬。

1.分析目标网站

豆瓣电影TOP250的网址为:https://movie.douban.com/top250。我们需要获取其中的电影名称、电影链接、电影评分等信息。

打开浏览器的开发者工具,可以发现目标网站的数据请求链接为:https://movie.douban.com/top250?start=0&filter=,其中的`start`表示起始位置,每页有25条数据,共10页数据。我们需要遍历这10页数据,获取其中的电影信息。

2.爬取目标网站

首先,需要获取代理IP,这里使用的是免费代理网站,代码如下:

import requests
from bs4 import BeautifulSoup
import random

def get_proxy():
    url = 'https://www.zdaye.com/'
    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'}
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    trs = soup.find_all('tr')
    proxy_list = []
    for tr in trs[1:]:
        tds = tr.find_all('td')
        ip = tds[1].text
        port = tds[2].text
        proxy = 'http://{}:{}'.format(ip, port)
        proxy_list.append(proxy)
    return proxy_list

其中,`get_proxy()`函数用于获取代理IP,返回的是代理IP列表。

接下来,需要设置代理池,代码如下:

proxy_pool = get_proxy()

随机选择一个代理IP进行访问,代码如下:

proxy = random.choice(proxy_pool)

proxies = {
    'http': proxy,
    'https': proxy
}

然后,开始爬取目标网站,代码如下:

import requests
from bs4 import BeautifulSoup
import random

def get_proxy():
    url = 'https://www.zdaye.com/'
    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'}
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    trs = soup.find_all('tr')
    proxy_list = []
    for tr in trs[1:]:
        tds = tr.find_all('td')
        ip = tds[1].text
        port = tds[2].text
        proxy = 'http://{}:{}'.format(ip, port)
        proxy_list.append(proxy)
    return proxy_list

def get_movie_info(url, proxies):
    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'}
    response = requests.get(url, headers=headers, proxies=proxies)
    soup = BeautifulSoup(response.text, 'html.parser')
    items = soup.find_all('div', class_='info')
    movie_list = []
    for item in items:
        name = item.find('span', class_='title').text
        href = item.find('a')['href']
        rating = item.find('span', class_='rating_num').text
        movie_info = {
            'name': name,
            'href': href,

            'rating': rating
        }
        movie_list.append(movie_info)
    return movie_list

if __name__ == '__main__':
    proxy_pool = get_proxy()
    movie_list = []
    for i in range(10):
        url = 'https://movie.douban.com/top250?start={}&filter='.format(i*25)
        proxy = random.choice(proxy_pool)
        proxies = {
            'http': proxy,
            'https': proxy
        }
        movie_list += get_movie_info(url, proxies)
    print(movie_list)

在运行代码时,可能会出现代理IP不可用的情况,可以通过多次尝试或者定时更新代理IP来解决。

四、总结

本文介绍了如何使用代理IP来反反爬,并给出了相关的Python代码和案例。在实际爬取数据时,还需要注意以下几点:

  1. 避免频繁请求目标网站,尽量减少对目标网站的负担;
  2. 模拟真实请求,设置合理的User-Agent、Referer等请求头参数;
  3. 处理反爬机制,如验证码、JS渲染、动态IP等。

总之,反爬机制是爬虫开发中不可避免的挑战,需要不断学习技术、探索方法、思考策略,才能够更好地应对挑战并获取所需数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1031435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSL证书如何做到保障网站安全?

当网站显示不安全时,用户会在头脑中产生该网站是否合法的疑问,如果是购物网站或者购物商城,那意味着可能会损失大部分的用户。而SSL证书能有效保障网站的安全性,轻松解决网站不被用户信任的问题。那么,SSL证书究竟是如…

社交媒体商业禁令冲击:TikTok如何应对印尼政策变化?

随着社交媒体的普及和发展,各国政府开始越来越关注这一领域的监管和控制。印尼政府最近的决定,禁止在社交媒体上进行商品交易,引起了广泛的关注。 这一政策变化对TikTok等社交媒体平台带来了巨大的挑战,要求它们重新审视商业模式…

小米云原生文件存储平台化实践:支撑 AI 训练、大模型、容器平台多项业务

小米作为全球知名的科技巨头公司,已经在数百款产品中广泛应用了 AI 技术,这些产品包括手机、电视、智能音箱、儿童手表和翻译机等。这些 AI 应用主要都是通过小米的深度学习训练平台完成的。 在训练平台的存储方案中,小米曾尝试了多种不同的…

按照经纬度进行天气下载

https://power.larc.nasa.gov/data-access-viewer/ 点击data access viewer classic

数据工程中的单元测试完全指南

在数据工程领域中,经常被忽视的一项实践是单元测试。许多人可能认为单元测试仅仅是一种软件开发方法论,但事实远非如此。随着我们努力构建稳健、无错误的数据流水线和SQL数据模型,单元测试在数据工程中的价值变得越来越清晰。 本文带你深入探…

安卓桌面记事本便签软件哪个好用?

日常生活及工作中,很多人常常会遇到一些一闪而现的灵感,这时候拿出手机想要记录时,却找不到记录的软件。在这个快节奏的时代,安卓手机是我们日常生活不可或缺的伙伴。然而,正因为我们的生活如此忙碌,记事变…

从 Hackathon 战队到创业公司,和开发者们聊聊真实世界 AI Apps 的基础设施丨活动预告

在不久前结束的 TiDB Future App Hackath on 2023 上,来自全球 88 个国家的 1492 名参赛者们借助 AI 和 TiDB Serverless 的能力,构建了许多令人印象深刻的项目。 打造 Hackathon 的项目是一个从 0-1 的过程,真实世界中也涌现出了一批创业公…

Java 21正式发布了,来来来,一睹它的芳容!

Oracle 高兴地宣布 JDK 21 已经正式上线了。这是按照每六个月一次的发布计划,准时推出的第 12 个版本。这种定期的发布模式为开发者提供了稳定和可预见的创新,使得他们可以轻松地接纳和采用这些新特性。 Java 由于其出色的性能、稳定性和安全性使其持续成为全球最受欢迎的编程…

启山智软/微信小程序商城源码(微信小程序)

文章目录 启山智软一、小程序商城首页二、小程序商城分类三、小程序商城我的源码获取 启山智软 想要了解代码规范,学习商城解决方案,点击下方官网链接联系客服 作者:启山智软 官网及博客:启山智软官网、CSDN、掘金、gitee 简介&a…

爱分析《商业智能最佳实践案例》

近日,国内知名数字化市场研究咨询机构爱分析发布《2023爱分析商业智能最佳实践案例》,此评选活动面向落地商业智能的各行企业和商业智能厂商,以第三方专业视角深入调研,评选出具有参考价值的创新案例。永达汽车集团与数聚股份合作…

【Zabbix监控一】zabbix的原理与安装

利用一个优秀的监控软件,我们可以: ●通过一个友好的界面进行浏览整个网站所有的服务器状态 ●可以在 Web 前端方便的查看监控数据 ●可以回溯寻找事故发生时系统的问题和报警情况 总结:zabbix主要功能 监控,cpu负载,内存使用&a…

了解:组件和组件的值的分享

<template><Block title"热门公司"><div slot"content" class"container"><CompanyList :company-list"currentPageCompany"></CompanyList><div class"pagination"><el-pagination…

【高级IO】第一讲(5种IO模型的介绍、select函数介绍、一个简单select服务器)

高级IO 1.五种IO模型介绍2.Select函数介绍 1.五种IO模型介绍 点击跳转: 5种I/O模型 2.Select函数介绍 点击跳转: 【Linux】——select详解

LeetCode 接雨水 双指针

原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题面&#xff1a; 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a…

2023华为杯研究生数学建模C题分析

完整的分析查看文末名片获取&#xff01; 问题一 在每个评审阶段&#xff0c;作品通常都是随机分发的&#xff0c;每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比性&#xff0c;不同专家评审的作品集合之间应有一些交集。但有的交集大了&#xff0c;则…

git 常用命令分享

git官网地址&#xff1a;https://git-scm.com/ 1.设置用户名 邮箱 设置用户名: git config --global user.name “name” 设置邮箱&#xff1a; git config --global user.email "email" 2.查看设置的信息 git config --list 以上设置的信息在用户目录下&#xff1…

Python —— pytest框架

1、认识pytest框架 1、搭建自动化框架的思路与流程 1、搭建自动化测试框架的思路和流程&#xff0c;任意测试手段流程都是一致的&#xff1a;手工测试、自动化测试、工具测试 手工测试&#xff1a;熟悉业务 —— 写用例 —— 执行用例并记录结果 —— 生成测试报告自动化测试…

DETR纯代码分享(八)position_encoding.py(models)

一、导入一些Python库和模块 import math import torch from torch import nnfrom util.misc import NestedTensor 上面的代码段主要是Python代码&#xff0c;用于导入一些Python库和模块&#xff0c;以下是对每行代码的详细解释&#xff1a; import math: 这一行代码导入了P…

Node.js VS Python:程序员该选择哪个作为爬虫语言?

对于程序员来说&#xff0c;选择合适的语言作为爬虫开发工具很重要。在这篇文章中&#xff0c;我们将探讨使用Node.js和Python进行爬虫开发的优势和劣势&#xff0c;帮助你做出明智的选择&#xff0c;并提供一些实际操作价值的建议。 一、Node.js的优势与劣势 1、优势&#xf…

《Playing repeated games with Large Language Models》全文翻译

《Playing repeated games with Large Language Models》- 使用大型语言模型玩重复游戏 论文信息摘要1. 介绍2. 相关工作3. 一般方法4. 分析不同游戏系列的行为5. 囚徒困境5.1 性别之战 6. 讨论 论文信息 题目&#xff1a;《Playing repeated games with Large Language Model…