2012-09-20 24 views
25

Ben birçok kazıyıcı yazdım ama ben sonsuz scrollers nasıl ele alacağından emin değilim. Bu günlerde çoğu web sitesi vb, Facebook, Pinterest, sonsuz scrollers vardır.web siteleri kazımak

+2

Buradaki en iyi bahsiniz, bu sitenin API'lerini kullanmaktır - bu, şimdiye kadar, en kolay ve en güvenilir seçenek olacaktır. Bunun dışında, temel olarak tam bir tarayıcı çalıştıran JavaScript gibi işlemler yapmanız gerekecek - bu tür kütüphaneler var. –

+0

bir benzetim gibi geliyor, jscript'in bazı örneklerini işaret edebilir misiniz –

cevap

24

Selenium'u, twitter veya facebook gibi sonsuz kaydırmalı web sitesini silmek için kullanabilirsiniz.

Adım 1: pip

pip install selenium 

Adım 2 kullanılarak selenyum yükleyin: sonsuz kaydırmayı otomatikleştirmek için aşağıdaki kodu kullanabilirsiniz ve kaynak kodu

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support.ui import Select 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.common.exceptions import TimeoutException 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import NoSuchElementException 
from selenium.common.exceptions import NoAlertPresentException 
import sys 

import unittest, time, re 

class Sel(unittest.TestCase): 
    def setUp(self): 
     self.driver = webdriver.Firefox() 
     self.driver.implicitly_wait(30) 
     self.base_url = "https://twitter.com" 
     self.verificationErrors = [] 
     self.accept_next_alert = True 
    def test_sel(self): 
     driver = self.driver 
     delay = 3 
     driver.get(self.base_url + "https://stackoverflow.com/search?q=stckoverflow&src=typd") 
     driver.find_element_by_link_text("All").click() 
     for i in range(1,100): 
      self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
      time.sleep(4) 
     html_source = driver.page_source 
     data = html_source.encode('utf-8') 


if __name__ == "__main__": 
    unittest.main() 

Adım 3 ayıklamak: Gerekirse verileri yazdırın.

+0

Döngü, 100 kez aşağı kaydırdığımız anlamına mı geliyor? 100 rastgele seçilmiş bir sayıdır. Bu doğru mu? –

+0

@satarupa Haklısınız, döngü 100 kez aşağı kaydırmaktır –

20

Sonsuz kaydırma özelliğine sahip sitelerin çoğu (Lattyware notları gibi) düzgün bir API'ye sahiptir ve siz de bu işlemi, daha iyi kazıma yerine kullanarak daha iyi sunacaksınız.

Ama kazımak gerekiyorsa

...

tür siteler sayfanın dibine ulaştığında sitesinden ek içerik istemek için JavaScript kullanıyor. Tek yapmanız gereken bu ek içeriğin URL'sini bulmak ve onu geri alabilirsiniz. Gerekli URL'yi bulmak, komut dosyasını denetleyerek, Firefox Web konsolunu kullanarak veya bir debug proxy kullanarak yapılabilir. Örneğin, Firefox Web Konsolu'nu açın, Net dışındaki tüm filtre düğmelerini kapatın ve kazımak istediğiniz siteyi yükleyin. Tüm dosyaları yüklendikçe göreceksiniz. Web Konsolu'nu izlerken sayfayı kaydırın ve ek istekler için kullanılan URL'leri göreceksiniz. Sonra bu URL'yi kendiniz isteyebilir ve verilerin hangi formatta olduğunu (muhtemelen JSON) görebilir ve Python betiğinize alabilirsiniz.

+0

Lütfen bunu nasıl yapacağınıza dair somut bir örnek verebilir misiniz? – tatsuhirosatou

+0

Biraz daha ayrıntı ekledim, umarım yardımcı olur! – kindall

1

ajax kaynağının URL'sini bulmak en iyi seçenek olacaktır, ancak belirli siteler için hantal olabilir. Alternatif olarak QWebKit gibi başsız bir tarayıcıyı PyQt'dan kullanabilir ve DOM ağacındaki verileri okurken klavye olayları gönderebilirsiniz. QWebKit, güzel ve basit bir api'ye sahiptir.

İlgili konular