Scrapy 将返回的项目存储在变量中以在主脚本中使用
Scrapy store returned items in variables to use in main script
我是 Scrapy 的新手,想尝试以下方法:
从网页中提取一些值,将其存储在变量中并在我的主脚本中使用它。
因此,我遵循了他们的教程并为我的目的更改了代码:
import scrapy
from scrapy.crawler import CrawlerProcess
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/'
]
custom_settings = {
'LOG_ENABLED': 'False',
}
def parse(self, response):
global title # This would work, but there should be a better way
title = response.css('title::text').extract_first()
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
process.crawl(QuotesSpider)
process.start() # the script will block here until the crawling is finished
print(title) # Verify if it works and do some other actions later on...
到目前为止这会起作用,但我很确定这不是一个好的样式,如果我将 title 变量定义为全局变量,甚至会有一些不好的副作用。
如果我跳过那一行,那么我当然会得到 "undefined variable" 错误:/
因此,我正在寻找一种方法来 return 变量并在我的主脚本中使用它。
我已经阅读了关于物品管道的内容,但我无法让它发挥作用。
非常感谢 help/ideas :)
提前致谢!
制作一个变量 global
应该可以满足您的需要,但正如您提到的那样,它的风格不佳。
我实际上建议使用不同的服务来进行进程间的通信,例如 Redis,这样您的蜘蛛程序和任何其他进程之间就不会发生冲突。
设置和使用非常简单,文档中有 very simple example.
在蜘蛛内部实例化 redis 连接,并在主进程上再次实例化(将它们视为单独的进程)。蜘蛛设置变量,主进程读取(或get
s)信息。
如您所知,使用 global
并不是一个好的风格,尤其是当您需要扩展您的需求时。
我的建议是将标题存储到文件或列表中并在您的主进程中使用它,或者如果您想在其他脚本中处理标题,那么只需打开文件并在您的脚本中读取标题
(注意:请忽略缩进问题)
spider.py
import scrapy
from scrapy.crawler import CrawlerProcess
namefile = 'namefile.txt'
current_title_session = []#title stored in current session
file_append = open(namefile,'a',encoding = 'utf-8')
try:
title_in_file = open(namefile,'r').readlines()
except:
title_in_file = open(namefile,'w')
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/'
]
custom_settings = {
'LOG_ENABLED': 'False',
}
def parse(self, response):
title = response.css('title::text').extract_first()
if title +'\n' not in title_in_file and title not in current_title_session:
file_append.write(title+'\n')
current_title_session.append(title)
if __name__=='__main__':
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
process.crawl(QuotesSpider)
process.start() # the script will block here until the crawling is finished
我是 Scrapy 的新手,想尝试以下方法: 从网页中提取一些值,将其存储在变量中并在我的主脚本中使用它。 因此,我遵循了他们的教程并为我的目的更改了代码:
import scrapy
from scrapy.crawler import CrawlerProcess
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/'
]
custom_settings = {
'LOG_ENABLED': 'False',
}
def parse(self, response):
global title # This would work, but there should be a better way
title = response.css('title::text').extract_first()
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
process.crawl(QuotesSpider)
process.start() # the script will block here until the crawling is finished
print(title) # Verify if it works and do some other actions later on...
到目前为止这会起作用,但我很确定这不是一个好的样式,如果我将 title 变量定义为全局变量,甚至会有一些不好的副作用。 如果我跳过那一行,那么我当然会得到 "undefined variable" 错误:/ 因此,我正在寻找一种方法来 return 变量并在我的主脚本中使用它。
我已经阅读了关于物品管道的内容,但我无法让它发挥作用。
非常感谢 help/ideas :) 提前致谢!
制作一个变量 global
应该可以满足您的需要,但正如您提到的那样,它的风格不佳。
我实际上建议使用不同的服务来进行进程间的通信,例如 Redis,这样您的蜘蛛程序和任何其他进程之间就不会发生冲突。
设置和使用非常简单,文档中有 very simple example.
在蜘蛛内部实例化 redis 连接,并在主进程上再次实例化(将它们视为单独的进程)。蜘蛛设置变量,主进程读取(或get
s)信息。
如您所知,使用 global
并不是一个好的风格,尤其是当您需要扩展您的需求时。
我的建议是将标题存储到文件或列表中并在您的主进程中使用它,或者如果您想在其他脚本中处理标题,那么只需打开文件并在您的脚本中读取标题
(注意:请忽略缩进问题)
spider.py
import scrapy
from scrapy.crawler import CrawlerProcess
namefile = 'namefile.txt'
current_title_session = []#title stored in current session
file_append = open(namefile,'a',encoding = 'utf-8')
try:
title_in_file = open(namefile,'r').readlines()
except:
title_in_file = open(namefile,'w')
class QuotesSpider(scrapy.Spider):
name = "quotes"
start_urls = [
'http://quotes.toscrape.com/page/1/'
]
custom_settings = {
'LOG_ENABLED': 'False',
}
def parse(self, response):
title = response.css('title::text').extract_first()
if title +'\n' not in title_in_file and title not in current_title_session:
file_append.write(title+'\n')
current_title_session.append(title)
if __name__=='__main__':
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
process.crawl(QuotesSpider)
process.start() # the script will block here until the crawling is finished