新程序员,坚持使用python http请求

时间:2013-09-17 18:10:50

标签: python http web-scraping obfuscation

首先,我想提前感谢所有人,我意识到这可能是一个相当基本的问题,但是经过几个小时没有结果我决定伸手去寻求帮助。

我正在制作一个小脚本,最终将成为一个更大,更多部分的程序的一部分(希望大声笑)。基本上,它查询hidemyass.com以获取代理列表(基于用户输入),然后将所述列表保存到临时文件中,以便在下一步中进行ping和验证。 看起来很简单吧?

现在我的问题......

当我发出请求并查看html响应源时,代理IP地址已经被分割得很奇怪了。

例如

    <br>
    .QJZ-{display:none}<br>
    .dA6C-{display:inline}<br>
    .h0UB-{display:none}<br>
    .HOns-{display:inline}<br>
    <br>        
    </style><div style="display:none">1</div><span></span><span style="display:none">99</span><span class="QJZ-">99</span><div style="display:none">99</div>201<span style="display: inline">.</span><span class="QJZ-">9</span><div style="display:none">9</div><div style="display:none">10</div><span style="display:none">80</span><span class="QJZ-">80</span><span style="display:none">140</span><span class="QJZ-">140</span><span style="display:none">149</span><span class="h0UB">149</span><div style="display:none">149</div><span style="display:none">161</span><span class="h0UB">161</span><span></span><span style="display:none">190</span>210<div style="display:none">217</div><span class="h0UB">234</span><span class="243">.</span><span class="h0UB">6

我的问题是,我怎么能让我的代码读取它作为一个IP地址? (它不是完整的HTML,我切断了以便缩短我的问题,因为它已经很大了)

再次感谢,
L8nit3tr0ubl3

编辑 - 忘了提及我正在使用python,并且只有很少的javascript / html经验(我假设拆分是用java完成的)

2 个答案:

答案 0 :(得分:1)

他们特意试图阻止你这样做 (正如我在blog上所述)

您可以向他们询问API,或者您可以尝试使用CSS引擎来确定将显示哪些元素。

答案 1 :(得分:1)

#!/usr/bin/python
#-*- encoding: Utf-8 -*-
from requests import get
from re import sub
from sys import stdout

html = get('http://www.hidemyass.com/proxy-list/').content
html = html.split('<table id="listtable"')[1].split('</table')[0]
html = html.split('<tr')[2:]

checkClass = lambda x: x.group(2) if x.group(1) not in classesBad else ''

for tr in html:
    css = tr.split('<style>\n')[1].split('\n<')[0].split('\n')

    classesBad = [rule[1:5] for rule in css if 'display:none' in rule]

    ip = tr.split('</style>')[1].split('</span></td>')[0]
    ip = sub('<(?:span|div) style="display:none">.+?</(?:span|div)>', '', ip)
    ip = sub('<span style="display: inline">(.+?)</span>', r'\1', ip)
    ip = sub('<span class="(.+?)">(.+?)</span>', checkClass, ip)
    ip = ip.replace('<span></span>', '')

    port = tr.split('<td>\n')[1].split('<')[0]

    protocol = tr.split(' \n             <td>')[1].split('<')[0].lower()

    print '%s://%s:%s/' % (protocol, ip, port)
相关问题