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 相关文章推荐
C#返回当前系统所有可用驱动器符号的方法
Apr 18 Python
python获取从命令行输入数字的方法
Apr 29 Python
python访问类中docstring注释的实现方法
May 04 Python
深入解析Python中的上下文管理器
Jun 28 Python
Python极简代码实现杨辉三角示例代码
Nov 15 Python
python 中split 和 strip的实例详解
Jul 12 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
Jul 17 Python
浅谈django orm 优化
Aug 18 Python
Python字符串格式化输出代码实例
Nov 22 Python
Pandas时间序列基础详解(转换,索引,切片)
Feb 26 Python
pandas数据拼接的实现示例
Apr 16 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
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
2019/07/18 PHP
一些mootools的学习资源
2010/02/07 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
javascript实现TreeView 无刷新展开的实例代码
2013/07/13 Javascript
jQuery查询数据返回object和字符串影响原因是什么
2013/08/09 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
2014/10/17 Javascript
深入解析JavaScript中的数字对象与字符串对象
2015/10/21 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
vue axios数据请求及vue中使用axios的方法
2018/09/10 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
微信小程序公用参数与公用方法用法示例
2019/01/09 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
微信小程序swiper禁止用户手动滑动代码实例
2019/08/23 Javascript
vue实现计步器功能
2019/11/01 Javascript
vue 实现路由跳转时更改页面title
2019/11/05 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
python实现媒体播放器功能
2018/02/11 Python
python儿童学游戏编程知识点总结
2019/06/03 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
2019/07/25 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
python shutil文件操作工具使用实例分析
2019/12/25 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
什么是表空间(tablespace)和系统表空间(System tablespace)
2013/02/25 面试题
生产部管理制度
2014/01/31 职场文书
行政工作个人的自我评价
2014/02/13 职场文书
初中政治教学工作总结
2015/08/13 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
浅谈python中的多态
2021/06/15 Python
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL
python lambda 表达式形式分析
2022/04/03 Python
Docker容器harbor私有仓库部署和管理
2022/08/05 Servers