【问题标题】:Scrapy + Selenium issueScrapy + Selenium 问题
【发布时间】:2018-02-04 10:16:03
【问题描述】:

我正在尝试使用 Selenium 和 Scrapy 抓取一家著名的英国零售商的网站(请参见下面的代码)。我收到了[scrapy.core.scraper] ERROR: Spider error processing 并且不知道还能做什么(已经工作了三个小时左右)。感谢大家的支持!

import scrapy
from selenium import webdriver
from nl_scrape.items import NlScrapeItem
import time

class ProductSpider(scrapy.Spider):
    name = "product_spider"
    allowed_domains = ['newlook.com']
    start_urls = ['http://www.newlook.com/uk/womens/clothing/c/uk-womens-clothing?comp=NavigationBar%7Cmn%7Cwomens%7Cclothing#/?q=:relevance&page=1&sort=relevance&content=false']

def __init__(self):
    self.driver = webdriver.Safari()
    self.driver.set_window_size(800,600)
    time.sleep(4)

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

    # Collect products
    products = driver.find_elements_by_class_name('plp-item ng-scope')

    # Iterate over products; extract data and append individual features to NlScrapeItem
    for item in products:

        # Pull features
        desc = item.find_element_by_class_name('product-item__name link--nounderline ng-binding').text
        href = item.find_element_by_class_name('plp-carousel__img-link ng-scope').get_attribute('href')

        # Price Symbol removal and integer conversion
        priceString = item.find_element_by_class_name('price ng-binding').text
        priceInt = priceString.split('£')[1]
        price = float(priceInt)

        # Generate a product identifier
        identifier = href.split('/p/')[1].split('?comp')[0]
        identifier = int(identifier)

        # datetime
        dt = date.today()
        dt = dt.isoformat()

        # NlScrapeItem
        item = NlScrapeItem()

        # Append product to NlScrapeItem
        item['id'] = identifier
        item['href'] = href
        item['description'] = desc
        item['price'] = price
        item['firstSighted'] = dt
        item['lastSighted'] = dt
        yield item

    self.driver.close()

2017-08-26 15:48:38 [scrapy.core.scraper] 错误:蜘蛛错误处理 http://www.newlook.com/uk/womens/clothing/c/uk-womens-clothing?comp =NavigationBar%7Cmn%7Cwomens%7Cclothing#/?q=:relevance&page=1&sort=relevance&content=false>(引用者:无)

Traceback(最近一次调用最后一次): _runCallbacks 中的文件“/Users/username/Documents/nl_scraping/nl_env/lib/python3.6/site-packages/twisted/internet/defer.py”,第 653 行 current.result = callback(current.result, *args, **kw) 解析中的文件“/Users/username/Documents/nl_scraping/nl_scrape/nl_scrape/spiders/product_spider.py”,第 18 行 products = driver.find_elements_by_class_name('plp-item ng-scope') NameError:名称“驱动程序”未定义

【问题讨论】:

  • 尝试使用 products = self.driver.find_elements_by_class_name('plp-item ng-scope') 看看它是否有效
  • @Kapil: 不幸的是没有运气:( ERROR: Spider error processing 占上风
  • 您的 safari 浏览器至少启动了吗?
  • @Kapil:是的,我之前在控制台中玩过 selenium 只是为了了解它,并且每一行代码都单独工作 - 只是 scrapy 的实现正在苦苦挣扎。您对使用中间件有什么想法吗? link - 我在想这个问题的答案。
  • @Kapil:非常感谢您的帮助!由于下面的解决方法,现在可以工作 - 鉴于 Tarun 的回答有效,您的想法显然非常接近!

标签: selenium web-scraping scrapy scrapy-spider


【解决方案1】:

所以你的代码有两个问题

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

    # Collect products
    products = driver.find_elements_by_class_name('plp-item ng-scope')

您将self.driver 更改为driver 非常方便。那样不行。您应该在函数顶部添加

def parse(self, response):
    driver = self.driver
    driver.get(response.url)
    time.sleep(4)

    # Collect products
    products = driver.find_elements_by_class_name('plp-item ng-scope')

接下来,您在函数末尾使用了self.driver.close()。因此,一旦您处理了一个 url,您将关闭浏览器。那是错的。所以删除那行。

【讨论】:

  • 就是这样 - 非常感谢 - 我不能投票,因为我的声誉仍然太低!
  • @Tarun Lalwani ,虽然这不是我的主题,但如果我能知道将那条线放在哪里self.driver.close(),我会非常高兴。谢谢。
  • @Shahin,你需要监听spider_closed 信号并在那里执行代码。这里有一个简单的例子来说明如何连接到该代码doc.scrapy.org/en/latest/topics/signals.html
  • 非常感谢。你应该得到我的 +1。
  • @Tarun Lalwani,看起来我找到了一个解决方案,说明如何在完成后关闭 webdriver。只需将其放在 init 方法 def __del__(self):self.driver.close() 之后即可。
猜你喜欢
  • 2021-01-04
  • 2015-09-02
  • 2023-04-03
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多