gpt4 book ai didi

python - Scrapy 在 "__init__"之后不调用任何其他函数

转载 作者:行者123 更新时间:2023-11-28 22:33:06 25 4
gpt4 key购买 nike

操作系统:Ubuntu 16.04堆栈 - Scrapy 1.0.3 + Selenium 我是 scrapy 的新手,这听起来很基础,但在我的蜘蛛中,只有“init”被执行。之后的任何代码/函数都不会被调用,蜘蛛就会停止。

class CancerForumSpider(scrapy.Spider):
name = "mainpage_spider"
allowed_domains = ["cancerforums.net"]
start_urls = [
"http://www.cancerforums.net/forums/14-Prostate-Cancer-Forum"
]

def __init__(self,*args,**kwargs):
self.browser=webdriver.Firefox()
self.browser.get("http://www.cancerforums.net/forums/14-Prostate-Cancer-Forum")
print "----------------Going to sleep------------------"
time.sleep(5)
# self.parse()

def __exit__(self):
print "------------Exiting----------"
self.browser.quit()

def parse(self,response):
print "----------------Inside Parse------------------"
print "------------Exiting----------"
self.browser.quit()

蜘蛛获取浏览器对象,打印“Going to sleep”然后停止。它不会进入解析函数。

enter image description here

运行日志内容如下:

----------------inside init---------------- ----------------Going to sleep------------------

最佳答案

您需要解决或注意一些问题:

  1. 你不是在调用 super()__init__ 方法期间,因此不会发生任何继承类初始化。 Scrapy 不会做任何事情(比如调用它的 parse() 方法),因为所有这些都在 scrapy.Spider 中设置。

  2. 修复上述问题后,您的parse() 方法将被Scrapy 调用,但不会在您的Selenium 获取的网页上运行。它对此一无所知,并将重新获取 url(基于 start_urls)。这两个来源很可能会有所不同(通常是截然不同的)。

  3. 您将按原样使用 Selenium 绕过 Scrapy 的几乎所有功能。 Selenium 的所有 get() 都将在 Scrapy 框架之外执行。不会应用中间件(cookie、节流、过滤等),也不会用数据填充任何预期/创建的对象(如 requestresponse)你期待的。

在解决所有这些问题之前,您应该考虑几个更好的选择/备选方案:

  • 创建一个下载器中间件来处理所有与“Selenium”相关的功能。让它在 request 对象到达下载器之前拦截它们,填充一个新的 response 对象并返回它们以供蜘蛛处理。
    这不是最优的,因为你实际上是在创建自己的下载器,并使 Scrapy 的下载器短路。您必须重新实现对下载程序通常考虑的任何所需设置的处理,并使它们与 Selenium 一起使用。
  • 放弃 Selenium,使用 Splash HTTP 和 scrapy-splash 中间件来处理 Javascript。
  • 一起抛弃 Scrapy,只使用 Selenium 和 BeautifulSoup。

关于python - Scrapy 在 "__init__"之后不调用任何其他函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40274984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com