标签: scrapy-splash

Scrapy壳和Scrapy飞溅

我们一直在使用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-splashScrapy Shell中使用

scrapy web-scraping scrapy-shell scrapy-splash splash-js-render

16
推荐指数
2
解决办法
7529
查看次数

在python Scrapy中执行SplashRequest时添加等待元素

我试图在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)

python wait scrapy scrapy-splash splash-js-render

11
推荐指数
1
解决办法
2731
查看次数

如何在scrapy-splash中设置启动超时?

我使用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'没有任何改变.

感谢帮助.

python scrapy scrapy-splash splash-js-render

9
推荐指数
1
解决办法
2626
查看次数

使用scrapy-splash是否会显着影响刮擦速度?

到目前为止,我一直在使用scrapy和编写自定义类来处理使用ajax的网站.

但是,如果我使用scrapy-splash,根据我的理解,在javascript之后擦除渲染的html,我的爬虫的速度会受到显着影响吗?

用scrapy-splash刮擦香草html页面与scrapy vs javascript渲染html所需的时间之间的比较是什么?

最后,scrapy-splash和Selenium如何比较?

python selenium scrapy web-scraping scrapy-splash

8
推荐指数
1
解决办法
3689
查看次数

Scrapy CrawlSpider + Splash:如何通过linkextractor关注链接?

我有以下代码部分工作,

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()方法,但似乎并没有工作.我的代码出了什么问题?谢谢,

python web-crawler scrapy scrapy-splash splash-js-render

7
推荐指数
1
解决办法
1707
查看次数

Scrapy,如何更改输入表单中的值,提交然后抓取页面

我想在文本输入字段中输入一个值,然后提交表单,并在表单提交后抓取页面上的新数据\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>\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新!\n新的工作代码。

\n\n
import 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)

scrapy web-scraping scrapy-splash

7
推荐指数
1
解决办法
5674
查看次数

SplashRequest 给出 - TypeError: attrs() 得到了一个意外的关键字参数 'eq'

我正在使用 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)

python scrapy-splash

7
推荐指数
1
解决办法
4272
查看次数

刮擦,飞溅,lua,按钮单击

我是这里所有乐器的新手。我的目标是从许多页面中提取所有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)

python lua scrapy scrapy-splash splash-js-render

6
推荐指数
1
解决办法
1153
查看次数

如何在 Scrapy Splash 中加载本地 HTML 文件?

我想使用 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 错误网关

scrapy scrapy-splash

6
推荐指数
1
解决办法
307
查看次数

连接被对方​​拒绝:10061:无法建立连接,因为目标机器主动拒绝

我的步骤:

\n
    \n
  1. 打造形象docker build . -t scrapy
  2. \n
  3. 运行一个容器docker run -it -p 8050:8050 --rm scrapy
  4. \n
  5. 在容器中运行 scrapy 项目:scrapy crawl foobar -o allobjects.json
  6. \n
\n

这在本地有效,但在我的生产服务器上我收到错误:

\n
\n

[scrapy.downloadermiddlewares.retry] DEBUG:重试 <GET https://www.example.com via http://localhost:8050/execute> (失败 1 次):连接被另一方拒绝:10061:无法连接之所以被制作,是因为目标机器主动拒绝了它。

\n
\n

注意:我没有使用 Docker Desktop,也不能在此服务器上使用。

\n

Dockerfile

\n
FROM 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)

python scrapy docker scrapy-splash windows-server-2019

6
推荐指数
1
解决办法
1830
查看次数