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中的Django框架中进行字符串翻译
Jul 27 Python
Python入门_浅谈数据结构的4种基本类型
May 16 Python
Python3使用正则表达式爬取内涵段子示例
Apr 22 Python
Python中交换两个元素的实现方法
Jun 29 Python
为什么Python中没有"a++"这种写法
Nov 27 Python
python 实现兔子生兔子示例
Nov 21 Python
python cv2在验证码识别中应用实例解析
Dec 25 Python
python 计算概率密度、累计分布、逆函数的例子
Feb 25 Python
django创建超级用户时指定添加其它字段方式
May 14 Python
Python logging日志模块 配置文件方式
Jul 12 Python
Python操作word文档插入图片和表格的实例演示
Oct 25 Python
python飞机大战游戏实例讲解
Dec 04 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
sony ICF-2010 拆解与改装
2021/03/02 无线电
php中转义mysql语句的实现代码
2011/06/24 PHP
php防止网站被刷新的方法汇总
2014/12/01 PHP
PHP实现简单数字分页效果
2015/07/26 PHP
php过滤所有的空白字符(空格、全角空格、换行等)
2015/10/27 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
php图片裁剪函数
2018/10/31 PHP
centos7上编译安装php7以php-fpm方式连接apache
2018/11/08 PHP
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
JavaScript高级程序设计 阅读笔记(七) ECMAScript中的语句
2012/02/27 Javascript
JS实现自动定时切换的简洁网页选项卡效果
2015/10/13 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
JS实现页面载入时随机显示图片效果
2016/09/07 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
Python实现各种排序算法的代码示例总结
2015/12/11 Python
python ansible服务及剧本编写
2017/12/29 Python
python模拟菜刀反弹shell绕过限制【推荐】
2019/06/25 Python
python在新的图片窗口显示图片(图像)的方法
2019/07/11 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
jupyter 添加不同内核的操作
2021/02/06 Python
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
柯基袜:Corgi Socks
2017/01/26 全球购物
电子商务专业个人的自我评价分享
2013/10/29 职场文书
暑期培训随笔感言
2014/03/10 职场文书
开学典礼主持词
2014/03/19 职场文书
团代会主持词
2014/04/02 职场文书
城市创卫标语
2014/06/17 职场文书
校园新闻稿范文
2015/07/18 职场文书
小学班主任教育随笔
2015/08/15 职场文书
MySQL如何解决幻读问题
2021/08/07 MySQL