【问题标题】:Facing scrapy selenium issues while using SeleniumRequest使用 SeleniumRequest 时遇到棘手的硒问题
【发布时间】:2019-05-21 21:23:31
【问题描述】:

我编写了一个非常小的脚本,使用 scrapy 结合 selenium 并利用 scrapy-selenium 库从网页中解析不同餐厅的名称。

我的settings.py 文件包含:

from shutil import which

SELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = which("chromedriver")

我的蜘蛛包含:(在 crawlerprocess 中使用的中间件引用)

import scrapy
from scrapy.utils.project import get_project_settings
from scrapy.crawler import CrawlerProcess
from scrapy_selenium import SeleniumRequest

class YPageSpider(scrapy.Spider):
    name = "yellowpages"
    link = 'https://www.yellowpages.com/search?search_terms=Pizza+Hut&geo_location_terms=San+Francisco%2C+CA'

    def start_requests(self):
        yield SeleniumRequest(url=self.link,callback=self.parse)

    def parse(self,response):
        for elem in response.css(".v-card .info a.business-name::attr(href)").getall():
            yield {"links":elem}

if __name__ == '__main__':
    settings = get_project_settings()
    settings['DOWNLOADER_MIDDLEWARES'] = {'scrapy_selenium.SeleniumMiddleware':800}
    c = CrawlerProcess(settings)
    c.crawl(YPageSpider)
    c.start()

但是,当我运行我的脚本并浏览 downloader middlewares 列表时,我可以看到 scrapy_selenium.SeleniumMiddleware 引用没有被激活。

如何才能成功?

我得到的回溯:

2019-05-22 18:03:57 [scrapy.utils.log] INFO: Scrapy 1.6.0 started (bot: proxyspider)
2019-05-22 18:03:57 [scrapy.utils.log] INFO: Versions: lxml 4.3.1.0, libxml2 2.9.5, cssselect 1.0.3, parsel 1.5.1, w3lib 1.20.0, Twisted 18.9.0, Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:06:47) [MSC v.1914 32 bit (Intel)], pyOpenSSL 19.0.0 (OpenSSL 1.1.1a  20 Nov 2018), cryptography 2.5, Platform Windows-7-6.1.7601-SP1
2019-05-22 18:03:57 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'proxyspider', 'NEWSPIDER_MODULE': 'proxyspider.spiders', 'SPIDER_MODULES': ['proxyspider.spiders']}
2019-05-22 18:03:57 [scrapy.extensions.telnet] INFO: Telnet Password: f7cd144cc88f20f6
2019-05-22 18:03:57 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
Unhandled error in Deferred:
2019-05-22 18:03:57 [twisted] CRITICAL: Unhandled error in Deferred:

Traceback (most recent call last):
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy\crawler.py", line 172, in crawl
    return self._crawl(crawler, *args, **kwargs)
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy\crawler.py", line 176, in _crawl
    d = crawler.crawl(*args, **kwargs)
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\twisted\internet\defer.py", line 1613, in unwindGenerator
    return _cancellableInlineCallbacks(gen)
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\twisted\internet\defer.py", line 1529, in _cancellableInlineCallbacks
    _inlineCallbacks(None, g, status)
--- <exception caught here> ---
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\twisted\internet\defer.py", line 1418, in _inlineCallbacks
    result = g.send(result)
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy\crawler.py", line 80, in crawl
    self.engine = self._create_engine()
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy\crawler.py", line 105, in _create_engine
    return ExecutionEngine(self, lambda _: self.stop())
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy\core\engine.py", line 69, in __init__
    self.downloader = downloader_cls(crawler)
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy\core\downloader\__init__.py", line 88, in __init__
    self.middleware = DownloaderMiddlewareManager.from_crawler(crawler)
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy\middleware.py", line 53, in from_crawler
    return cls.from_settings(crawler.settings, crawler)
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy\middleware.py", line 35, in from_settings
    mw = create_instance(mwcls, settings, crawler)
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy\utils\misc.py", line 140, in create_instance
    return objcls.from_crawler(crawler, *args, **kwargs)
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy_selenium\middlewares.py", line 71, in from_crawler
    browser_executable_path=browser_executable_path
  File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy_selenium\middlewares.py", line 43, in __init__
    for argument in driver_arguments:
builtins.TypeError: 'NoneType' object is not iterable

Full traceback available here

【问题讨论】:

  • 诚实的问题:如果普通的 scrapy 似乎能够得到你需要的东西,你为什么要使用 selenium?
  • 脚本中使用的 url 只是一个占位符。
  • 尝试将您的设置复制到蜘蛛的custom_settings 属性中,看看它们是否有效。另外,检查日志,一开始它应该指出哪些设置被覆盖,所以你的设置应该被列出。如果列出了它们,但您仍然遇到相同的错误,则可能是设置的值有问题,而错误只是误导。
  • which("chromedriver") 是否有可能返回 None?您是否检查了日志行中有关覆盖设置的设置?
  • 它显示2019-05-22 15:54:15 [scrapy.crawler] INFO: Overridden settings: {},因此您的设置不会被拾取。你试过直接在蜘蛛上使用custom_settings吗?

标签: python python-3.x selenium web-scraping scrapy


【解决方案1】:

File "C:\Users\WCS\AppData\Local\Programs\Python\Python37-32\lib\site-packages\scrapy_selenium\middlewares.py" line 43, in __init__ for argument in driver_arguments: builtins.TypeError: 'NoneType' object is not >iterable

根据line 43 的 github 源,您的应用程序尝试从 'SELENIUM_DRIVER_ARGUMENTS' 设置中读取数据,这是 selenium 中间件所必需的,并且未在您的代码中显示。

【讨论】:

  • 感谢@Georgiy 的指点。我永远不可能发现它。如果您能在 cmets 中指导我如何在本地克隆 scrapy-selenium 代码,我将非常高兴。这个克隆的东西对我来说完全陌生。谢谢。
  • 由于scrapy-selenium项目的文件数量相对较少,您只需将http.pymiddlewares.py的两个文件的源代码复制/粘贴到您的项目中即可。
猜你喜欢
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
相关资源
最近更新 更多