利用python爬取软考试题之ip自动代理


Posted in Python onMarch 28, 2017

前言

最近有个软件专业等级考试,以下简称软考,为了更好的复习备考,我打算抓取www.rkpass.cn网上的软考试题。

首先讲述一下我爬取软考试题的故(keng)事(shi)。现在我已经能自动抓取某一个模块的所有题目了,如下图:

利用python爬取软考试题之ip自动代理

目前可以将信息系统监理师的30条试题记录全部抓取下来,结果如下图所示:

利用python爬取软考试题之ip自动代理

抓取下来的内容图片:

利用python爬取软考试题之ip自动代理

虽然可以将部分信息抓取下来,但是代码的质量并不高,以抓取信息系统监理师为例,因为目标明确,各项参数清晰,为了追求能在短时间内抓取到试卷信息,所以并没有做异常处理,昨天晚上填了很久的坑。

回到主题,今天写这篇博客,是因为又遇到新坑了。从文中标题我们可以猜出个大概,肯定是请求次数过多,所以ip被网站的反爬虫机制给封了。

利用python爬取软考试题之ip自动代理

活人不能让尿憋死,革命先辈的事迹告诉我们,作为社会主义的接班人,我们不能屈服于困难,逢山开路,遇水搭桥,为了解决ip问题,ip代理这个思路就出来了。

在网络爬虫抓取信息的过程中,如果抓取频率高过了网站的设置阀值,将会被禁止访问。通常,网站的反爬虫机制都是依据IP来标识爬虫的。

于是在爬虫的开发者通常需要采取两种手段来解决这个问题:

1、放慢抓取速度,减小对于目标网站造成的压力。但是这样会减少单位时间类的抓取量。

2、第二种方法是通过设置代理IP等手段,突破反爬虫机制继续高频率抓取。但是这样需要多个稳定的代理IP。

话不多书,直接上代码:

# IP地址取自国内?匿代理IP网站:http://www.xicidaili.com/nn/
# 仅仅爬取首页IP地址就足够一般使用

from bs4 import BeautifulSoup
import requests
import random

#获取当前页面上的ip
def get_ip_list(url, headers):
 web_data = requests.get(url, headers=headers)
 soup = BeautifulSoup(web_data.text)
 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

#从抓取到的Ip中随机获取一个ip
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

#国内高匿代理IP网主地址
url = 'http://www.xicidaili.com/nn/'
#请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}
#计数器,根据计数器来循环抓取所有页面的ip
num = 0
#创建一个数组,将捕捉到的ip存放到数组
ip_array = []
while num < 1537:
 num += 1
 ip_list = get_ip_list(url+str(num), headers=headers)
 ip_array.append(ip_list)
for ip in ip_array:
 print(ip)
#创建随机数,随机取到一个ip
# proxies = get_random_ip(ip_list)
# print(proxies)

运行结果截图:

利用python爬取软考试题之ip自动代理

这样,在爬虫请求的时候,把请求ip设置为自动ip,就能有效的躲过反爬虫机制中简单的封锁固定ip这个手段。

-------------------------------------------------------------------------------------------------------------------------------------

为了网站的稳定,爬虫的速度大家还是控制下,毕竟站长也都不容易。本文测试只抓取了17页ip。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python海龟绘图实例教程
Jul 24 Python
Python访问纯真IP数据库脚本分享
Jun 29 Python
浅谈python中截取字符函数strip,lstrip,rstrip
Jul 17 Python
在Django中输出matplotlib生成的图片方法
May 24 Python
基于YUV 数据格式详解及python实现方式
Dec 09 Python
Win10里python3创建虚拟环境的步骤
Jan 31 Python
Python实现病毒仿真器的方法示例(附demo)
Feb 19 Python
python实现IOU计算案例
Apr 12 Python
使用keras内置的模型进行图片预测实例
Jun 17 Python
Python加速程序运行的方法
Jul 29 Python
详解Django ORM引发的数据库N+1性能问题
Oct 12 Python
Python文件操作及内置函数flush原理解析
Oct 13 Python
详解python调度框架APScheduler使用
Mar 28 #Python
Python中is与==判断的区别
Mar 28 #Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 #Python
Python利用Beautiful Soup模块修改内容方法示例
Mar 27 #Python
python递归查询菜单并转换成json实例
Mar 27 #Python
Python中的命令行参数解析工具之docopt详解
Mar 27 #Python
Python使用PDFMiner解析PDF代码实例
Mar 27 #Python
You might like
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
2016/08/01 PHP
php版微信自动获取收货地址api用法示例
2016/09/22 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
jQuery移动和复制dom节点实用DOM操作案例
2012/12/17 Javascript
js显示时间 js显示最后修改时间
2013/01/02 Javascript
实测jquery data()如何存值
2013/08/18 Javascript
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
学习javascript的闭包,原型,和匿名函数之旅
2015/10/18 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
详解JS中Array对象扩展与String对象扩展
2016/01/07 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
vue-cli项目无法用本机IP访问的解决方法
2018/09/20 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
JS随机密码生成算法
2019/09/23 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
详解node.js 事件循环
2020/07/22 Javascript
常用python数据类型转换函数总结
2014/03/11 Python
Python的装饰器用法学习笔记
2016/06/24 Python
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
Python中实现变量赋值传递时的引用和拷贝方法
2018/04/29 Python
Django压缩静态文件的实现方法详析
2018/08/26 Python
python发送告警邮件脚本
2018/09/17 Python
python字典一键多值实例代码分享
2019/06/14 Python
在Qt中正确的设置窗体的背景图片的几种方法总结
2019/06/19 Python
Python 实现Numpy中找出array中最大值所对应的行和列
2019/11/26 Python
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
新闻发布会主持词
2014/03/28 职场文书
宾馆前台接待岗位职责
2015/04/02 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
2016大一新生军训感言
2015/12/08 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
Spring Bean是如何初始化的详解
2022/03/22 Java/Android