我们一直在使用scrapy-splash
中间件通过在Splash
docker容器内运行的javascript引擎传递已删除的HTML源代码.
如果我们想在spider中使用Splash,我们配置几个必需的项目设置并产生一个Request
指定特定的meta
参数:
yield Request(url, self.parse_result, meta={
'splash': {
'args': {
# set rendering arguments here
'html': 1,
'png': 1,
# 'url' is prefilled from request url
},
# optional parameters
'endpoint': 'render.json', # optional; default is render.json
'splash_url': '<url>', # overrides SPLASH_URL
'slot_policy': scrapyjs.SlotPolicy.PER_DOMAIN,
}
})
Run Code Online (Sandbox Code Playgroud)
这有助于记录.但是,我们如何scrapy-splash
在Scrapy Shell中使用?
scrapy web-scraping scrapy-shell scrapy-splash splash-js-render
我试图在python中使用Splash for Scrapy抓取一些动态网站.但是,我发现Splash无法等待在某些情况下加载整个页面.解决这个问题的一种强力方法是增加一个大的wait
时间(例如,在下面的代码片段中为5秒).但是,这非常低效,仍然无法加载某些数据(有时加载内容需要超过5秒).是否存在可以通过这些请求进行某种等待的元素条件?
yield SplashRequest(
url,
self.parse,
args={'wait': 5},
'User-Agent':"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36",
}
)
Run Code Online (Sandbox Code Playgroud) 我使用scrapy-splash来抓取网页,并在docker上运行splash服务.
commond:
docker run -p 8050:8050 scrapinghub/splash --max-timeout 3600
Run Code Online (Sandbox Code Playgroud)
但我得到了504错误.
"error": {"info": {"timeout": 30}, "description": "Timeout exceeded rendering page", "error": 504, "type": "GlobalTimeoutError"}
Run Code Online (Sandbox Code Playgroud)
虽然我尝试添加splash.resource_timeout
,request:set_timeout
或者SPLASH_URL = 'http://localhost:8050?timeout=1800.0'
没有任何改变.
感谢帮助.
我有以下代码部分工作,
class ThreadSpider(CrawlSpider):
name = 'thread'
allowed_domains = ['bbs.example.com']
start_urls = ['http://bbs.example.com/diy']
rules = (
Rule(LinkExtractor(
allow=(),
restrict_xpaths=("//a[contains(text(), 'Next Page')]")
),
callback='parse_item',
process_request='start_requests',
follow=True),
)
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(url, self.parse_item, args={'wait': 0.5})
def parse_item(self, response):
# item parser
Run Code Online (Sandbox Code Playgroud)
代码只会运行start_urls
但不会遵循指定的链接restricted_xpaths
,如果我注释掉start_requests()
方法和process_request='start_requests',
规则中的行,它将运行并跟踪预期的链接,当然没有js渲染.
我已阅读了两个相关问题,CrawlSpider与飞溅卡住第一URL后和CrawlSpider飞溅和专变scrapy.Request()
向SplashRequest()
的start_requests()
方法,但似乎并没有工作.我的代码出了什么问题?谢谢,
我有水族馆和飞溅的问题.他们在开始后30分钟后停止工作.加载的页数为50K-80K.我做了cron工作,每10分钟自动重启一次,每个Splash容器,但它不起作用我该如何解决?
这是截图
来自HAProxy的统计数据
这是Splash配置
splash0:
image: scrapinghub/splash:3.0
command: --max-timeout 3600 --slots 150 --maxrss 1000 --verbosity 5
logging:
driver: "none"
expose:
- 8050
mem_limit: 1000m
memswap_limit: 1000m
restart: always
Run Code Online (Sandbox Code Playgroud)
和HAProxy
backend splash-cluster
option httpchk GET /
balance leastconn
# try another instance when connection is dropped
retries 2
option redispatch
server splash-0 splash0:8050 check maxconn 150 inter 2s fall 10 observe layer4
backend splash-misc
balance roundrobin
server splash-0 splash0:8050 check fall 15
Run Code Online (Sandbox Code Playgroud)
更新1 这是重启的脚本
#!/bin/sh
echo "BEGIN" >> restart.log
for index …
Run Code Online (Sandbox Code Playgroud) 我已经阅读了许多相关问题,但仍然不清楚如何做到这一点,因为有许多可用的软件组合,许多解决方案似乎已经过时.
在OSX上的虚拟环境中安装以下内容的最佳方法是:
我是否还必须安装GTK +和Webkit?如果是这样,怎么样?
还将欣赏关于这些软件如何协同工作的简单解释.
(我正在尝试使用需要这些库的scrapyjs)
我有一个使用splash的scrapy蜘蛛,该splash运行在Docker localhost:8050上以在渲染之前呈现JavaScript。我正在尝试在heroku上运行此程序,但不知道如何配置heroku以在运行我的Web之前启动docker运行闪屏:scrapy crawl abc dyno。非常感谢任何指导!
我是这里所有乐器的新手。我的目标是从许多页面中提取所有URL,而这些页面通过“ Weiter” /“ next”按钮(多个URL)连接得更多。我决定尝试一下。该页面是动态生成的。然后,我得知我需要另一台仪器,并为此安装了Splash。安装正在运行。我根据教程设置了安装。然后,我通过在搜索输入字段中发送“返回”来设法获得第一页。使用可以给我所需结果的浏览器。我的问题是,我尝试单击生成的页面上的“下一个”按钮,但不知道具体如何。正如我在几页上所读到的那样,这并不总是那么容易。我尝试了建议的解决方案,但没有成功。我想我不太远,希望能有所帮助。谢谢。
我的settings.py
BOT_NAME = 'gr'
SPIDER_MODULES = ['gr.spiders']
NEWSPIDER_MODULE = 'gr.spiders'
ROBOTSTXT_OBEY = True
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPLASH_URL = 'http://localhost:8050'
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
Run Code Online (Sandbox Code Playgroud)
我的蜘蛛:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy_splash import SplashRequest
import json
# import base64
class GrSpider(scrapy.Spider):
name = 'gr_'
allowed_domains = ['lawsearch.gr.ch']
start_urls = ['http://www.lawsearch.gr.ch/le/']
def start_requests(self):
script = """
function …
Run Code Online (Sandbox Code Playgroud) 我正在尝试抓取Google Scholar搜索结果,并获取与搜索匹配的每个结果的所有BiBTeX格式。现在,我有一个带有Splash的Scrapy爬虫。我有一个lua脚本,它将在获取href
BibTeX格式的引用之前单击“引用”链接并加载模式窗口。但是看到有多个搜索结果,因此有多个“引用”链接,我需要全部单击它们并加载各个BibTeX页面。
这是我所拥有的:
import scrapy
from scrapy_splash import SplashRequest
class CiteSpider(scrapy.Spider):
name = "cite"
allowed_domains = ["scholar.google.com", "scholar.google.ae"]
start_urls = [
'https://scholar.google.ae/scholar?q="thermodynamics"&hl=en'
]
script = """
function main(splash)
local url = splash.args.url
assert(splash:go(url))
assert(splash:wait(0.5))
splash:runjs('document.querySelectorAll("a.gs_nph[aria-controls=gs_cit]")[0].click()')
splash:wait(3)
local href = splash:evaljs('document.querySelectorAll(".gs_citi")[0].href')
assert(splash:go(href))
return {
html = splash:html(),
png = splash:png(),
href=href,
}
end
"""
def parse(self, response):
yield SplashRequest(self.start_urls[0], self.parse_bib,
endpoint="execute",
args={"lua_source": self.script})
def parse_bib(self, response):
filename = response.url.split("/")[-2] + '.html'
with open(filename, 'wb') as f:
f.write(response.css("body …
Run Code Online (Sandbox Code Playgroud) 我想在Google App Engine中使用Scrapy + Splash抓取一个javascript网站。Splash插件是Docker映像。有什么方法可以在Google App Engine中使用它吗?App Engine本身使用Docker映像,但是我不确定如何加载和访问辅助映像(使用Splash的方式)。这是Splash安装说明
google-app-engine scrapy docker scrapy-splash splash-js-render
splash-js-render ×10
scrapy ×9
python ×6
docker ×3
gtk ×1
haproxy ×1
heroku ×1
lua ×1
scrapy-shell ×1
wait ×1
web-crawler ×1
web-scraping ×1
webkit ×1