我想通过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
答案 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
。