2015-06-17 22 views
3

我一直在試圖爲ebay(高校作業)構建一個小型刮板。我已經找出了大部分,但我遇到了一個問題,我的循環。在scrapy + selenium + phantomjs中循環問題

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 
from scrapy.http import Request 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.common.by import By 
from loop.items import loopitems 

class myProjectSpider(CrawlSpider): 
name = 'looper' 
allowed_domains = ['ebay.com'] 
start_urls = [l.strip() for l in open('bobo.txt').readlines()] 

def __init__(self): 
    service_args = ['--load-images=no',] 
    self.driver = webdriver.PhantomJS(executable_path='/Users/localhost/desktop/.bin/phantomjs.cmd', service_args=service_args) 

def parse(self, response): 
    self.driver.get(response.url) 
    item = loopitems() 
    for abc in range(2,50): 
     abc = str(abc) 
     jackson = self.driver.execute_script("return !!document.evaluate('.//div[5]/div[2]/select/option[" + abc + "]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;") 
     if jackson == True: 
      item['title'] = self.driver.execute_script("return document.evaluate('.//div[5]/div[2]/select/option[" + abc + "]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.textContent;") 
      yield item 
     else: 
      break 

的URL(start_urls從txt文件分發):

http://www.ebay.com/itm/Mens-Jeans-Slim-Fit-Straight-Skinny-Fit-Denim-  Trousers-Casual-Pants-14-color-/221560999664?pt=LH_DefaultDomain_0&var=&hash=item3396108ef0 
http://www.ebay.com/itm/New-Apple-iPad-3rd-Generation-16GB-32GB-or-64GB-WiFi-Retina-Display-Tablet-/261749018535?pt=LH_DefaultDomain_0&var=&hash=item3cf1750fa7 

我運行scrapy版本0.24.6和phantomjs 2.0版。目標是去網址並從ebay表單中提取變體或屬性。 在循環開始處的if語句用於檢查元素是否存在,因爲如果selenium找不到元素,它將返回錯誤的標題錯誤。我也循環(yield item),因爲我需要在新行上的每個變體。我使用execute_script是因爲它比使用xpath獲取元素的seleniums快100倍。

我遇到的主要問題是scrapy返回項目結果的方式;如果我使用一個url作爲我的start_url,它的工作方式應該如此(它會以整齊的順序返回所有項目)。第二個我添加更多的網址,我得到了完全不同的結果,我的所有物品都是亂碼,有些物品會多次返回,它幾乎每次都會發生變化。經過無數測試後,我注意到屈服項目導致了某種問題;所以我刪除它,並試圖只是打印結果,並確信它完美地返回它們。儘管我真的需要在新的一行上添加每個項目,但唯一的方法是使用yield項目(也許有更好的方法?)。

截至目前我剛剛複製粘貼更改手動xpath選項的循環代碼。它可以像預期的那樣工作,但我真的需要能夠在將來循環使用項目。如果有人在我的代碼中看到錯誤或者嘗試更好的方法,請告訴我。所有的反應都是有益的......

感謝

回答

1

如果我理解正確的,你想要做什麼,我覺得這個可以幫助你的。

Scrapy Crawl URLs in Order

的問題是,start_urls不按順序處理。它們被傳遞給start_requests方法,並返回一個下載的解析方法響應。這是異步的。

也許這有助於

#Do your thing 
start_urls = [open('bobo.txt').readlines()[0].strip()] 
other_urls = [l.strip() for l in open('bobo.txt').readlines()[1:]] 
other_urls.reverse() 

#Do your thing 
def parse(self, response): 

    #Do your thing 
    if len(self.other_urls) != 0 
     url = self.other_urls.pop() 
     yield Request(url=url, callback=self.parse) 
+1

感謝您Bzisch響應工作令我在正確的道路上。在嘗試瞭解決方案後,我能夠按順序刪除網址,但我的一些結果仍不準確,因此將抓取順序從DFO更改爲BFO,並激活了Dupefilter_Debug(因爲有些結果正在重複)。現在它的工作就像一個魅力。 – therealdeal