我想提取产品的信息,从亚马逊网站与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
1条答案
按热度按时间1mrurvl11#
如果您使用开发者工具(例如Chrome)在浏览器中查看结果网站的源代码,您可以看到您的代码
只返回一个元素。这是因为所有的结果都在同一个
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
。