- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 scrapy-splash 来获取目标页面的 html 和屏幕截图 png。我需要能够以编程方式调用它。根据spashy doc ,指定
endpoint='render.json'
并传递参数
'png': 1
应该生成一个带有 .data 属性的响应对象('scrapy_splash.response.SplashJsonResponse'),该属性包含表示目标页面的 png 屏幕截图的解码 JSON 数据。
当蜘蛛(此处名为“搜索”)被调用时
scrapy crawl search
结果符合预期,response.data['png'] 包含 png 数据。
但是,如果通过 scrapy 的 CrawlerProcess 调用它,则会返回不同的响应对象:'scrapy.http.response.html.HtmlResponse'。该对象不具有 .data 属性。
代码如下:
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy_splash import SplashRequest
import base64
RUN_CRAWLERPROCESS = False
if RUN_CRAWLERPROCESS:
from crochet import setup
setup()
class SpiderSearch(scrapy.Spider):
name = 'search'
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
def start_requests(self):
urls = ['https://www.google.com/search?q=test', ]
splash_args = {
'html': 1,
'png': 1,
'width': 1920,
'wait': 0.5,
'render_all': 1,
}
for url in urls:
yield SplashRequest(url=url, callback=self.parse, endpoint='render.json', args=splash_args, )
def parse(self, response):
print(type(response))
for result in response.xpath('//div[@class="r"]'):
url = str(result.xpath('./a/@href').extract_first())
yield {
'url': url
}
png_bytes = base64.b64decode(response.data['png'])
with open('google_results.png', 'wb') as f:
f.write(png_bytes)
splash_args = {
'html': 1,
'png': 1,
'width': 1920,
'wait': 2,
'render_all': 1,
'html5_media': 1,
}
# cue the subsequent url to be fetched (self.parse_result omitted here for brevity)
yield SplashRequest(url=url, callback=self.parse_result, endpoint='render.json', args=splash_args)
if RUN_CRAWLERPROCESS:
runner = CrawlerProcess({'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'})
#d = runner.crawl(SpiderSearch)
#d.addBoth(lambda _: reactor.stop())
#reactor.run()
runner.crawl(SpiderSearch)
runner.start()
重申:
RUN_CRAWLERPROCESS = False
并调用
scrapy crawl search
响应类型
class 'scrapy_splash.response.SplashJsonResponse'
但是设置
RUN_CRAWLERPROCESS = True
并使用 CrawlerProcess 运行脚本会产生类型响应
class 'scrapy.http.response.html.HtmlResponse'
(p.s.我在 ReactorNotRestartable 方面遇到了一些麻烦,因此采用了 this post 中描述的钩针,这似乎解决了问题。我承认我不明白为什么,但假设它不相关......)
关于如何调试这个有什么想法吗?
最佳答案
如果您将此代码作为独立脚本运行,则设置模块将永远不会被加载,并且您的抓取工具将不知道 Splashy 中间件(这就是添加您要添加的 .data
属性的内容)在 .parse
中引用)。
您可以通过调用 get_project_settings
并将结果传递给您的爬网程序,在脚本中加载这些设置:
from scrapy.utils.project import get_project_settings
# ...
project_settings = get_project_settings()
process = CrawlerProcess(project_settings)
关于python - scrapy-spash : SplashRequest response object differs between invocation by scrapy crawl vs CrawlerProcess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55084220/
场景: 具有多个蜘蛛的单个 scrapy 项目。 所有蜘蛛从脚本一起运行。 问题: 同一 namespace 中的所有日志消息。不可能知道哪个消息属于哪个蜘蛛。 在 scrapy 0.24 中,我在一
Scrapy 1.x documentation解释了有两种方法可以从脚本中运行 Scrapy 蜘蛛: 使用 CrawlerProcess 使用 CrawlerRunner 两者有什么区别?什么时候用
我在 python 中编写了一个脚本,使用 scrapy 从网站收集不同帖子的名称及其链接。当我从命令行执行我的脚本时,它可以完美运行。现在,我的意图是使用 CrawlerProcess() 运行脚本
将执行以下代码,创建没有错误的文件。但是,它没有保存到 json 文件中。 我关闭了 autothrottle,它在过去会干扰下载数据,但并没有解决问题。 Scrapy==1.4.0 class My
我有两个 CrawlerProcesses,每个都调用不同的蜘蛛。我想将自定义设置传递给这些进程之一以将蜘蛛的输出保存到 csv,我想我可以这样做: storage_settings = {'FEED
我有一些看起来像这样的代码: def run(spider_name, settings): runner = CrawlerProcess(settings) runner.craw
我正在从另一个脚本运行 scrapy 蜘蛛,我需要从 Crawler 检索并保存到变量统计信息。我查看了文档和其他 StackOverflow 问题,但未能解决此问题。 这是我运行爬行的脚本: imp
我正在尝试通过脚本以编程方式调用蜘蛛。我无法使用 CrawlerProcess 通过构造函数覆盖设置。让我用默认的爬虫来说明这一点,它用于从官方 scrapy 站点(最后一个代码片段在 officia
我想使用 scrapy-splash 来获取目标页面的 html 和屏幕截图 png。我需要能够以编程方式调用它。根据spashy doc ,指定 endpoint='render.json' 并传递
我是一名优秀的程序员,十分优秀!