我正在练习使用Scrapy Webcrawler软件包,并提出了一个由两部分组成的问题,因为我在挣扎着一点儿想知道下一步该怎么做:
我有一个名为spider4Techcrunch.py
的脚本,其中包含以下代码:
import scrapy
from scrapy import cmdline
class TCSpider(scrapy.Spider):
name = "techcrunch"
def start_requests(self):
urls = [
"https://techcrunch.com/"
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
SET_SELECTOR = ".post-block__title"
output = "--BEGIN OUTPUT--"
print(output)
for data in response.css(SET_SELECTOR):
print('--BEGIN DATA--')
print(data)
TITLE_SELECTOR = "a ::text"
URL_SELECTOR = "a ::attr(href)"
yield {
'title': data.css(TITLE_SELECTOR).extract_first(),
'url':data.css(URL_SELECTOR).extract_first(),
}
scrapy.cmdline.execute("scrapy runspider spider4Techcrunch.py".split())
当我执行代码时,一切运行正常,并返回结果。我在yield
命令中苦苦挣扎。如何从KEY: VALUE
命令中提取"title": "url"
对的yield
对文本结果,以便可以将结果逐行保存到文本文件中?
代码的最后一行,这是执行它的正确方法吗?对我来说,我正在通过在同一文件中调用自身来执行scrapy代码,这看起来很奇怪。 是否有最佳实践/更好的方法? (请记住,我希望该类可用于多个URL。)
scrapy.cmdline.execute("scrapy runspider spider4Techcrunch.py".split())
答案 0 :(得分:1)
以脚本方式运行scrapy应用程序的首选方法-docs
您可以使用内置的feed exporters
在您的情况下,解决方案将是这样的(对于草率的2.1版):
import scrapy
from scrapy.crawler import CrawlerProcess
class TCSpider(scrapy.Spider):
name = "techcrunch"
def start_requests(self):
urls = [
"https://techcrunch.com/"
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
SET_SELECTOR = ".post-block__title"
output = "--BEGIN OUTPUT--"
print(output)
for data in response.css(SET_SELECTOR):
print('--BEGIN DATA--')
print(data)
TITLE_SELECTOR = "a ::text"
URL_SELECTOR = "a ::attr(href)"
yield {
'title': data.css(TITLE_SELECTOR).extract_first(),
'url':data.css(URL_SELECTOR).extract_first(),
}
process = CrawlerProcess(settings={
"FEEDS": {
"items.json": {"format": "json"},
#"items.jl": {"format": "jsonlines"},
},
})
process.crawl(TCSpider)
process.start()
答案 1 :(得分:0)
您可以使用项目管道来保存收益的结果
step1)您必须编写这样的项目管道
import functools
functools.reduce(lambda x, y: x + y, range(10))
step2)您必须修改设置。py
class PricePipeline:
vat_factor = 1.15
def process_item(self, item, spider):
if item.get('price'):
if item.get('price_excludes_vat'):
item['price'] = item['price'] * self.vat_factor
return item
else:
raise DropItem("Missing price in %s" % item)
更多信息请参考https://docs.scrapy.org/en/latest/topics/item-pipeline.html