利用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 参数列表中的self 显式不等于冗余
Dec 01 Python
python字符串连接的N种方式总结
Sep 17 Python
python字符串替换的2种方法
Nov 30 Python
用Python实现web端用户登录和注册功能的教程
Apr 30 Python
Python的mysql数据库的更新如何实现
Jul 31 Python
python logging日志模块的详解
Oct 29 Python
python调用系统ffmpeg实现视频截图、http发送
Mar 06 Python
python pandas dataframe 按列或者按行合并的方法
Apr 12 Python
Python实现的凯撒密码算法示例
Apr 12 Python
Django给admin添加Action的步骤详解
May 01 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 Python
Python collections中的双向队列deque简单介绍详解
Nov 04 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
php中session_unset与session_destroy的区别分析
2011/06/16 PHP
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
php实现自定义中奖项数和概率的抽奖函数示例
2017/05/26 PHP
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
jQuery动画与特效详解
2015/02/01 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
2015/03/24 Javascript
js+html5绘制图片到canvas的方法
2015/06/05 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
详解基于javascript实现的苹果系统底部菜单
2016/12/02 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
如何理解jQuery中的ajaxSubmit方法
2017/03/13 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
基于JavaScript的数据结构队列动画实现示例解析
2020/08/06 Javascript
vue实现点击出现操作弹出框的示例
2020/11/05 Javascript
Vue实现boradcast和dispatch的示例
2020/11/13 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[58:46]OG vs NAVI 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
Python中import机制详解
2017/11/14 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
python主线程捕获子线程的方法
2018/06/17 Python
python文件选择对话框的操作方法
2019/06/27 Python
Python 元组操作总结
2019/09/18 Python
python3.7通过thrift操作hbase的示例代码
2020/01/14 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
给老婆的搞笑检讨书
2014/01/12 职场文书
2014年房地产销售工作总结
2014/12/01 职场文书
教师节作文之小学四年级
2019/09/03 职场文书