我想从这个链接中提取IP地址和端口号。下面是我的Python代码:http://spys.one/free-proxy-list/FR/
import urllib.request
import re
url = 'http://spys.one/free-proxy-list/FR/'
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})
html = urllib.request.urlopen(req).read().decode('utf-8')
ip = re.findall( r'[0-9]+(?:\.[0-9]+){3}',html )
# ip = re.findall( r'[0-9]+(?:\.[0-9]+){3}:[0-9]+[0-9]',html) # This is also not working
print (ip)产量- - '37.59.0.139','212.47.239.185','85.248.227.165','167.114.250.199','51.15.86.160','212.83.164.85','82.224.48.173‘
我只知道IP地址,但没有端口号。
我期待着这样的事情-- '37.59.0.139:17658'
发布于 2017-09-29 13:54:27
您的代码无法工作,因为--除了在其他答案中指出的正则表达式中的几个问题之外--您提供的网站通过在底层HTML代码中执行一些javascript来显示每个IP的端口号。
为了捕获每个IP 和的相关端口号,您首先需要执行javascript,以便在HTML中正确地打印端口号(您可以遵循这里的指南:Web-scraping JavaScript page with Python)。然后,您需要从javascript计算的HTML响应中提取此信息。
通过检查HTML,我发现每个端口号前面都是:</font>,后面是<。
下面可以找到一个工作代码片段。我冒昧地稍微修改了您的IP-regex,因为只有某些IP地址与端口号相关联(其他IP与主机名列相关,应该被丢弃)--即感兴趣的IP是后面跟着<script字符串的IP。
import dryscrape
import re
url = 'http://spys.one/free-proxy-list/FR/'
#get html with javascript
session = dryscrape.Session()
session.visit(url)
response = session.body()
#capture ip:
IP = re.findall(r'[0-9]+(?:\.[0-9]+){3}(?=<script)',response)
#capture port:
port = re.findall(r'(?<=:</font>)(.*?)(?=\<)',response)
#join IP with ports
IP_with_ports = []
for i in range(len(IP)):
IP_with_ports.append(IP[i] + ":" + port[i])
print (IP_with_ports)输出:'178.32.213.128:80','151.80.207.148:80','134.119.223.242:80','37.59.0.139:17459','37.59.0.139:17658‘
请注意,上面的代码只适用于您提供的网站,因为每个网站都有自己的显示数据的逻辑。
发布于 2017-09-29 13:48:53
首先,您的正则表达式有一些不稳定的部分:您有(?:,您可能指的是(:?。不确定前者意味着什么,但后者意味着零或一个:
您的正则表达式只需要按:或.划分的四组数字。您需要最多五组数字:0.0.0.0:0000 =五个组。试一试:
re.findall( r'([0-9]{1,3}\.){3}[0-9]{1,3}(:[0-9]{2,4})?'[0-9]{1,3} =1到3位数\. =句点(转义,因为.表示“任意字符”){3} =需要精确地重复上述三次(:[0-9]{2,4})是一个冒号,后面是一个长在2到4个字符之间的数字序列。这是你的端口.?端口是可选的,它要么在那里,要么不存在。https://stackoverflow.com/questions/46488132
复制相似问题