2016-04-11 6 views
1

JavaScriptレンダリングされたページをクロールしようとして問題が発生しました。Pythonクロールペーストビン(JavaScriptレンダリングされたWebページ)

私はこのチュートリアル以下、のpython-のqt4モジュールを使用しています:チュートリアルでhttps://impythonist.wordpress.com/2015/01/06/ultimate-guide-for-scraping-javascript-rendered-web-pages/

、すべては例のページで完璧に動作します:http://pycoders.com/archive

しかし、私はこれで、ペーストビンでこれをしようとしていますURL:私は何をしようとしています

http://pastebin.com/search?q=ssh

(私は私が何を知っていないそれらをクリックするために、すべてのリンクを取得するだけでなく、ページをたどることができるようにすることですまだ使用するつもり、おそらくScrapyが、私は他のオプションを見てみたい)。

問題は、私はリンクを抽出することはできませんよということで、これは私のコードです:

import sys 
from PyQt4.QtGui import * 
from PyQt4.QtCore import * 
from PyQt4.QtWebKit import * 
from lxml import html 

#Take this class for granted.Just use result of rendering. 
class Render(QWebPage): 
    def __init__(self, url): 
    self.app = QApplication(sys.argv) 
    QWebPage.__init__(self) 
    self.loadFinished.connect(self._loadFinished) 
    self.mainFrame().load(QUrl(url)) 
    self.app.exec_() 

    def _loadFinished(self, result): 
    self.frame = self.mainFrame() 
    self.app.quit() 

url = 'http://pastebin.com/search?q=ssh' 
r = Render(url) 
result = r.frame.toHtml() 
formatted_result = str(result.toAscii()) 
tree = html.fromstring(formatted_result) 
archive_links = tree.xpath('//a[@class="gs-title"]/@data-ctoring') 
for i in archive_links: 
    print i 

結果は次のとおりです。私は何も得ることはありません。

答えて

2

Pastebin APIを使用するのが理想的です。Python wrapperです。

代わりの方法は、seleniumを使用したブラウザの自動化を伴います。検索結果のリンクを表示する作業コード:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 


driver = webdriver.Firefox() 
driver.get("http://pastebin.com/search?q=ssh") 

# wait for the search results to be loaded 
wait = WebDriverWait(driver, 10) 
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".gsc-result-info"))) 

# get all search results links 
for link in driver.find_elements_by_css_selector(".gsc-results .gsc-result a.gs-title"): 
    print(link.get_attribute("href")) 
+0

このソリューションはかなり良いです。どうやって10ページに渡ってURLを抽出できますか?基本的に、物事をクリックする方法。ありがとうございました – aDoN

+0

ところで、私はこの行が何をしているのかよくわかりません: 'wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR、" .gsc-result-info ")))' – aDoN

+0

@aDoNフォローアップ問題のために別の質問。この行は、特定の要素が表示されるのを待つのに役立ちます。http://selenium-python.readthedocs.org/waits.html#explicit-waitsを参照してください。ありがとう。 – alecxe