bravsheng 发表于 2021-8-25 18:29:19

爬取代理IP,发现正则表达式的结果不准确?

本帖最后由 bravsheng 于 2021-8-25 18:31 编辑

大家好,刚学完第57课,小甲鱼讲了IP地址的正则匹配,于是自己动手试着写了一个爬取代理IP的程序。
运行结果:ip地址和端口号都对应找到了!^_^
发现问题:但仔细一看,有部分IP的第四段数字只匹配到了百位和十位,这是什么原因呢?
一时半会没想出来@_@?   求鱼油解惑!
>>> p1.search('237.237.237.237')
<re.Match object; span=(0, 14), match='237.237.237.23'>

代码如下:
import urllib.request
import re
from bs4 import BeautifulSoup
index = 0
url = 'https://www.89ip.cn/index_1.html'
response = urllib.request.urlopen(url)
html = response.read()

soup = BeautifulSoup(html,"html.parser")

p1 = re.compile(r'(({0,1}\d{0,1}\d|2\d|25)\.){3}({0,1}\d{0,1}\d|2\d|25)')
p2 = re.compile(r'(\d){2,5}')
for each in soup.find_all('td'):
    index += 1
    each_ip = str(each)
    m1 = p1.search(each_ip)
    if m1:
      each_port = str(soup.find_all('td'))
      m2 = p2.search(each_port)
      print(m1.group() + ':' + m2.group())

运行结果:
60.7.97.130:9999
60.217.64.23:38829#这里应该是60.217.64.237
60.5.172.20:9999
61.131.45.24:9999
61.131.45.66:9999
202.109.157.62:9000
59.55.162.135:3256
60.185.205.20:3000
27.38.95.21:8118
60.167.135.8:1133
59.55.162.169:3256
27.192.168.131:9000
61.161.27.114:9999
60.168.80.102:1133
58.255.6.139:9999
60.167.134.95:1133
60.168.207.22:1133
59.55.164.23:3256
27.214.48.153:9000
49.81.233.141:8888

白two 发表于 2021-8-25 20:00:37

python 是从左往右判断的,而 search 只要匹配到到字符就会结束
你最后一个
({0,1}\d{0,1}\d|2\d|25)
中的第一段
{0,1}\d{0,1}\d
就能任意匹配了,你看以下下代码:
import re

a = re.search("12","12345")
print(a.group())

p1 = re.compile('({0,1}\d{0,1}\d|2\d|25)')
p2 = re.compile('({0,1}\d{0,1}\d|2\d|25):')
b = p1.search("237:")
c = p2.search("237:")
print(b.group())
print(c.group())

运行结果:
12
23
237:

这是search的性质决定的,不管有没有匹配完,只要匹配到结果就不会继续匹配了,你把 : 号一起匹配进去就行了

bravsheng 发表于 2021-8-26 09:07:38

白two 发表于 2021-8-25 20:00
python 是从左往右判断的,而 search 只要匹配到到字符就会结束
你最后一个



噢,谢谢解答! 原来如此,我懂了!
0~255的范围用或隔开了(0~199|200~249|250~255),只要找到了一个就算找了。
所以找到23也是符合范围的,search就停止查找了。

bravsheng 发表于 2021-8-26 09:11:25

哈哈,我加了个缩进,匹配成功了!
import urllib.request
import re
from bs4 import BeautifulSoup
index = 0
url = 'https://www.89ip.cn/index_1.html'
response = urllib.request.urlopen(url)
html = response.read()

soup = BeautifulSoup(html,"html.parser")

p1 = re.compile(r'(({0,1}\d{0,1}\d|2\d|25)\.){3}({0,1}\d{0,1}\d|2\d|25)\t')
p2 = re.compile(r'(\d){2,5}')
for each in soup.find_all('td'):
    index += 1
    each_ip = str(each)
    m1 = p1.search(each_ip)
    if m1:
      each_port = str(soup.find_all('td'))
      m2 = p2.search(each_port)
      print(m1.group() + m2.group())

llf1976 发表于 2021-9-5 22:57:46

p1 = re.compile(r'(({0,1}\d{0,1}\d|2\d|25)\.){3}(2\d|25|{0,1}\d{0,1}\d)'),第四位数匹配时,调整一下 “ | ” 顺序就可以找到200以上的数。
页: [1]
查看完整版本: 爬取代理IP,发现正则表达式的结果不准确?