Request modülü ile url deki html kaynağa ulaşamıyorum?

S.a. arkadaşlar,

request ile html kaynağa ulaşamıyorum bir türlü. Javascript ile veri yazdırıyor. Böyle durumlarda ne yapmam gerekiyor. Selenium hariçi bir öneriniz varmı lütfen ? Ulaşmaya çalıştığım html bölüm aşağıda.

<div id="cmenu" class="margin-b-20 hide" style="display: block;"><a class="fc-g" href="/">Home</a> &gt; <a class="fc-g" href="/i/chicme/v8/category/real/products?productCategoryId=1M4r3s7b04K9A8o5X4S7f8P9y">Women's Clothing</a> &gt; <a class="fc-g" href="/i/chicme/v8/category/real/products?productCategoryId=1R4s3o7D0Y4Q9T9p5Z7K3P3T1D">Dresses</a> &gt; <a href="/i/chicme/v8/category/real/products?productCategoryId=1N4x37n0w5y0r3F5v5J0d1G9"><strong>Bodycon</strong></a></div>

Kod:

g = requests.get("https://www.ivrose.com/product/one_shoulder_sleeveless_ruched_bodycon_dress/8db8f209-66b9-4b15-9b26-8d5653d91404.html",allow_redirects=False)
response = g.status_code
print("Status code: ",response)
if str(response) == '200':
	soup = BeautifulSoup(g.content,"html.parser")
	kategori = soup.find_all("div", {'id':"cmenu"})
	print(kategori)

Çıktı:

<div class="margin-b-20 hide" id="cmenu"></div>

içeriği gelmiyor, ne önerirsiniz lütfen.

Direk çekmek yerine zaman koy 10 saniye kadar sonra veriyi çek yüklenmesini bekle sistemin tamamen.

1 Like

Direk çekmek yerine zaman koy 10 saniye kadar sonra veriyi çek yüklenmesini bekle sistemin tamamen.

Bekleme koymak hiçbir işe yaramaz.

Eğer javascript ile site içeriği değiştiriliyorsa javascript’in yorumlanması gerekir. Maalesef requests modülü ile bu yapılamaz. Bu modül size içeriği getirir. Örneğin içerikte alert("test") şeklinde bir javascript kodu var. Bu kod sunucudan size doğrudan aktarılır. Bu kod ile ne yapılacağı size kalmıştır. Eğer siteye javascript desteği olan bir taryıcıdan giriş yapılmışsa tarayıcı bizim için bu kodu yorumlar ve ekrana ‘alert box’ içinde “test” mesajı bastırılır. Aynı şekilde requests modülü ile içerik getirilir fakat javascript yorumlanmaz.
Bu tarz sorunlarda site içeriği büyük ihtimal başka bir site veya sayfadan ajax benzeri bir metodla çekilir. Eğer bu şekildeyse javascript kodunda ajax ile içerik çekilen URL’e requests istek gönderirseniz istediğiniz içeriğe ulaşabilme ihtimaliniz yüksek.

1 Like

Peki hocam direk tarayıcıda açmış gibi html kaynağa tam olarak ulaşma sansım varmı. Böyle bir modül veya farklı bir alternatif varmı, selenium hariçi. Zaten html kaynağa ulaşabilsem hiç sıkıntı olmayacakta.

Ayrıca https://pypi.org/project/dryscrape/ dryscrape modülü tam olarak bu işlemi yapıyormuş, fakat windows desteği yok diyorlar. Linux için sorun yaşayan arkadaşlar için belki çözüm olur diye yazıyorum.

Çözebildim hocam, netten buldum birşeyler valla :slight_smile:


def render(url):
    """Fully render HTML, JavaScript and all."""

    import sys
    from PyQt5.QtCore import QEventLoop,QUrl
    from PyQt5.QtWidgets import QApplication
    from PyQt5.QtWebEngineWidgets import QWebEngineView

    class Render(QWebEngineView):
        def __init__(self, url):
            self.html = None
            self.app = QApplication(sys.argv)
            QWebEngineView.__init__(self)
            self.loadFinished.connect(self._loadFinished)
            self.load(QUrl(url))
            while self.html is None:
                self.app.processEvents(QEventLoop.ExcludeUserInputEvents | QEventLoop.ExcludeSocketNotifiers | QEventLoop.WaitForMoreEvents)
            self.app.quit()

        def _callable(self, data):
            self.html = data

        def _loadFinished(self, result):
            self.page().toHtml(self._callable)

    return Render(url).html
#url = 'http://webscraping.com'  
#url='http://www.amazon.com'
url='https://www.ivrose.com/product/one_shoulder_sleeveless_ruched_bodycon_dress/8db8f209-66b9-4b15-9b26-8d5653d91404.html'
print(render(url))


Kaynak