利用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网络编程之文件下载实例分析
May 20 Python
python实现比较两段文本不同之处的方法
May 30 Python
通过Python使用saltstack生成服务器资产清单
Mar 01 Python
Python竟能画这么漂亮的花,帅呆了(代码分享)
Nov 15 Python
Python3学习urllib的使用方法示例
Nov 29 Python
Python分支结构(switch)操作简介
Jan 17 Python
python通过伪装头部数据抵抗反爬虫的实例
May 07 Python
详解PyTorch中Tensor的高阶操作
Aug 18 Python
Python爬取豆瓣视频信息代码实例
Nov 16 Python
python cv2截取不规则区域图片实例
Dec 21 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
Selenium环境变量配置(火狐浏览器)及验证实现
Dec 07 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中将数组转成字符串并保存到数据库中的函数代码
2013/09/29 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
php中青蛙跳台阶的问题解决方法
2018/10/14 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
2019/06/25 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
js 页面执行时间计算代码
2009/03/04 Javascript
ANGULARJS中用NG-BIND指令实现单向绑定的例子
2014/12/08 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
JavaScript 性能优化小结
2015/10/12 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
浅析Javascript匿名函数与自执行函数
2016/02/06 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
Nodejs如何搭建Web服务器
2016/03/28 NodeJs
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
Angular实现搜索框及价格上下限功能
2018/01/19 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
JavaScript位置参数实现原理及过程解析
2020/09/14 Javascript
python中的五种异常处理机制介绍
2014/09/02 Python
详解Django之auth模块(用户认证)
2018/04/17 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
AE美国鹰日本官方网站: American Eagle Outfitters
2016/12/10 全球购物
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
如何转换一个字符串到enum值
2014/04/12 面试题
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
2014/09/29 面试题
EJB与JAVA BEAN的区别
2016/08/29 面试题
高级销售员求职信
2013/10/25 职场文书
生物科学专业个人求职信范文
2013/12/05 职场文书
计算机个人求职信范例
2014/01/24 职场文书
找规律教学反思
2016/02/23 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
SpringCloud Function SpEL注入漏洞分析及环境搭建
2022/04/08 Java/Android