我试图刮一个网站,其中部分呈现内容使用JS。
我找到了这个项目:https://github.com/scrapinghub/sample-projects/tree/master/splash_smart_proxy_manager_example,它非常清楚地解释了如何设置。下面是我现在拥有的内容:
坞缀:
version: '3.8'
services:
scraping:
build:
context: .
dockerfile: Dockerfile
volumes:
- "./scraping:/scraping"
environment:
- PYTHONUNBUFFERED=1
depends_on:
- splash
links:
- splash
splash:
image: scrapinghub/splash
restart: always
expose:
- 5023
- 8050
- 8051
ports:
- "5023:5023"
- "8050:8050"
- "8051:8051"
蜘蛛:
class HappySider(scrapy.Spider):
...
custom_settings = {
'DUPEFILTER_CLASS': 'scrapy_splash.SplashAwareDupeFilter',
'SPIDER_MIDDLEWARES': {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
},
'DOWNLOADER_MIDDLEWARES': {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
},
'ITEM_PIPELINES': {
'scraping.pipelines.HappySpiderPipeline': 300,
},
'RETRY_HTTP_CODES': [500, 502, 503, 504, 522, 524, 408, 429, 403],
'RETRY_TIMES': 20,
'DOWNLOAD_DELAY': 5,
'DOWNLOAD_TIMEOUT': 30,
'CONCURRENT_REQUESTS': 1,
'CONCURRENT_REQUESTS_PER_DOMAIN': 1,
'COOKIES_ENABLED': False,
'ROBOTSTXT_OBEY': True,
# enable Zyte Proxy
'ZYTE_SMARTPROXY_ENABLED': True,
# the APIkey you get with your subscription
'ZYTE_SMARTPROXY_APIKEY': '<my key>',
'SPLASH_URL': 'http://splash:8050/',
}
def __init__(self, testing=False, name=None,**kwargs):
self.LUA_SOURCE = get_data(
'scraping', 'scripts/smart_proxy_manager.lua'
).decode('utf-8')
super().__init__(name,**kwargs)
def start_requests(self):
yield SplashRequest(
url='https://www.someawesomesi.te',
endpoint='execute',
args={
'lua_source': self.LUA_SOURCE,
'crawlera_user': self.settings['ZYTE_SMARTPROXY_APIKEY'],
'timeout': 90,
},
# tell Splash to cache the lua script, to avoid sending it for every request
cache_args=['lua_source'],
meta={
'max_retry_times': 10,
},
callback=self.my_callback
)
我得到的输出是:
2022-08-10 13:09:32 [scrapy.downloadermiddlewares.retry] DEBUG: Retrying <GET https://www.someawesomesi.te via http://splash:8050/execute> (failed 1 times): 504 Gateway Time-out
我不知道如何继续。我确实查了一下为什么它会给我504,splash docks确实建议了一些处理它的方法...但是我没有太多的并发URL,脚本在第一个失败了。另外,我正在刮的网站非常快,如果我只是使用Zyte而不使用splash,那么它刮得非常快。
因此,如果有人能建议这里有什么问题,以及如何解决它-我将非常感谢。
2条答案
按热度按时间r6hnlfcb1#
Splash很快就要被弃用了。你可以使用智能代理管理器和无头浏览器库来渲染JS。Zyte最近推出了三个无头浏览器库。
这些客户端库是在Chromium、Firefox和WebKit的本地库之上构建的,可以与Zyte智能代理管理器无缝协作。使用这些库,您将不再需要在后台运行一个单独的软件(如splash)来帮助连接Zyte智能代理管理器。
1.我的建议是使用Zyte API。Zyte API是一个端到端的API解决方案,它可以执行Web抓取序列中的所有任务。它可以提取动态加载的网页内容,而无需花费时间通过JavaScript、无头浏览器库和额外的请求来重新创建浏览器所做的事情。
对于此特定解决方案,请遵循以下文档。只需设置
javascript
参数:至在浏览器渲染过程中打开或关闭JavaScript。它只是工作...
我在Zyte担任开发人员倡导者。
mzillmmw2#
这个例子对我来说也不是现成的。把splash_smart_proxy_manager_example/scripts/smart_proxy_manager.lua中指定的Zyte智能代理管理器的端口号改为8010会有所帮助。
8010在较早的示例中使用