22 нояб. 2012 г.

Собираем прокси лист для grab

Grab - фреймворк для парсинга сайтов, умеет работать через прокси сервера. В документации заявлено, что grab в принципе может сам брать сервера из файла-списка, сам может выбирать случайный, сам может менять сервера от запроса к запросу (Grab documentation. Работа с прокси-серверами).
Ниже скрипт для сбора этого списка с spys.ru - так проще, чем собирать список из поисковиков, а потом еще постоянно мониторить не отвалился ли какой-нибудь из серверов.

# -*- coding: utf-8 -*-

import os
import sys
import re
from grab import Grab, GrabError
from urllib import quote
from iptools import validate_ip


def parse():
    g = Grab()
    g.go('http://spys.ru/')
    rex = re.compile(r'(?:(?:[-a-z0-9]+\.)+)[a-z0-9]+:\d{2,4}')
    f = open(os.path.join(sys.path[0], 'proxy_list.txt'), 'w')
    for proxy in rex.findall(g.css_text('body')):
        ip, port = proxy.split(':')

        if len(ip.split('.')[0]) >= 4:  # на spys.ru для секурности дописывают двухсимвольную фигню в начало.
            ip = ip[2:]
            proxy = proxy[2:]

        if validate_ip(ip):
            g.setup(proxy=proxy, proxy_type='http', connect_timeout=5, \
                    timeout=5)
            try:
                g.go('http://www.apple.com/')
                try:
                    h1 = g.xpath_text("//h1")
                    if h1 in ['ERROR', 'Proxy Authentication Required']:
                        continue
                except Exception, e:
                    print e

                if g.response.code == 200:
                    print proxy.ljust(20), 'OK  ', g.response.code
                    f.write(proxy + '\n')

            except GrabError:
                print proxy.ljust(20), 'FAIL'
    f.close()

if __name__ == '__main__':
    parse()
Отправить комментарий