如何使用Scrapy和Selenium从亚马逊网站上提取产品信息?

时间:2015-07-20 19:48:05

标签: selenium scrapy amazon

我想通过Scrapy和Selenium从亚马逊网站上提取产品信息 以下源代码连接到亚马逊网站,然后通过字母" A"进行搜索。 然后我恢复了搜索结果集的链接。但是当我做一个循环去搜索结果中的每一个时都没有任何反应(它只是连接到第一个结果)。 感谢您帮我纠正此代码。

源代码" Spider"

    from scrapy.contrib.spiders import CrawlSpider
    from selenium import webdriver
    from selenium.webdriver.support.select import Select
    from time import sleep
    import selenium.webdriver.support.ui as ui
    from scrapy.xlib.pydispatch import dispatcher
    #from runner.items import RunnerItem
    from extraction.items import ProduitItem
    class RunnerSpider(CrawlSpider):
      name = 'products'
      allowed_domains = ['amazon.com']
      start_urls = ['http://www.amazon.com']

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

      def parse(self, response): 
        items = []       
        self.driver.get(response.url)
        recherche = self.driver.find_element_by_xpath('//*[@id="twotabsearchtextbox"]')
        recherche.send_keys("A")
        recherche.submit()
        #time.sleep(2.5)

        # all search results links
        resultas = self.driver.find_elements_by_xpath('//ul[@id="s-results-list-atf"]/li/div/div/div/div[2]/div[1]/a')

        for result in resultas:
          item = ProduitItem()
          lien = result
          lien.click()
          # exemple of data extracted 
          item['NOM'] = self.driver.find_element_by_xpath('//h1[@id="aiv-content-title"]').text()
          item['IMAGE'] = self.driver.find_element_by_xpath('//*[@id="dv-dp-left-content"]/div[1]/div/div/img/@src').text()
          items.append(item)

      self.driver.close()
      yield items

源代码"项目"

    # -*- coding: utf-8 -*-
    import scrapy
    class ProduitItem(scrapy.Item):
       NOM = scrapy.Field()
       IMAGE = scrapy.Field()

源代码" piplines"

    from scrapy.exceptions import DropItem
    class DuplicatesPipeline(object):
      def __init__(self):
        self.ids_seen=set()
      def process_item(self, item, spider):
        if item['id'] in self.ids_seen:
           raise DropItem("Duplicate item found: %s"%item)
        else:
           self.ids_seen.add(item['id'])
        return item

1 个答案:

答案 0 :(得分:0)

如果您使用开发者工具(例如在Chrome中)查看浏览器中结果网站的源代码,您可以看到您的代码

resultas = self.driver.find_elements_by_xpath('//ul[@id="s-results-list-atf"]/li/div/div/div/div[2]/div[1]/a')

只返回一个元素。这是因为所有结果都在同一个ul块中,您将获得第一个li元素。

您应该获取ul[@id="s-results-list-atf"]元素,然后使用element.xpath('//li')遍历每个列表项,然后获取详细信息站点的URL。或者,您可以跳过div的漫步,找到li块内的class匹配的网址。

即使您想搜索,也可以在没有Selenium的情况下获取数据。

<强>更新

上面的代码适用于普通的旧Scrapy,您可以在响应中应用xpath调用。 使用Selenium它的工作方式有点不同,因为你得到了Selenium元素 - 但是在这些元素上你可以在列表中的那些元素上应用find_elements_by_xpath