使用爬虫在爬取一些大网站的时候,总会出现被反爬技术阻碍的情况,限制IP就是其中一种.

那么使用代理就是很好的解决方案.

作为一个穷的裤兜比脸干净的人(博主每天洗脸,不要怀疑这一点),花钱去买代理就不在考虑范围内了

那么,度娘就告诉我好几个提供免费IP代理的网站

本次爬取的是西刺代理,虽然西刺提供了接口,但是使用并不好用,经常无响应,接口不能用,就只能自己动手啦

第一步:先搞下来他的网页在说

import requestsresponse = requests.get("http://www.xicidaili.com/")
response.encoding = "utf-8"
if response.status_code == 200:# print(response.text)print("响应成功")
else:print("响应失败")

直接打印响应页面失败,测试以下响应状态,失败...

第一次上你就给我响应失败?

浏览器没问题,大致猜测了以下应该是python自带的UserAgent被识别了,改进一下

def rand_userAgent():#我自己用正则弄的一个UA池,大家也可以自己动手做一个UserAgentList = [{'User-Agent': 'Mozilla/5.0(Macintosh;U;IntelMacOSX10_6_8;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50'}, {'User-Agent': 'Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50'}, {'User-Agent': 'Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0;'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT6.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE6.0;WindowsNT5.1)'}, {'User-Agent': 'Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv:2.0.1)Gecko/20100101Firefox/4.0.1'}, {'User-Agent': 'Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1'}, {'User-Agent': 'Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;en)Presto/2.8.131Version/11.11'}, {'User-Agent': 'Opera/9.80(WindowsNT6.1;U;en)Presto/2.8.131Version/11.11'}, {'User-Agent': 'Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Maxthon2.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TencentTraveler4.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;TheWorld)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;Trident/4.0;SE2.XMetaSr1.0;SE2.XMetaSr1.0;.NETCLR2.0.50727;SE2.XMetaSr1.0)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;AvantBrowser)'}, {'User-Agent': 'Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1)'}]return random.choices(UserAgentList)[0]#向一个url发起请求,成功返回文本,不成功继续发起请求
def get_one_page(url):print("发起请求")userAgent = rand_userAgent()response = requests.get(url,headers=userAgent)response.encoding = "utf-8"if response.status_code == 200:# print(response.text)print("响应成功")return response.textelse:print("响应失败")#如果一直响应失败会超出递归最大层数,导致程序崩溃.#此处并不打算来解决这个问题,毕竟玩具代码,不影响实用return get_one_page(url)

封装两个函数,一个随机出UserAgent,另一个获取网页信息.

修改了UserAgent之后果然就没问题了,至此,网页就被我们搞下来了,IP就在我们手中拿着了,但是还有一堆杂质,我们需要清洗一下.

第二步:提取出IP,保存成json格式

首先我们先来看下html的格式,截取了两段,贴上来.

<tr class="odd"><td class="country"><img src="http://fs.xicidaili.com/images/flag/cn.png" alt="Cn" /></td><td>175.148.71.249</td><td>1133</td><td>辽宁葫芦岛</td><td class="country">高匿</td><td>HTTP</td><td>59天</td><td>2分钟前</td>
</tr><tr class=""><td class="country"><img src="http://fs.xicidaili.com/images/flag/cn.png" alt="Cn" /></td><td>180.118.240.155</td><td>808</td><td>江苏镇江</td><td class="country">高匿</td><td>HTTPS</td><td>467天</td><td>3分钟前</td></tr>

格式还是很清晰的,那么直接上数据匹配的大杀器-正则表达式

我们只需要IP,端口号,协议类型这三个元素,所以我们只提取这三个就可以了

str1 = '<td class="country"><img[\s\S]+?<td>'
#ip
str2 = '</td>[\s\S]*?<td>'
#端口号
str3 = '</td>[\s\S]*?<td>[\s\S]*?<td>'
#协议类型
str4 = '</td>'
regex = str1+"([\s\S]*?)"+str2+"([\s\S]*?)"+str3+"([\s\S]*?)"+str4
IP_List = re.findall(regex, 网页文本)

上下对照,写了个简单粗暴的正则表达式,

测试一下,IP果然被提取出来了.

至此,我们的代理IP都提取出来了.但是并不是所有的IP都可用,我们还需要测试一些

第三步:剔除不能使用的IP

使用每个IP对百度发起请求,返回响应码,不是200的全部删掉

不多说 ,直接贴代码

def ip_pool(IP_list):for i in IP_list:#如果IP不可用,从IP_list中删除if not test_ip(i[0],i[1]):print(i,"不可用")IP_list.remove(i)#返回筛选后的IP_listreturn IP_list#对每一个IP进行测试
def test_ip(ip,port):server = ip+":"+portproxies = {'http': 'http://' + server, 'https': 'https://' + server}try:r = requests.get('https://www.baidu.com/', proxies=proxies,timeout=1)if r.status_code == 200:return 1else:return 0except:return 0 

