我们一直在使用scrapy-splash中间件通过在Splashdocker容器内运行的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'没有任何改变.
感谢帮助.
到目前为止,我一直在使用scrapy和编写自定义类来处理使用ajax的网站.
但是,如果我使用scrapy-splash,根据我的理解,在javascript之后擦除渲染的html,我的爬虫的速度会受到显着影响吗?
用scrapy-splash刮擦香草html页面与scrapy vs javascript渲染html所需的时间之间的比较是什么?
最后,scrapy-splash和Selenium如何比较?
我有以下代码部分工作,
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()方法,但似乎并没有工作.我的代码出了什么问题?谢谢,
我想在文本输入字段中输入一个值,然后提交表单,并在表单提交后抓取页面上的新数据\n这怎么可能?
\n\n这是页面上的 html 表单。我想将输入值从 10 更改为 100 并提交表单
\n\n<form action="https://de.iss.fst.com/ba-u6-72-nbr-902-112-x-140-x-13-12-mm-simmerringr-ba-a-mit-feder-fst-40411416#product-offers-anchor" method="post" _lpchecked="1">\n <div class="fieldset">\n <div class="field qty">\n <div class="control">\n <label class="label" for="qty-2">\n <span>Preise f\xc3\xbcr</span>\n </label>\n <input type="text" name="pieces" class="validate-length maximum-length-10 qty" maxlength="12" id="qty-2" value="10">\n <label class="label" for="qty-2">\n <span>Teile</span>\n </label>\n <span class="actions">\n <button type="submit" title="Absenden" class="action">\n <span>Absenden</span>\n </button>\n </span>\n </div>\n </div>\n </div>\n </form>\nRun Code Online (Sandbox Code Playgroud)\n\n更新!\n新的工作代码。
\n\nimport scrapy\nimport pymongo\nfrom scrapy_splash import SplashRequest, SplashFormRequest\nfrom issfst.items import IssfstItem\n\n\nclass IssSpider(scrapy.Spider):\n name = "issfst_spider"\n start_urls = ["https://de.iss.fst.com/dichtungen/radialwellendichtringe/rwdr-mit-geschlossenem-kafig/ba"]\n custom_settings = {\n # specifies exported …Run Code Online (Sandbox Code Playgroud) 我正在使用 ScrapingHub 的云 Splash 实例。我正在尝试使用 Scrapy-Splash 库做一个简单的请求,但我不断收到错误消息:
@attr.s(hash=False, repr=False, eq=False)
TypeError: attrs() got an unexpected keyword argument 'eq'
Run Code Online (Sandbox Code Playgroud)
任何关于为什么会出现错误的想法/线索将不胜感激。
我使用的代码如下(使用 Python 3.6 和 Scrapy v 2.1.0):
import scrapy
from scrapy_splash import SplashRequest
class MySpider(scrapy.Spider):
start_urls = ['https://www.sportsgirl.com.au', 'http://maryons.com.au']
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(url, self.parse, args={'wait': 0.5})
def parse(self, response):
print(response)
MySpider().start_requests()
Run Code Online (Sandbox Code Playgroud)
和 settings.py 具有以下值:
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
SPLASH_URL = 'https://my-splash-url.scrapinghub.com'
Run Code Online (Sandbox Code Playgroud) 我是这里所有乐器的新手。我的目标是从许多页面中提取所有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) 我想使用 Scrapy Splash 加载本地 HTML 文件并将其另存为 PNG/JPEG,然后删除该 HTML 文件
script = """
splash:go(args.url)
return splash:png()
"""
resp = requests.post('http://localhost:8050/run', json={
'lua_source': script,
'url': 'file://my_file.html'
})
resp.content
Run Code Online (Sandbox Code Playgroud)
它返回我
加载页面失败(协议“”未知)网络错误 #301
我也试过
yield SplashRequest(url=filepath,
callback=self.parse_result,
meta={'filepath': filepath},
args={
'wait': 0.5,
'png': 1,
},
endpoint='render.html',
)
Run Code Online (Sandbox Code Playgroud)
但我得到
2020-04-23 12:07:41 [scrapy.downloadermiddlewares.retry] 调试:重试 http://localhost:8050/render.html>(失败 1 次):502 错误网关
我的步骤:
\ndocker build . -t scrapydocker run -it -p 8050:8050 --rm scrapyscrapy crawl foobar -o allobjects.json这在本地有效,但在我的生产服务器上我收到错误:
\n\n\n[scrapy.downloadermiddlewares.retry] DEBUG:重试 <GET https://www.example.com via http://localhost:8050/execute> (失败 1 次):连接被另一方拒绝:10061:无法连接之所以被制作,是因为目标机器主动拒绝了它。
\n
注意:我没有使用 Docker Desktop,也不能在此服务器上使用。
\nDockerfile
\nFROM mcr.microsoft.com/windows/servercore:ltsc2019\n\nSHELL ["powershell", "-Command", "$ErrorActionPreference = \'Stop\'; $ProgressPreference = \'SilentlyContinue\';"]\n\nRUN setx /M PATH $(\'C:\\Users\\ContainerAdministrator\\miniconda3\\Library\\bin;C:\\Users\\ContainerAdministrator\\miniconda3\\Scripts;C:\\Users\\ContainerAdministrator\\miniconda3;\' + $Env:PATH)\nRUN Invoke-WebRequest "https://repo.anaconda.com/miniconda/Miniconda3-py38_4.10.3-Windows-x86_64.exe" -OutFile miniconda3.exe -UseBasicParsing; \\\n Start-Process -FilePath \'miniconda3.exe\' -Wait -ArgumentList \'/S\', \'/D=C:\\Users\\ContainerAdministrator\\miniconda3\'; \\\n Remove-Item …Run Code Online (Sandbox Code Playgroud) scrapy-splash ×10
scrapy ×9
python ×7
web-scraping ×3
docker ×1
lua ×1
scrapy-shell ×1
selenium ×1
wait ×1
web-crawler ×1