javascript - 将 Scrapy spider 作为脚本运行不会获得所有代码,但来自项目的 scrapy spider 会
问题描述
我有一个简单的蜘蛛,它从页面上的脚本中抓取一些东西。
我像这样刮掉脚本
jsData = json.loads(response.xpath('//script[@type="application/ld+json"]//text()').extract_first())
当我从项目中的蜘蛛中运行它时,我会获取所有数据,但如果我从常规脚本而不是项目中运行它,它不会从脚本中获取所有数据。这是为什么?
这是我的脚本蜘蛛
import scrapy
import json
from scrapy.crawler import CrawlerProcess
class MySpider(scrapy.Spider):
name = "target"
start_urls = ['https://www.target.com/p/madden-nfl-22-xbox-one-series-x/-/A-83744898#lnk=sametab']
def parse(self, response):
jsData = json.loads(response.xpath('//script[@type="application/ld+json"]//text()').extract_first())
NAME_SELECTOR = jsData['@graph'][0]
yield {
'name': NAME_SELECTOR,
}
process = CrawlerProcess()
process.crawl(MySpider)
process.start()
它给了我
...'offers': {'@type': 'Offer', 'priceCurrency': 'USD', 'availability': 'InStock', 'availableDeliveryMethod': 'ParcelService', 'potentialAction': {'@type': 'BuyAction'}, 'url': 'https://www.target.com/p/madden-nfl-22-xbox-one-series-x/-/A-83744898'}}}
我的项目蜘蛛代码是
import scrapy
import json
class targetSpider(scrapy.Spider):
name = "target"
start_urls = ['https://www.target.com/p/madden-nfl-22-xbox-one-series-x/-/A-83744898#lnk=sametab']
def parse(self, response):
jsData = json.loads(response.xpath('//script[@type="application/ld+json"]//text()').extract_first())
test = jsData['@graph'][0]
yield {
'test': test
}
它给了我
...'offers': {'@type': 'Offer', 'price': '59.99', 'priceCurrency': 'USD', 'availability': 'PreOrder', 'availableDeliveryMethod': 'ParcelService', 'potentialAction': {'@type': 'BuyAction'}, 'url': 'https://www.target.com/p/madden-nfl-22-xbox-one-series-x/-/A-8
3744898'}}}
解决方案
这是关于javascript的。类似'price': '59.99'
的内容由 javascript 加载。并且Downloader
在 Scrapy 中默认不支持运行 javascript。
您的问题的可能原因
- 您的一个蜘蛛
settings.py
启用了一些外部下载器中间件(如 Selenium、Splash、Playwright),而另一个没有。 - 以 ,开头的脚本
CrawlerProcess()
没有在项目根目录下运行,导致settings.py
加载失败。
更新:对不起,我忘了我们需要在使用时手动加载设置CrawlerProcess()
。从脚本运行scrapy。
推荐阅读
- angular - 如果选择其他,如何在单击时仅突出显示一个扩展面板并重置
- python - 如何在记录器中写入张量流标志变量
- javascript - 替换数组数组中的空数组
- android - 如何使 CardView 在 BottomNavigationView 之外可见?
- makefile - 如何从包含管道和变量的命令中设置变量
- c# - dotnet core 是否具有与 Spring 中的 @PostConstruct 注释等效的功能?
- c# - 是什么导致以下向下转换失败?
- javascript - Nodejs:通过循环链接数组下载多个文件时出错
- apache-spark - 在一个 Spark-Python 中组合两列值
- angular - Angular 7 中的 [hidden] 和 [class.hide] 有什么区别?