如何用Scrapy和Selenium从Amazon网站中提取产品信息?

6qftjkof  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(148)

我想提取产品的信息,从亚马逊网站与Scrapy和 selenium 。
下面的源代码连接到亚马逊网站,然后执行搜索的字母“A”。然后我恢复搜索结果集的链接。但当我做了一个循环去到每一个搜索结果什么也没有发生(它只连接到第一个结果)。谢谢你帮助我纠正这段代码。
源代码“蜘蛛”

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()

源代码“管线”

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
1mrurvl1

1mrurvl11#

如果您使用开发者工具(例如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匹配的URL。
你也可以不用Selenium就能得到数据--即使你想搜索。

更新

上面的代码是为普通的Scrapy编写的,在这里你对响应应用xpath调用,而对于Selenium,它的工作方式有点不同,因为你会得到Selenium元素作为返回--但是在这些元素上你可以对列表中的那些元素应用find_elements_by_xpath

相关问题