banner

Заполняем формы используя BeautifulSoup

Думаю не надо объяснять зачем заполнять всевозможные формы на сайтах. В данной статье я покажу простую реализацию автозаполнения форм с использованием модуля BeatifulSoup.
Она лишь покажет примерный план действий и принцип работы многих универсальных постилок на более "Высокоуровневом" коде". Для того, чтобы скрипт знал какие формы заполнять, нам потребуется база с признаками для заполнения. Я разобью её в 3 файла.

  • overlap.txt - не полные совпадения имен полей.
  • fullmatch.txt -полные совпадения имен полей.
  • ignore.txt - фаил с не изменяемыми полями.

Читать далее...

Уникализация шаблонов

Уникализация происходит за счет генерации уникальных стилей для дивов шаблона. Полезность такого метода сомнительна, но всё же. Основываясь на этом примере, можно придумать другие методы уникализации.

#coding:utf-8
#Author: Rushter
#Site: http://klipner.ru
from BeautifulSoup import BeautifulSoup
import random
# Функция генерации стиля
def getstyle():
    # Всевозможные параметры css
    params = ["font-size: %spx;"%(random.randint(10,11)),
              "color:#%s;"%(random.randint(0, 16777215)),
              "clear:%s;"%(random.choice(["none","left","right","both","inherit"])),
              "float:%s;"%(random.choice(["none","left","right","both","inherit"])),
              "font-weight:%s;"%(random.choice(["bold","bolder","lighter","normal","100","200","300","400"]))
              ]
    # Перемешиваем 
    random.shuffle(params)
    # Возращаем случаное кол-во параметров стиля
    return "".join(params[0:random.randint(0,len(params)-1)])
# Открываем шаблон
templ = open("html.html").read().decode("utf-8","ignore")
soup = BeautifulSoup(templ)
# Находим все дивы в шаблое
div_list = soup("div")
# Проходим все дивы
for div in div_list:
    # Если у текущего дива нет параметра style, то идём дальше
    if not div.has_key("style"):
        # Случайно выбираем генерировать или нет стиль для дива
        if random.randint(0,1)==0:
            # Генерируем стиль
            div["style"]=getstyle()
# Приводим код шаблона к красивому виду
templ = soup.prettify()
# Сохраняем шаблон
open("out.html",'w').write(templ)

Многопоточный чекер проиндексированных страниц Яндекс,Google

Для работы потребуется pycurl и grab.
Поддерживаемые выдачи: Яндекс, Гугл, Гугл за 24 часа, Гугл за неделю, Гугл за месяц.
Яндекс можно чекать без прокси, примерная скорость без прокси при 100 потоках 10 ссылок в секунду.
Читать далее...

Скрещиваем A-poster и R-dorgen

Многие те, кто используют a-poster, наверняка знают о возможности использования своих функций. В данном примере я рассмотрю использование функции, которую предоставляет сам автор и передачу ей данных с помощью плагина для R-dorgen. Так как функция берет файлы со ссылками прямо из своей папки, то приходится заливать эти файлы туда. Конечно, эту функцию для удобства можно переписать, но я этого делать не стал. Для этого я написал простой php обработчик, который заливает файлы в папку с функцией. Описание параметров задания и саму функцию можно взять у автора на форуме, после покупки.
Плагин для R-dorgen:

class aposter(object):
    def run(self,domain,keywords,keyurl,pages):
        from grab import Grab
        g = Grab()
        # Заливка файла со ссылками на сервер с a-poster
        data = open("data/lnk/{0}.txt".format(domain)).read().decode("utf-8")
        g.setup(url='http://domain.ru/upl.php',
                post={'name':domain+'.txt','data':data,'pw':'xek'   },
        timeout=150
                )
        g.request()
        # Передача задания для a-poster
        g.setup(url='http://domain.ru/a-poster/external.pl',
                payload="""<password></password> 
<base>useit.txt</base> 
<tasktype>spam</tasktype> 
<spamtype>myfunc</spamtype> 
<myfuncbulk>1</myfuncbulk> 
<myfuncfile>func.pl</myfuncfile> 
<checkpost>0</checkpost> 
<checkpostminpr>0</checkpostminpr> 
<checkpostmaxlinks>0</checkpostmaxlinks> 
<saveparsed>0</saveparsed> 
<readonlyheader>1</readonlyheader> 
<savegood>0</savegood> 
<saveforcheck>0</saveforcheck> 
<proxy>noproxy</proxy> 
<log>no</log> 
<start>0</start> 
<end>0</end>  
<name>TestName</name>  
<mail></mail>  
<url></url>  
<comment>{0}.txt;3;4</comment> 
<quantification>1</quantification>""".format(domain))
        g.request()
        # Вывод результата
        print g.response_body

PHP заливщик файлов(upl.php):

< ?php
if ($_POST['pw']=='xek') {
$data = $_POST['data'];
$name = $_POST['name'];
$fp = fopen("a-poster/my_functions/{$name}",'w');
fwrite($fp,$data);
fclose($fp);
}
?>

Всё что требуется потом: залить php обработчик,правильно указать настройки задания для a-poster и закинуть плагин в папку с доргеном.
В результате весь процесс получается автоматизированным, ручной работы почти нет, кроме добавления заданий в пакетку доргена :)

Сканер портов

Давно ничего не писал, совсем разленился, да и писать не о чём. Зашёл тут недавно глупый спор о скорости работы сокетов на perl и python, пришлось написать простой многопоточный скриптик. Пригодится может кому, для изучения python. В результате мой метод оказался хитрее и быстрей :)

# coding:utf-8
# author: Rushter
# site: http://klipner.ru
import socket,Queue,threading
from time import time
queue = Queue.Queue()
HOST = "localhost"  
COUNT = 1000
THREADS=100
TIMEOUT = 0.01
def worker():
    global queue
    while True:
        try:
            target =  queue.get_nowait()
        except Queue.Empty:
            return 
        check(target)
 
def check(port):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(TIMEOUT)    
    try:
        sock.connect((HOST, port))
    except:
        return
    print port
    sock.close()
def main():
    t1 = time()
    for i in xrange(COUNT):
        queue.put(i)
    for _ in xrange(THREADS):
        thread_ = threading.Thread(target=worker)
        thread_.start()
    while threading.active_count() >1:
        pass
    t2 = time()
    print t2-t1
main()

Парсер google через ajax search api

Простейший парсер google через api. Кому надо, тот сам доведёт до ума, с меня только идея :) . Позволяет парсить примерно 60к ссылок без бана и капчи с 1 Ip, для большей работоспособности без бана можно попробовать добавить задержку.
Все файлы должны быть в utf-8.

# coding:utf-8
# author: Rushter
# site: http://klipner.ru
import urllib2,random,re,time,json,urllib
ff = open("ua.txt").readlines()
ques = open("query.txt").readlines()
out = open("parsed_query.txt","a")
err = 0
for query in ques:
    try:
        for j in range(0,12,4):
            header = {"User-Agent":random.choice(ff)}
            lnk = "http://ajax.googleapis.com/ajax/services/search/web?v=1.0&start={0}&q={1}".format(str(j),urllib.quote(query.strip("\r\n")))
            page_request = urllib2.Request(url=lnk, headers=header)
            page = urllib2.urlopen(url=page_request)
            pp = json.load(page)["responseData"]["results"]
            try:
                for i in xrange(4):
                    out.write(pp[i]["unescapedUrl"]+"\n")
                out.flush()
            except:
                if err>100:
                    break
    except:
        if err>100:
            break
        err = err+1