这样,我们的IP_list里边的IP都是可以用的了,我们在把它保存到数据库或写入一个文件就可以了

我是转换成json格式写入到一个文件中的,方法很简单,在这就不贴代码了

最后,附上源码地址:https://gitee.com/ldw295/crawl_free_agent_ip

如果对你有些作用,欢迎点赞,评论,看到后我会及时回复

自己动手爬取免费代理IP相关推荐

  1. 多线程爬取免费代理ip池 (给我爬)

    多线程爬取免费代理ip池 (给我爬) 文章目录 多线程爬取免费代理ip池 (给我爬) 安装的库 IP 隐藏 代理ip 多线程爬取 读入代理ip 写入代理ip 验证代理ip 解析网页得到代理ip 获取网 ...

  2. Python爬虫:爬取免费代理ip

    之前写的几个爬虫都只能爬取到少量的信息,这是由于一个ip频繁地访问网站,会被认定为非正常的爬虫从而被屏蔽,这时候就需要使用代理ip来访问网站了,具体方法就是在发送request时添加一个proxy参数 ...

  3. 爬取免费代理IP并测试

    爬取免费代理IP并测试 写在开头:这次总共爬了三个代理ip的网站,前两个网站经过测试,ip并不能访问我真正想爬的网站 Git仓库:https://gitee.com/jiangtongxueya/my ...

  4. golang爬取免费代理IP

    golang爬取免费的代理IP,并验证代理IP是否可用 这里选择爬取西刺的免费代理Ip,并且只爬取了一页,爬取的时候不设置useAgent西刺不会给你数据,西刺也做反爬虫处理了,所以小心你的IP被封掉 ...

  5. 简易爬取免费代理IP

    爬取maitian屡次被封,先建立一个免费代理ip池吧 暂时保存为txt格式 思路: 1.找到免费的ip代理网站 以西刺代理的4个网站为例: 国内普通代理: http://www.xicidaili. ...

  6. 爬取免费代理IP代码

    以下代码会抓取西刺代理网站的代理ip: 1.抓取西刺代理网站的代理ip 2.并根据指定的目标url,对抓取到ip的有效性进行验证 3.在和此代码同级文件夹下创建ip.txt文件,将有效的IP存入 # ...

  7. scrapy爬取免费代理IP存储到数据库构建自有IP池

    以抓取西刺代理网站的高匿IP并存储到mysql数据库为例 西刺网:http://www.xicidaili.com/nn/ 运行环境:scrapy1.0.3 python2.7.10 需要安装MySQ ...

  8. 简单爬虫-爬取免费代理ip

    环境:python3.6 主要用到模块:requests,PyQuery 代码比较简单,不做过多解释了 #!usr/bin/python # -*- coding: utf-8 -*- import ...

  9. Python爬虫实战013:Python爬取免费代理ip

    import requests import time import random from lxml import etree from fake_useragent import UserAgen ...

最新文章

  1. 联想一体计算机排行,2019最具性价比一体机推荐 电脑一体机十大最新排名
  2. 数据科学之基石:数据科学家必须掌握的10个统计学概念
  3. 服务化改造实践 | 如何在 Dubbo 中支持 REST 1
  4. PAT1001 A+B Format (20 分)
  5. mysql查询正在执行的存储过程,[转]ms sql server 存储过程,查看正在执行的sql语句...
  6. Quartz 第六课 CronTrigger(官方文档翻译)
  7. 各种封装——封装getClass
  8. c++ PP第十一章最后一题
  9. linux ping mtu值,ping 包长度及 MTU
  10. 批处理Bat教程-第一章:前言
  11. Spring教程动画文字版
  12. java毕业生设计web人力资源管理系统计算机源码+系统+mysql+调试部署+lw
  13. 无线网络dns服务器是多少,中国移动宽带dns是多少?
  14. oracle database link
  15. AutoCAD中禁用shift+鼠标中键组合作为动态观察的功能
  16. 百度云下载文件方法:PC 和 群晖 Docker
  17. 华为ME909 4G LTE模块在树莓派+Ubuntu Mate平台的联网演示
  18. 复习总结:马克思主义基本原理概论(马原)
  19. NDK开发(四):仿QQ变声
  20. 20190211 模拟训练 A. 大猫咪

热门文章

  1. pvid与vid详解
  2. 驾校学车VIP班和普通班区别是什么?
  3. Mysql8创建用户以及赋权操作
  4. 赋能 打造应对不确定性的敏捷团队 pdf_赋能——打造应对不确定的敏捷团队|《赋能》斯坦利...
  5. JD 1421:Abor(概率统计)
  6. k8s 市场现状闲聊
  7. UE4 Material_01:堡垒之夜砍伐树木效果
  8. 中荷联手打造国际地理信息产业联盟
  9. 电脑翻译软件-在线电脑实时翻译软件
  10. vue v-for 中 img图片渲染不出来的解决方法