您的位置:首页 > 编程语言 > Python开发

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}是一个闭区间

给出上述知识点的测试样例:

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