首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3-从动态网页中提取IP地址和端口号

Python 3-从动态网页中提取IP地址和端口号
EN

Stack Overflow用户
提问于 2017-09-29 11:45:15
回答 2查看 2.8K关注 0票数 2

我想从这个链接中提取IP地址和端口号。下面是我的Python代码:http://spys.one/free-proxy-list/FR/

代码语言:javascript
复制
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'

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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。

代码语言:javascript
复制
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‘

请注意,上面的代码只适用于您提供的网站,因为每个网站都有自己的显示数据的逻辑。

票数 0
EN

Stack Overflow用户

发布于 2017-09-29 13:48:53

首先,您的正则表达式有一些不稳定的部分:您有(?:,您可能指的是(:?。不确定前者意味着什么,但后者意味着零或一个:

您的正则表达式只需要按:.划分的四组数字。您需要最多五组数字:0.0.0.0:0000 =五个组。试一试:

代码语言:javascript
复制
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个字符之间的数字序列。这是你的端口.
  • ?端口是可选的,它要么在那里,要么不存在。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46488132

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档