Web scraping yapanlar için benden bir kütüphane

yuathay

Katılımcı Üye
7 Mar 2023
377
180
Gitti

Selamün Aleyküm​

öncelikle şunu söyleyim kesin calisiyor diyemem iddialı değilim ama sanal makinemdeki bWAPP'de işe yaradı diğer siteleri bilmiyorum ufak çaplı bir kütüphane, internetteki her site login olmadan alt sayfaları ile etkileşim kurmamıza izin veriyor açıkcası deneyecek site bulamadım siz denersiniz aklınızda varsa​

kod login şifre ve click değerleri icin yazıldı reqister veya dördüncü bir inputta hata verir​

yazdıgım kod verilen siteye gidip gidilen sitedeki input ve button değerlerini çekip bu degerler icindeki id ve name degerlerini alıcak bu değerlerede sizin verdiginiz kullanıcı adını ve şifreyi girip click butonuna basacak
bu ne işe yarar :
ben şahsen bWAPP zafiyetli makinesini çözerken selenium ile siteyi acip requests ile sitedeki oturumu tutup ardından requests ile devam ediyordum direk requests ile hedef siteye işlem yaptığım zaman login sayfasına yönlendiriliyordum ve hedef site ile etkileşimim başarısız oluyordu kendime yazdıgım modulüde sizinle paylaşıyorum

kullanım :

oturum seçeneği :
ilk seçenekde kullanıcı adı şifre ve login olunacak site girilir ardından kod yukarıda dedigim işlemleri gerçekleştirir ve login olunduktan sonra requests ile oturum tutulur ardından ---yuathay--- ı
requests kütüphanesini kullanıyormuş gibi kullanabilirsiniz requests.get(site) yaptıgınızda sizi login sayfasına yönlendiren siteleri yuathay.get(site) ile atlatabilirsiniz login sayfasına gitmeden direk istediginiz siteye gideceksiniz

3vdeqdo.png


oturum2 seçeneği :
bu seçenektede aynı şeyler geçerli ama bazı sitelerin requests ile kaynak kodlarını almaya çalıştıgımızda input degerleri ve button degerleri gelmiyor az bir içerik geliyor bu durumda kod otomatik olarak tarayıcının console kısmında javascript kodları çalıştırıp input ve button degerlerinin id ve name'lerini alır ve işlemlere devam eder NOT : oturum çalışmazsa oturum2'yi deneyin oturum daha hızlı gibi geldi bana
atf5p4l.png


ilk olarak requests kütüphanesi ile siteye get istegi yapıyorum

5bevwnf.png



gelen sonuc login sayfasından geliyor yani beni istedigim sayfaya degilde login sayfasına attı şimdi modulle yapalım


c3xwv0q.png

ve istedigim sayfaynın içeriğini alabildim title kısmından anlaşılabiliyor

oturum2'de aynı şekilde ama çıktısı yavaş geliyor :

c5fx8gi.png


zamanında console kısmında kod calistirma yolunu bana gösteren closx e teşekkür ederim

kodlar :
Python:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.firefox.options import Options
import requests

#kodu genel mantıgı siteye gidip sitedeki kullanıcı adı şifre ve giriş düğmelerinin id ve name değerlerini alıp siteye giriş yapıp oturumu tutup requests kütüphanesi ile işlemler yapmak

yuathay = requests.Session() #yuathay yerine kendi istediginiz adı verebilirsiniz ama adı değiştirdiginizde aşagıdada yuathay yazan yerlere tercih ettiğiniz yeni adı yazmanız gerekir

def oturum(kullanici_adı,şifre,site):
    option = Options()
    option.add_argument("--headless")#görünmez modda başlatıyoruz tarayıcıyı
    browser = webdriver.Firefox(options=option)
    browser.get(site)

    login_input = []
    input_elements = browser.find_elements(By.TAG_NAME, "input") #find_elements(By.TAG_NAME,"input") sitedeki bütün input taglarını alır
    for element in input_elements:
        login_input.append(element.get_attribute("id")) #inputtaki id değerlerini alrır
        login_input.append(element.get_attribute("name")) #inputtaki name değerlerini alır
        
    button_click = []
    buttons = browser.find_elements(By.TAG_NAME,"button")
    for button in buttons:
        button_click.append(button.get_attribute("id"))
        button_click.append(button.get_attribute("name"))

    input_degerleri = []
    input_döngü = [input_degerleri.append(a) for a in login_input if a and a not in input_degerleri]

    click_degerleri = []
    #---if w : w boş degilse demek---w not in click_degerleri : w click degerlerinde değilse demek yani tekrar eden eleman eklenmiyor---
    click_döngü = [click_degerleri.append(w) for w in button_click if w and w not in click_degerleri]
    sayı = 0
    index = 0
    durum = True
    while durum:
        try:
            browser.find_element(By.ID,input_degerleri[sayı]).send_keys(kullanici_adı)
            browser.find_element(By.ID,input_degerleri[index]).send_keys(şifre)
            for y in range(len(click_degerleri)):
                try:
                    browser.find_element(By.ID,click_degerleri[y]).click()
                except:
                    browser.find_element(By.NAME,click_degerleri[y]).click()
            browser.find_element(By.NAME,input_degerleri[sayı]).send_keys(kullanici_adı)
            browser.find_element(By.NAME,input_degerleri[index]).send_keys(şifre)
            for o in range(len(click_degerleri)):
                try:
                    browser.find_element(By.ID,click_degerleri[o]).click()
                except:
                    browser.find_element(By.NAME,click_degerleri[o]).click()
        except:
            pass
        sayı += 1
        if sayı == len(input_degerleri):
            sayı = 0
            index += 1
            if index == len(input_degerleri):
                ana_sayfa = browser.get_cookies()
                for cookie in ana_sayfa:
                    yuathay.cookies.set(cookie['name'],cookie['value'])
                durum = False

