2013-07-31 59 views
45

我試圖從網頁上刮取產品信息,使用scrapy。我要被刮的網頁看起來是這樣的:硒與scrapy動態頁面

  • 開始與所屬類別頁面有10個產品
  • 「下一步」按鈕載入點擊下一個10個產品(URL不會在兩個頁面之間切換)
  • 我使用LinkExtractor關注各產品鏈接到產品頁面,並獲得所有的信息,我需要

我試圖複製下一個按鈕Ajax的電話,但無法得到工作,所以我給硒試一試。我可以在單獨的腳本中運行selenium的webdriver,但我不知道如何與scrapy集成。我應該在哪裏將硒元素放入我的scrapy蜘蛛?

我的蜘蛛是非常標準的,像下面這樣:

class ProductSpider(CrawlSpider): 
    name = "product_spider" 
    allowed_domains = ['example.com'] 
    start_urls = ['http://example.com/shanghai'] 
    rules = [ 
     Rule(SgmlLinkExtractor(restrict_xpaths='//div[@id="productList"]//dl[@class="t2"]//dt'), callback='parse_product'), 
     ] 

    def parse_product(self, response): 
     self.log("parsing product %s" %response.url, level=INFO) 
     hxs = HtmlXPathSelector(response) 
     # actual data follows 

任何想法表示讚賞。謝謝!

回答

78

這實際上取決於您如何需要刮取網站以及您想要如何以及如何獲得數據。

下面是一個例子如何使用Scrapy + Selenium遵循易趣分頁:

import scrapy 
from selenium import webdriver 

class ProductSpider(scrapy.Spider): 
    name = "product_spider" 
    allowed_domains = ['ebay.com'] 
    start_urls = ['http://www.ebay.com/sch/i.html?_odkw=books&_osacat=0&_trksid=p2045573.m570.l1313.TR0.TRC0.Xpython&_nkw=python&_sacat=0&_from=R40'] 

    def __init__(self): 
     self.driver = webdriver.Firefox() 

    def parse(self, response): 
     self.driver.get(response.url) 

     while True: 
      next = self.driver.find_element_by_xpath('//td[@class="pagn-next"]/a') 

      try: 
       next.click() 

       # get the data and write it to scrapy items 
      except: 
       break 

     self.driver.close() 

這裏是 「硒蜘蛛」 的一些例子:


還有具有使用SeleniumScrapy的替代方案。在某些情況下,使用ScrapyJS middleware就足以處理頁面的動態部分。樣品真實世界的用法:

+0

感謝您的幫助。其實我最大的問題是在next.click()之後的部分。每次我收到一個新頁面,但是我仍然可以使用LinkExtractor提取所有產品網址,然後使用回調來解析它們? –

+2

有沒有辦法重新使用已被scrapy抓取的響應,而不是使用'self.driver.get(response.url)'? – Ethereal

+0

@ Z.Lin是你描述的問題還存在嗎?如果你已經解決了問題,你可以分享解決方案嗎?謝謝。另外,如果它有幫助,請考慮接受答案。 – alecxe