Web Sitesinden Veri Kazıma: Temel Bilgiler ve Örnek Kodlar

nt

Emekli
Katılım
21 Nisan 2023
Mesajlar
1,215
Selam !
pthon programlama dili kullanarak veri kazıma konusunda bilgi paylaşmak istedim. Malum artık petrol veri oldu.
Veri kazıma, web sitelerinden veya diğer çevrimiçi kaynaklardan veri çekmek için kullanılan güçlü bir tekniktir.
Bu yöntemle, web sitelerindeki metinleri, resimleri, tabloları veya diğer verileri çekebilir ve analiz edebiliriz.
Çektiğimiz bilgiler "data.csv" olarak kayıt ediyor hedef sitenizi ve hedef "data= []" kısmını değiştirip kullanabilirsiniz
proxy kullanmazsanız atıyorum 5 dakika 1 dakika uyku ekliyebilirsiniz, gereğinden fazla istek ban sebebi olabilir.

Veri kazıma işlemleri için Python'da kullanılan popüler kütüphaneler arasında Beautiful Soup ve Requests bulunmaktadır. Beautiful Soup, HTML ve XML belgelerini analiz etmek için kullanılırken, Requests kütüphanesi web sayfalarını indirmek için kullanılır.Timezaman modülümü proxy denemek için kullanıldu
Random modülü proxy secımı yapıcak

verikazıma örneği:
import requests
from bs4 import BeautifulSoup
import csv
import time
import logging
import random

#Hedef sitemiz
url = "https://mekatronik.org/forum/"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.5",
    "Accept-Encoding": "gzip, deflate, br",
    "Connection": "keep-alive",
    "Upgrade-Insecure-Requests": "1"
}
#proxy kullanmak iyidir sitelerin çoğu banlıyor
proxy_list = [
    'http://1.1.1.1:1234',
    'http://2.2.2.2:5678',
    'http://3.3.3.3:9012',
]

logging.basicConfig(filename="scraper.log", level=logging.ERROR)

session = requests.Session()
try:
    response = session.get(url, headers=headers)
    response.raise_for_status()  # Raise an exception if the response is not OK
    soup = BeautifulSoup(response.text, "html.parser")
except Exception as e:
    logging.error(f"Error on initial request: {e}")
    raise

#CAPTCHA varsa çözsün
if "captcha" in response.text:
    solver = CaptchaSolver("captcha_service_api_key")
    captcha_url = soup.find("img", class_="captcha-image").get("src")
    captcha_text = pytesseract.image_to_string(captcha_image)
    form_data["captcha"] = captcha_text.strip() 
try:
    total_pages = int(soup.find("span", class_="total-pages").text)
except Exception as e:
    logging.error(f"Error finding total pages: {e}")
    raise

data = []
for page in range(1, total_pages + 1):
    try:
        params = {"page": page}
        response = session.get(url, headers=headers, params=params)
        response.raise_for_status()
        soup = BeautifulSoup(response.text, "html.parser")
        for person in soup.find_all("div", class_="person"):
            email = person.find("a", class_="email").text.strip()
            name = person.find("span", class_="name").text.strip()
            surname = person.find("span", class_="surname").text.strip()
            company = person.find("span", class_="company").text.strip()
            data.append([email, name, surname, company])
            time.sleep(random.uniform(1, 5))
    except Exception as e:
        logging.error(f"Error on page {page}: {e}")
        continue

# CSV kayıt kodu
try:
    with open("data.csv", "w", newline="") as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(["Email", "Name", "Surname", "Company"])
        writer.writerows(data)
except Exception as e:
    logging.error(f"Error saving data to CSV: {e}")
    raise
 
Son düzenleme:
Ben bütün bu işlemleri PHP ile yapıyorum. Python kullanmanın fazladan bir artısı var mı?
 
PHP'yi neredeyse 15 yıldan uzun zamandır kullanıyorum, dolayısıyla bunlar benim için farklı gibi durmuyor. Ama merak ediyorum bir ara deneyeceğim.
 
  • Beğen
Reactions: nt
hadi tüm interneti tarıyacak bir kod yazalım ki burda yazılmışı var :D

buna @Sercan abideki uçaklardan lazım
ben run dersem birdaha diyemeye bilirim.

mantık olarak url üretip ürettiği urllerden bilgileri çekiyor bot saldırılarına karşı önlem alan sitelerin güvenlik duvarı varmı var modunda
koda sadece java ile mouse tık olayı lazım oda olursa bu kodu tuttamazsın :)

tüm neti tarama fikri:
import requests
from bs4 import BeautifulSoup
import csv
import time
import logging
import random
from requestium import Session