#bazen büyük sitelerde requests kütüphanesi ile id ve name değerlerini cekemedigimiz durumlar olabiliyor  bunun icin oturum2'yi kullanıcaz bu fonksiyonda sitenin console kısmına gidilir ve oraya asağıdaki javascript
#kodları yazılır buradan gelen degerler bize id ve name degerlerini verir ve işlemlerimize bu değerler ile devam ederiz
def oturum2(kullanici_adı,şifre,site):
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("--disable-blink-features=AutomationControlled")
    chrome_options.add_argument("--ignore-certificate-errors")

    chrome_options.add_argument(f"--user-agent=Lynx: Lynx/2.8.8pre.4 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.23")

    chrome_options.add_argument("headless")
    chrome_options.page_load_strategy = "normal"

    chrome_options.set_capability("goog:loggingPrefs", {"performance": "ALL"})
    driver = webdriver.Chrome(options=chrome_options)

    #siteden input taglarını almak icin javasript kodu
    script_for_input = '''
    var elements = document.querySelectorAll('input');
    var Values = [];
    for (var i = 0; i < elements.length; i++) {
        var idValue = elements[i].getAttribute('id');
        var nameValue = elements[i].getAttribute('name');
        if (idValue) {
            Values.push(idValue);
        }
        if (nameValue) {
            Values.push(nameValue);
        }
    }
    return Values;
    '''
    #button taglarını almak icin javascript kodu
    script_for_button ='''
    var elements = document.querySelectorAll('button');
    var Values = [];
    for (var i = 0; i < elements.length; i++) {
        var idValue = elements[i].getAttribute('id');
        var nameValue = elements[i].getAttribute('name');
        if (idValue) {
            Values.push(idValue);
        }
        if (nameValue) {
            Values.push(nameValue);
        }
    }
    return Values;
    '''
    driver.get(site)
    results = driver.execute_script(script_for_input) #execute_script ile sitede javascript çalıştırıyoruz
    inputlar = []
    a = [inputlar.append(q) for q in results if q and q not in inputlar]

    çıktı = driver.execute_script(script_for_button)
    buttonlar = []
    b = [buttonlar.append(i) for i in çıktı if i and i not in buttonlar]
    #buttonlar = list(set(çıktı)) #bunu yaparakta tekrarlanan öğeleri kaldırabiliriz ben pratik icin boyle yazıyorum
    driver.quit()
    
    firefox_options = webdriver.FirefoxOptions()
    firefox_options.add_argument("--headless")
    driver = webdriver.Firefox(options=firefox_options)
    driver.get(site)
    durum = True
    sayı = 0
    index = 0
    while durum:
        try:
            driver.find_element(By.ID,inputlar[sayı]).send_keys(kullanici_adı)
            driver.find_element(By.ID,inputlar[index]).send_keys(şifre)
            for y in range(len(buttonlar)):
                try:
                    driver.find_element(By.ID,buttonlar[y]).click()
                except:
                    driver.find_element(By.NAME,buttonlar[y]).click()
            driver.find_element(By.NAME,inputlar[sayı]).send_keys(kullanici_adı)
            driver.find_element(By.NAME,inputlar[index]).send_keys(şifre)
            for o in range(len(buttonlar)):
                try:
                    driver.find_element(By.ID,buttonlar[o]).click()
                except:
                    driver.find_element(By.NAME,buttonlar[o]).click()
        except:
            pass
        sayı += 1
        if sayı == len(inputlar):
            sayı = 0
            index += 1
            if index == len(inputlar):
                ana_sayfa = driver.get_cookies()
                for cookie in ana_sayfa:
                    yuathay.cookies.set(cookie['name'],cookie['value'])
                durum = False

kolay gelsin​

 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.