Python零基础入门二十三之使用正则表达式抓取代理ip
2017-01-20 14:24
323 查看
上一篇博客中主要是介绍了使用字符串的find函数匹配字符串,使用字符串的find函数匹配比较简单的网页中的字符串还可以,但是像是ip地址这样比较复杂的字符串却很麻烦,这时,正则表达式便派上了用场。正则表达式就是用来描述复杂的规则的。
由于这系列的博客还只是为了学习爬虫,所以用到什么正则表达式的知识便学习什么知识,对于正则表达式的学习也只能是断断续续。下面直接上干货。
正则表达式通过Python中的re模块来实现,我们首先学习re模块中的search方法。
search()方法用于在字符串中搜索正则表达式模式第一次出现的位置,为了避免不必要的麻烦,我们在要匹配的字符或者字符串之前加上r。
正则表达式的通配符:英文的点号. 可以匹配任何字符
如果要匹配. ,我们可以使用转义的方法,即在.前面加上\
\d 匹配任何一个数字
表示字符串的范围: 字符类[] 匹配字符类中任意一个字符都算匹配
字符类中的元素之间没有多余的符号,因为这是匹配
正则表达式默认开启大小写敏感模式
一是关闭大小写敏感模式
二是是全写上
字符类中的’-‘表示范围[a-z]:表示a到z26个小写的英文字母
匹配次数的问题{} 来解决 {}中的数字表示重复的次数
只是重复的{前面的一个字符
括号中的数字表示总共出现的次数
匹配次数的范围{n,m} 重复n~m次都可以
{n,m}是一个闭区间
给出上述知识点的测试样例:
在具备了上述的知识之后,我们差不多就可以写出ip地址的正则表达式了,但是我们还面临着一个困难:如何用正则表达式匹配0~255的数字?我们需要明白的是正则表达式匹配的是字符串,并没有进制之分,也就是说能匹配的数字就是0-9,这就需要我们分情况来进行讨论:
首数字是0或者1时,剩下两位可以是任意字符
首数字是2时,第二位是0-4之间时,最后一位可以是任意字符
首数字是5时,第二位是5时,第三位只能是0-5之间
经过这样限制之后,我们便可以使用正则表达式来匹配一个ip地址了
在有了上述的准备之后,我们就可以从快代理这个网站来爬取实时更新的代理ip了。有了之前的抓取妹子图的练习之后,这个代码写起来就简单了一点。
这样我们变可以把ip地址给抓取下来了:
这样一个简单的抓取代理ip的Python小程序便完成了。这个小程序还有待完善,后期会对此程序进行完善。
由于这系列的博客还只是为了学习爬虫,所以用到什么正则表达式的知识便学习什么知识,对于正则表达式的学习也只能是断断续续。下面直接上干货。
正则表达式通过Python中的re模块来实现,我们首先学习re模块中的search方法。
search()方法用于在字符串中搜索正则表达式模式第一次出现的位置,为了避免不必要的麻烦,我们在要匹配的字符或者字符串之前加上r。
正则表达式的通配符:英文的点号. 可以匹配任何字符
如果要匹配. ,我们可以使用转义的方法,即在.前面加上\
\d 匹配任何一个数字
表示字符串的范围: 字符类[] 匹配字符类中任意一个字符都算匹配
字符类中的元素之间没有多余的符号,因为这是匹配
正则表达式默认开启大小写敏感模式
一是关闭大小写敏感模式
二是是全写上
字符类中的’-‘表示范围[a-z]:表示a到z26个小写的英文字母
匹配次数的问题{} 来解决 {}中的数字表示重复的次数
只是重复的{前面的一个字符
括号中的数字表示总共出现的次数
匹配次数的范围{n,m} 重复n~m次都可以
{n,m}是一个闭区间
给出上述知识点的测试样例:
import re print(re.search(r'FishC','I love FishC.com!')) print(re.search(r'.','I love FishC.com!')) print(re.search(r'\.','I love FishC.com!')) print(re.search(r'\d','I love 123FishC.com!')) print(re.search(r'\d\d\d','I love 123FishC.com!')) print(re.search(r'\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d','192.111.123.233')) print(re.search(r'\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d','1.111.123.233')) print(re.search(r'[aeiou]','I love FishC.com')) print(re.search(r'[a-z]','I love FishC.com')) print(re.search(r'ab{3}c','abbbc')) print(re.search(r'ab{3,5}','abbbbbc'))
在具备了上述的知识之后,我们差不多就可以写出ip地址的正则表达式了,但是我们还面临着一个困难:如何用正则表达式匹配0~255的数字?我们需要明白的是正则表达式匹配的是字符串,并没有进制之分,也就是说能匹配的数字就是0-9,这就需要我们分情况来进行讨论:
首数字是0或者1时,剩下两位可以是任意字符
首数字是2时,第二位是0-4之间时,最后一位可以是任意字符
首数字是5时,第二位是5时,第三位只能是0-5之间
经过这样限制之后,我们便可以使用正则表达式来匹配一个ip地址了
print(re.search(r'(([01]{0,1}[0-9]{0,1}[0-9]|[2][0-4][0-9]|[2][5][0-4])\.){3}([2][0-4][0-9]|[01]{0,1}[0-9]{0,1}[0-9]|[2][5][0-4]','1.238.144.208')
在有了上述的准备之后,我们就可以从快代理这个网站来爬取实时更新的代理ip了。有了之前的抓取妹子图的练习之后,这个代码写起来就简单了一点。
import urllib.request import os import re url='http://www.kuaidaili.com/' req=urllib.request.Request(url) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36') response=urllib.request.urlopen(req) html=response.read().decode('utf-8') ip=re.search(r'(([01]{0,1}\d{0,1}\d|[2][0-4]\d|[2][5][0-5])\.){3}([2][0-4]\d|[01]{0,1}\d{0,1}\d|[2][5][0-5])',html) iplist=[] #提取界限 #这里只是提取ip地址 a=str(ip).find('match')+7 b=str(ip).find('>')-1 while True: if '' in iplist: iplist.remove('') break a=str(ip).find('match')+7 b=str(ip).find('>')-1 if str(ip)[a:b] not in iplist: iplist.append(str(ip)[a:b]) e=html.find(str(ip)[a:b]) ip=re.search(r'(([01]{0,1}\d{0,1}\d|[2][0-4]\d|[2][5][0-5])\.){3}([2][0-4]\d|[01]{0,1}\d{0,1}\d|[2][5][0-5])',html[e+15:]) print(iplist)
这样我们变可以把ip地址给抓取下来了:
这样一个简单的抓取代理ip的Python小程序便完成了。这个小程序还有待完善,后期会对此程序进行完善。
相关文章推荐
- Python 爬虫入门(二)—— IP代理使用 - 不剃头的一休哥 - 博客园
- Python零基础入门二十之爬虫之抓取有道词典
- Python爬虫抓取代理IP并检验可用性
- python代理ip抓取大众点评
- python3.6抓取代理ip
- python使用ip代理抓取网页
- Python基础爬虫之抓取可用的IP
- python动态抓取代理IP
- python网络爬虫实战——实时抓取西刺免费代理ip
- python3实现网络爬虫(7)-- 使用ip代理抓取网页
- Python 爬虫入门—— IP代理使用
- python爬虫入门(二)——爬取代理IP
- Python爬虫抓取代理IP并检验可用性的实例
- Python3.5抓取代理IP并验证有效性
- Python爬虫实战——代理IP全部抓取
- Python零基础入门二十二之抓取妹子图
- Python 爬虫入门(二)—— IP代理使用
- Python 爬虫入门(二)—— IP代理使用
- Python 抓取可用代理IP
- python 自动抓取代理ip