def get_cookie_count(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    cookie_element = soup.find("span", id="cookie_count")
    if cookie_element:
        cookie_count = int(cookie_element.text)
        return cookie_count
    else:
        print("Cookie count element not found on the page.")
        return None

def generate_url(domain, extension):
    url = f"https://www.{domain}.{extension}"
    return url

def scrape_all_sites():
    data = [#bukısmıdoldurmakgerekli]
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
        "Accept-Language": "en-US,en;q=0.5",
        "Accept-Encoding": "gzip, deflate, br",
        "Connection": "keep-alive",
        "Upgrade-Insecure-Requests": "1"
    }

    proxy_list = [
        # Proxy list
    ]
    session = Session(webdriver_path='./chromedriver')
    for domain_length in range(3, 16):
        domain_list = generate_domain_list(domain_length)
        for domain in domain_list:
            extensions = [
                "com", "org", "xyz", "net", "tr", "asia", "biz", "edu",
    "gov", "info", "int", "mil", "name", "pro", "tel", "travel",
    "app", "blog", "club", "design", "io", "jobs", "mobi",
    "online", "store", "tech", "web", "website", "tv", "co", "dev",
    "agency", "art", "beauty", "book", "cafe", "center",
    "chat", "clothing", "community", "company", "construction",
    "digital", "events", "finance", "fitness", "gallery", "group",
    "health", "hotel", "media", "music", "photography", "restaurant",
    "services", "shop", "social", "software", "studio", "video", "world",
    "academy", "blog", "careers", "crypto", "fashion", "guru",
    "investments", "law", "marketing", "news", "realty", "science",
    "space", "tips", "university", "yoga",
    "ac", "ad", "ae", "af", "ag", "ai", "al", "am", "an", "ao",
    "aq", "ar", "as", "at", "au", "aw", "ax", "az", "ba", "bb",
    "bd", "be", "bf", "bg", "bh", "bi", "bj", "bm", "bn", "bo",
    "br", "bs", "bt", "bw", "by", "bz", "ca", "cc", "cd", "cf",
    "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "cr", "cu",
    "cv", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", "dz",
    "ec", "ee", "eg", "er", "es", "et", "eu", "fi", "fj", "fk",
    "fm", "fo", "fr", "ga", "gd", "ge", "gf", "gg", "gh", "gi",
    "gl", "gm", "gn", "gp", "gq", "gr", "gs", "gt", "gu", "gw",
    "gy", "hk", "hm", "hn", "hr", "ht", "hu", "id", "ie", "il",
    "im", "in", "io", "iq", "ir", "is", "it", "je", "jm", "jo",
    "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw",
    "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt",
    "lu", "lv", "ly", "ma", "mc", "md", "me", "mg", "mh", "mk",
    "ml", "mm", "mn", "mo", "mp", "mq", "mr", "ms", "mt", "mu",
    "mv", "mw", "mx", "my", "mz", "na", "nc", "ne", "nf", "ng",
    "ni", "nl", "no", "np", "nr", "nu", "nz", "om", "pa", "pe",
    "pf", "pg", "ph", "pk", "pl", "pm", "pn", "pr", "ps", "pt",
    "pw", "py", "qa", "re", "ro", "rs", "ru", "rw", "sa", "sb",
    "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn",
    "so", "sr", "st", "sv", "sy", "sz", "tc", "td", "tf", "tg",
    "th", "tj", "tk", "tl", "tm", "tn", "to", "tr", "tt", "tv",
    "tw", "tz", "ua", "ug", "uk", "us", "uy", "uz", "va", "vc",
    "ve", "vg", "vi", "vn", "vu", "wf", "ws", "ye", "yt", "za",
    "zm", "zw"
            ]
            for extension in extensions:
                url = generate_url(domain, extension)
                try:
                    response = session.get(url, headers=headers)
                    response.raise_for_status()
                    soup = BeautifulSoup(response.text, "html.parser")
                    for person in soup.find_all("div", class_="person"):
                        email = person.find("a", class_="email").text.strip()
                        name = person.find("span", class_="name").text.strip()
                        surname = person.find("span", class_="surname").text.strip()
                        company = person.find("span", class_="company").text.strip()
                        data.append([email, name, surname, company])
                        time.sleep(random.uniform(1, 5))
                except requests.exceptions.HTTPError as errh:
                    logging.error(f"HTTP Error: {errh}")
                except requests.exceptions.ConnectionError as errc:
                    logging.error(f"Error Connecting: {errc}")
                except requests.exceptions.Timeout as errt:
                    logging.error(f"Timeout Error: {errt}")
                except requests.exceptions.RequestException as err:
                    logging.error(f"Request Exception: {err}")
                except Exception as e:
                    logging.error(f"Error on URL: {url}\n{e}")
                    continue
    return data
def generate_domain_list(length):
    chars = "abcdefghijklmnopqrstuvwxyz0123456789"
    domains = [""]
    for i in range(length):
        new_domains = []
        for domain in domains:
            for char in chars:
                new_domains.append(domain + char)
        domains = new_domains
    return domains
try:
    data = scrape_all_sites()
except Exception as e:
    logging.error(f"Error during scraping: {e}")
    raise
try:
    with open("data.csv", "w", newline="") as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(["www"])
        writer.writerows(data)
except Exception as e:
    logging.error(f"Error saving data to CSV: {e}")
    raise
#HAPPY DAYS !
 
Son düzenleme:
@Sercan abi java bilgine ihtiyacım var

cloudflare tıklamasını aşmak için bir java kodu yazmaya çalışıtım ama dile genel olarak hakim olmadığım için bunu bi bilene soralım dedim

basit bir python ile bu şekilde bir tıklama yapailirim
images(1).png


ama bu botu algılar benım yapmaya çalıştığım ve başaramadığım :(
images(2).png
 
  • Beğen
Reactions: nt
@Sercan abi onlarda düz rota izliyorar seleniumdaki örnegin x gidiyor sonra y gidiyor tıklıyor
ben x y x y falan gibi birşey ile geçmeye çalışıyorum zor galiba
 
Çok zor olmasa gerek ama bunun birde yasal çerçevesi var. O nedenle çok da konuşulmuyor olabilir.
 
  • Beğen
Reactions: nt
konuyu şöyle çözüme kavuşturdum tabiki java konusunda hala emin değilim ama siteler bizi izlerse bende siteleri izlerim site izleme kodunu ayrı bı konuda paylaşıcağım
Dizi Trt1 GIF by WASS Medya


bu kodumuzda pyautogui kullanarak mause hareketlerini yapabiliyoruz
kullanımıda basit
pyautogui kütüphanesi:
import time
import random
import pyautogui
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.get("https://mekatronik.org")
time.sleep(10)
width, height = pyautogui.size()
for _ in range(10):  
    x = random.randint(0, width)
    y = random.randint(0, height)
    duration = random.uniform(0.1, 0.5)
    pyautogui.moveTo(x, y, duration=duration)
captcha_element = driver.find_element(By.ID, "captcha")
captcha_element.click()
driver.quit()

daha sonra bununla birlikte birde

apache ve ıp:
import java.io.IOException;
import org.apache.http.HttpHost;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.CloseableHttpResponse;
import org.apache.http.impl.client.HttpClients;

public class Main {
    public static void main(String[] args) throws IOException {
        String proxyIP = "123.45.67.89";
        int proxyPort = 12345;

        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpHost proxy = new HttpHost(proxyIP, proxyPort);
        HttpGet request = new HttpGet("https://mekatronik.org");
        request.setConfig(RequestConfig.custom().setProxy(proxy).build());

        CloseableHttpResponse response = httpClient.execute(request);

        // ...içeriği siz belirlersiniz

        httpClient.close();
    }
}
 
Son düzenleme:
Selam !

bugün sizlerle forumdaki bilgileri nasıl çekeriz bunu anlatıcam :D

sitekontrol:
import requests

url = 'https://mekatronik.org/forum'
response = requests.get(url)

if response.status_code == 200:
    print(response.text)
else:
    print(f'Hata kodu: {response.status_code}. Robots.txt dosyasına ulaşılamıyor.')

yukarıda ki kodda print(response.text) sitenin html içeriğini gösterir
(oraya başka şeylerde yazabilirdik print head yada h2 yada title falan unutma bu kod yazmak senin isteklerine bağlı bir siteden fiyat'da çekersin haber'de )
sonra siz sadece kullanıcı adları yada başlıkları yada tamamını çekebilir kaydedebilirsiniz
kodun cıktısı şu şekilde :
Bash:
            <img src="/forum/styles/icons/32.png" alt="X" width="28">
                        </span>

                        <div class="node-main js-nodeMain">



                                <h3 class="node-title">
                                        <a href="/forum/forums/deneme.32/" data-xf-init="element-tooltip" data-shortcut="node-description">Deneme</a>
                                </h3>

                                        <div class="node-description node-description--tooltip js-nodeDescTooltip">Deneme amaçlı forum</div>


                                <div class="node-meta">

                                                <div class="node-statsMeta">
                                                        <dl class="pairs pairs--inline">
                                                                <dt>Konular</dt>
                                                                <dd>31</dd>
                                                        </dl>
                                                        <dl class="pairs pairs--inline">
                                                                <dt>Mesajlar</dt>
                                                                <dd>128</dd>
                                                        </dl>
                                                </div>
                                </div>
                        </div>
                                <div class="node-stats">
                                        <dl class="pairs pairs--rows">
                                                <dt>Konular</dt>
                                                <dd>31</dd>
                                        </dl>
                                        <dl class="pairs pairs--rows">
                                                <dt>Mesajlar</dt>
                                                <dd>128</dd>
                        <div class="node-extra">

                                        <div class="node-extra-icon">

                                                        <a href="/forum/members/taydin.1/" class="avatar avatar--xs" data-user-id="1" data-xf-init="member-tooltip">
                        <img src="https://secure.gravatar.com/avatar/1c22a13dabd32520add901ece8dcd9b1?s=48" srcset="https://secure.gravatar.com/avatar/1c22a13dabd32520add901ece8dcd9b1?s=96 2x" alt="taydin" class="avatar-u1-s" width="48" height="48" loading="lazy" />
   </div>
                                        <div class="node-extra-row">

                                                        <a href="/forum/threads/test-mesaj.4468/post-82678" class="node-extra-title" title="test mesaj">test mesaj</a>

                                        </div>
                                        <div class="node-extra-row">
                                                <ul class="listInline listInline--bullet">
                                                        <li><time  class="node-extra-date u-dt" dir="auto" datetime="2023-11-13T22:25:24+0200" data-time="1699907124" data-date-string="13 Kasım 2023" data-time-string="22:25" title="13 Kasım 2023 saat 22:25">13 Kasım 2023</time></li>

                                                                <li class="node-extra-user"><a href="/forum/members/taydin.1/" class="username " dir="auto" data-user-id="1" data-xf-init="member-tooltip"><span class="username--staff username--moderator username--admin">taydin</span></a></li>

                                                </ul>
                                        </div>

Bu Çıktı iyi okumalı neleri almak istediğimize karar vermeliyiz şimdi kodumuza geçelim

Python:
import requests
from bs4 import BeautifulSoup
from datetime import datetime

def scrape_forum_data(url):
    response = requests.get(url)
    if response.status_code != 200:
        print(f'Hata kodu: {response.status_code}. Sayfaya ulaşılamıyor.')
        return None

    soup = BeautifulSoup(response.text, 'html.parser')

    titles = soup.select('.node-extra-title')
    user_names = soup.select('.node-extra-user .username')

    if not titles or not user_names:
        print('Başlıklar veya kullanıcı adları bulunamadı.')
        return None

    current_date = datetime.now().strftime("%Y-%m-%d")
  
    data_list = []
    for title, user_name in zip(titles, user_names):
        post_data = {
            'Title': title.text.strip(),
            'User Name': user_name.text.strip(),
            'Date': current_date
        }
        data_list.append(post_data)

    return data_list

def save_to_csv(data_list):
    if not data_list:
        return

    current_date = datetime.now().strftime("%Y-%m-%d")
    csv_file_path = f'forum_data_{current_date}.csv'
  
    with open(csv_file_path, 'w', newline='', encoding='utf-8') as csv_file:
        csv_file.write('Title,User Name,Date\n')
        for data in data_list:
            csv_file.write(f'{data["Title"]},{data["User Name"]},{data["Date"]}\n')

    print(f'Forum verileri {csv_file_path} dosyasına kaydedildi.')

if __name__ == "__main__":
    forum_url = 'https://mekatronik.org/forum'

    forum_data = scrape_forum_data(forum_url)
    save_to_csv(forum_data)
bu kodun çıktısı

Bash:
Forum verileri forum_data_2023-11-20.csv dosyasına kaydedildi.

.csv ekliyemediğimden kaydettiği cıktıyı yüklüyorum unutmayın sizle paylaştığım basit bir örnek

Screenshot_2023-11-20_10-40-35.png
 
Son düzenleme:
Arada (15. satır gibi) kaymalar olmuş. Bu tarz hatarlardan da kurtulman lazım. Büyük datalarla uğraşırken çok daha büyük sorunlar doğuruyor.
 
  • Beğen
Reactions: nt
Sen verilerini filtre etmeyi becerememissin, benimle ilgisi yok. Kolonlari kaydirmissin iste. :cool:
 

Çevrimiçi üyeler

Forum istatistikleri

Konular
5,839
Mesajlar
99,582
Üyeler
2,479
Son üye
yiyehuoxing32

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
cemalettin keçeci wrote on HaydarBaris's profile.
barış kardeşim bende bu sene akıllı denizaltı projesine girdim ve sensörleri arastırıyorum tam olarak hangi sensör ve markaları kullandınız yardımcı olabilir misin?
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Back
Top