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

目录

前言

一、什么是代理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 requestsproxies = {'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 requestsproxies = {'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 randomdef 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].textport = tds[2].textproxy = '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 randomdef 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].textport = tds[2].textproxy = 'http://{}:{}'.format(ip, port)proxy_list.append(proxy)return proxy_listdef 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').texthref = item.find('a')['href']rating = item.find('span', class_='rating_num').textmovie_info = {'name': name,'href': href,'rating': rating}movie_list.append(movie_info)return movie_listif __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.hqwc.cn/news/115021.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++真的是 C加加

📝个人主页:夏目浅石. 📌博客专栏:C的故事 🏠学习社区:夏目友人帐. 文章目录 前言Ⅰ. 函数重载0x00 重载规则0x01 函数重载的原理名字修饰 Ⅱ. 引用0x00 引用的概念0x01 引用和指针区分0x03 引用的本质0x04…

数据结构-----串(String)详解

目录 前言 1.串的定义 相关类型 2.串的储存结构 顺序储存表示 堆分配储存表示 块链储存表示 3.串的操作方式 4.串的匹配算法 (1)BF算法 过程原理 代码实现(C/C) 算法分析 (2)KMP算法 过程…

2023-09-18 LeetCode每日一题(打家劫舍 III)

2023-09-18每日一题 一、题目编号 337. 打家劫舍 III二、题目链接 点击跳转到题目位置 三、题目描述 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦…

RS485以及MODBUS学习

学习目的: 1、什么是485? 2、485如何通信? 3、如何使用熟能生巧? RS485是一种四总线通信,分别是VCC、GND、485_A、485_B。两根负责通信,两根负责进行供电。 RS485通信 硬件层:解决的是数据传输问…

01Redis的安装和开机自启的配置

安装Redis 单机安装Redis 大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包(此处选择的Linux版本的CentOS 7) Windows版直接下载对应版本的.zip压缩包解压即可使用 第一步: Redis是基于C语言编写的,因此首先需要…

ez_pz_hackover_2016

ez_pz_hackover_2016 Arch: i386-32-little RELRO: Full RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位,保护全关 int chall() {size_t v0; // eaxint result; // eaxchar s[1024]…

Elastic Stack 8.10:更简单的跨集群搜索和身份验证等等

作者:Tyler Perkins, Gilad Gal, Shani Sagiv, George Kobar, Michael Peterson, Aris Papadopoulos Elastic Stack 8.10 增强了跨集群和向量搜索、数据摄取、Kibana 和云注册。 配置远程搜索时获得更大的灵活性,并提供更多信息来分类问题,…

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

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

YashanDB荣获“鼎新杯”数字化转型应用奖项

近日,深算院YashanDB 团队与深燃集团联合共建的深圳燃气集团数据库国产化建设项目,荣获第二届“鼎新杯”数字化转型应用大赛信息技术应用创新赛道二等奖!此次获奖,彰显了崖山数据库系统YashanDB自主领先的国产数据库技术优势和优秀…

阿里云服务器经济型e实例租用价格和CPU性能测评

阿里云服务器ECS推出经济型e系列,经济型e实例是阿里云面向个人开发者、学生、小微企业,在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器,CPU采用Intel Xeon Platinum架构处理器,支持1:1、1:2、1:4多种处理…

安装gpu版本的paddle

安装gpu版本的paddle python -m pip install paddlepaddle-gpu2.3.2.post111 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html以上支持cuda11.1版本 其他需求可查阅文档在这里

python 串口发送图片给arduino

python 代码 import serial import threading import time from PIL import Image from PIL import ImageSequence## im.show()##print(img) ## ####img b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00…