Python爬虫常用小技巧之设置代理IP


Posted in Python onSeptember 13, 2018

设置代理IP的原因

我们在使用Python爬虫爬取一个网站时,通常会频繁访问该网站。假如一个网站它会检测某一段时间某个IP的访问次数,如果访问次数过多,它会禁止你的访问。所以你可以设置一些代理服务器来帮助你做工作,每隔一段时间换一个代理,这样便不会出现因为频繁访问而导致禁止访问的现象。

我们在学习Python爬虫的时候,也经常会遇见所要爬取的网站采取了反爬取技术导致爬取失败。高强度、高效率地爬取网页信息常常会给网站服务器带来巨大压力,所以同一个IP反复爬取同一个网页,就很可能被封,所以下面这篇文章讲述一个爬虫技巧,设置代理IP

这里介绍一下免费获取代理IP的方法,这个方法的优点就是免费,但是缺点就是爬取后存在很多不能用的

IP地址取自国内?匿代理IP网站,西刺代理,我们爬取首页IP地址就足够一般使用,或者你也可以爬取第一页,第二页…的

配置环境

  • 安装requests库
  • 安装bs4库
  • 安装lxml库

具体代码

话不多说直接上代码吧

from bs4 import BeautifulSoup
import requests
import random

def get_ip_list(url, headers):
 web_data = requests.get(url, headers=headers)
 soup = BeautifulSoup(web_data.text, 'lxml')
 ips = soup.find_all('tr')
 ip_list = []
 for i in range(1, len(ips)):
  ip_info = ips[i]
  tds = ip_info.find_all('td')
  ip_list.append(tds[1].text + ':' + tds[2].text)
 return ip_list

def get_random_ip(ip_list):
 proxy_list = []
 for ip in ip_list:
  proxy_list.append('http://' + ip)
 proxy_ip = random.choice(proxy_list)
 proxies = {'http': proxy_ip}
 return proxies

if __name__ == '__main__':
 url = 'http://www.xicidaili.com/nn/'
 headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.60 Safari/537.17'
 }
 ip_list = get_ip_list(url, headers=headers)
 proxies = get_random_ip(ip_list)
 print(proxies)

函数get_ip_list(url, headers)传入url和headers,最后返回一个IP列表,列表的元素类似122.114.31.177:808格式,这个列表包括国内?匿代理IP网站首页所有IP地址和端口

函数get_random_ip(ip_list)传入第一个函数得到的列表,返回一个随机的proxies,这个proxies可以传入到requests的get方法中,这样就可以做到每次运行都使用不同的IP访问被爬取的网站,有效地避免了真实IP被封的风险

proxies的格式是一个字典: {‘http': ‘http://122.114.31.177:808‘} ,可以将下面的执行也封装为方法

对于抓取IP这个,西刺代理的服务器做了反爬处理,如果你频繁去抓取的话,服务器会主动返回503错误,提示block,所以在请求的时候可以先一次请求完保存一个文件,来读取这个文件,或者爬取一个ip使用几分钟后,再去爬取一次,相当于加一个定时功能

代理IP的使用

运行上面的代码会得到一个随机的proxies,把它直接传入requests的get方法中即可

res = requests.get(url, headers=headers, proxies=proxies)

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
Dec 25 Python
pyqt5简介及安装方法介绍
Jan 31 Python
Go/Python/Erlang编程语言对比分析及示例代码
Apr 23 Python
10 行Python 代码实现 AI 目标检测技术【推荐】
Jun 14 Python
在python里面运用多继承方法详解
Jul 01 Python
python3实现的zip格式压缩文件夹操作示例
Aug 17 Python
Pycharm中Python环境配置常见问题解析
Jan 16 Python
Python基础类继承重写实现原理解析
Apr 03 Python
Python利用for循环打印星号三角形的案例
Apr 12 Python
python+requests接口自动化框架的实现
Aug 31 Python
python使用pygame创建精灵Sprite
Apr 06 Python
python基础之停用词过滤详解
Apr 21 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 #Python
python中dict字典的查询键值对 遍历 排序 创建 访问 更新 删除基础操作方法
Sep 13 #Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 #Python
python单例模式获取IP代理的方法详解
Sep 13 #Python
如何利用python制作时间戳转换工具详解
Sep 12 #Python
Python get获取页面cookie代码实例
Sep 12 #Python
python读取和保存图片5种方法对比
Sep 12 #Python
You might like
php中调用其他系统http接口的方法说明
2014/02/28 PHP
PHP ob缓存以及ob函数原理实例解析
2020/11/13 PHP
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
快速解决jquery之get缓存问题的最简单方法介绍
2013/12/19 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
angularjs学习笔记之双向数据绑定
2015/09/26 Javascript
Bootstrap安装环境配置教程分享
2016/05/27 Javascript
AngularJS实现分页显示数据库信息
2016/07/01 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
官方推荐react-navigation的具体使用详解
2018/05/08 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
python直接访问私有属性的简单方法
2016/07/25 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
Python Process多进程实现过程
2019/10/22 Python
CSS3实现跳动的动画效果
2016/09/12 HTML / CSS
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
澳大利亚先进的皮肤和激光诊所购物网站:Soho Skincare
2018/10/15 全球购物
远程学习的教学用品和家庭学习资源:Really Good Stuff
2020/04/27 全球购物
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
暑假实习求职信范文
2013/09/22 职场文书
外语专业毕业生个人的自荐信
2013/11/19 职场文书
档案接收函
2014/01/13 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
Python Matplotlib库实现画局部图
2021/11/17 Python
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android