2017-06-14 22 views
1

リンクに移動してJavascriptコンテンツが読み込まれるのを待つWebクローラーを作成しようとしています。次に、次のページに進む前に、リストされた記事へのすべてのリンクを取得する必要があります。問題は、最初のURL( "https://techcrunch.com/search/heartbleed")から私が与えたものに従うのではなく、いつも擦ってしまうことです。なぜ私はreqeustsで渡された新しいURLから次のコードを削り取らないのですか?見つかったすべてのリンクにPython Scrapy - Selenium - 次のページをリクエストしています

for elem in hreflist : 
     print(elem) 
     yield scrapy.Request(url=elem , callback=self.parse_content) 

このコード降伏scrapy要求:私は

import scrapy 
from scrapy.http.request import Request 
from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 
from selenium.webdriver.support.ui import WebDriverWait 
import time 


class TechcrunchSpider(scrapy.Spider): 
    name = "techcrunch_spider_performance" 
    allowed_domains = ['techcrunch.com'] 
    start_urls = ['https://techcrunch.com/search/heartbleed'] 



    def __init__(self): 
     self.driver = webdriver.PhantomJS() 
     self.driver.set_window_size(1120, 550) 
     #self.driver = webdriver.Chrome("C:\Users\Daniel\Desktop\Sonstiges\chromedriver.exe") 
     self.driver.wait = WebDriverWait(self.driver, 5) #wartet bis zu 5 sekunden 

    def parse(self, response): 
     start = time.time()  #ZEITMESSUNG 
     self.driver.get(response.url) 

     #wartet bis zu 5 sekunden(oben definiert) auf den eintritt der condition, danach schmeist er den TimeoutException error 
     try:  

      self.driver.wait.until(EC.presence_of_element_located(
       (By.CLASS_NAME, "block-content"))) 
      print("Found : block-content") 

     except TimeoutException: 
      self.driver.close() 
      print(" block-content NOT FOUND IN TECHCRUNCH !!!") 


     #Crawle durch Javascript erstellte Inhalte mit Selenium 

     ahref = self.driver.find_elements(By.XPATH,'//h2[@class="post-title st-result-title"]/a') 

     hreflist = [] 
     #Alle Links zu den jeweiligen Artikeln sammeln 
     for elem in ahref : 
      hreflist.append(elem.get_attribute("href")) 


     for elem in hreflist : 
      print(elem) 
      yield scrapy.Request(url=elem , callback=self.parse_content) 


     #Den link fuer die naechste seite holen 
     try:  
      next = self.driver.find_element(By.XPATH,"//a[@class='page-link next']") 
      nextpage = next.get_attribute("href") 
      print("JETZT KOMMT NEXT :") 
      print(nextpage) 
      #newresponse = response.replace(url=nextpage) 
      yield scrapy.Request(url=nextpage, dont_filter=False) 

     except TimeoutException: 
      self.driver.close() 
      print(" NEXT NOT FOUND(OR EOF) IM CLOSING MYSELF !!!") 



     end = time.time() 
     print("Time elapsed : ") 
     finaltime = end-start 
     print(finaltime) 


    def parse_content(self, response):  
     title = self.driver.find_element(By.XPATH,"//h1") 
     titletext = title.get_attribute("innerHTML") 
     print(" h1 : ") 
     print(title) 
     print(titletext) 

答えて

1

一つの第一の問題は、それだろう...アイデアの出ています。しかし:

def parse_content(self, response):  
    title = self.driver.find_element(By.XPATH,"//h1") 
    titletext = title.get_attribute("innerHTML") 

parse_content関数は、ページを解析するためにドライバを使用しようとします。あなたはscrapyからレスポンス要素を解析するか、ウェブドライバでページを読み込めます(self.driver.get(....))

さらに、治療は非同期であり、セレンはありません。 scrapy yield requestの後にブロックする代わりに、コードはねじれてビルドされ、複数の同時リクエストを起動できるので、コードを実行し続けます。セレンドライバインスタンスは、複数の同時処理要求を処理できません。 (1つのリードは、セレンコードで各歩留まりを置き換えることです。実行時間を失うことがあっても)

+0

私はparse_contentにself.driver.get(...)を追加したので、今すぐh1-titleを取得できます。それでも、次のページに続くことはできません。セレンコードで歩留まりをどのように置き換えるべきですか?例がありますか?私は非常に治療やセレンを経験していません。ありがとう! – BlackBat

+0

関数の内容で 'yield scrapy.Request(url = elem、callback = self.parse_content)の行を置き換えてみてください。* parse_content * next_pageの問題では、解析機能(**の間に**次のページがある、smthgをする) – Pablo

関連する問題