我在抓取超过一页的数据时遇到了问题。在splash控制台中,我设法获得了2-3页的HTML内容。在第一个循环中的Lua脚本中,我定义迭代一次来提取一个页面,得到50个urls。如果迭代2次或更多,则不会返回任何数据。在控制台中,我得到:
Ignoring response <504 https://shopee.sg/search?keyword=hdmi>: HTTP status code is not handled or not allowed
或
504 Gateway Time-out
以下是我的代码
class Shopee(scrapy.Spider):
name = 'shopee'
script = '''
function main(splash, args)
assert(splash:go(args.url))
assert(splash:wait(5.0))
treat=require('treat')
result = {}
pages = splash:select('.shopee-mini-page-controller__total')
for i=1,3,1 do
for j=1,2,1 do
assert(splash:runjs("window.scrollBy(0, 1300)"))
assert(splash:wait(5.0))
end
result[i]=splash:html()
assert(splash:runjs('document.querySelector(".shopee-icon-button--right").click()'))
assert(splash:wait(8.0))
end
return treat.as_array(result)
end
'''
def start_requests(self):
urls = [
'https://shopee.sg/search?keyword=hdmi'
]
for link in urls:
yield SplashRequest(url=link, callback=self.parse, endpoint='execute', args={'wait': 2.5, 'lua_source' : self.script}, dont_filter=True)
def parse(self, response):
for page in response.data:
sel = Selector(text=page)
yield {
'urls': sel.xpath("//div[contains(@class, 'shopee-search-item-result__item')]//a[*]/@href").getall()
}
发布于 2019-07-30 13:52:42
我认为你得到一个超时错误是因为你的lua脚本。当您从爬行器发出请求时,接收响应的时间开始。在你的lua脚本中,你有如下代码:运行js两次进行滚动,需要两次调用函数splash:wait(5.0)
来下载和渲染一些数据,然后调用assert(splash:wait(8.0))
最终最小时间:(3 * 8) + (2 * 5) +运行splash:runjs
和其他一些东西的时间
但在您的情况下,Splash不是必需的。您可以直接从爬行器请求下一页。Chrome->开发工具->网络->XHR,你会在那里找到请求url https://shopee.sg/api/v2/search_items/?by=relevancy&keyword=hdmi&limit=50&newest=250&order=desc&page_type=search
然后,您可以使用它来获取所需的所有信息。在您的示例中,它是产品的url,但没有直接的URL,您必须对名称进行标记。例如,[Spot is sold very well]Micro USB para HDMI Adaptador MHL para HDMI 1080 P
到-Spot-is-sold-very-well-Micro-USB-para-HDMI-Adaptador-MHL-para-HDMI-1080-P-HD-TV-
并添加两个it:shopid
,itemid
,正如您所看到的,名称之间是有区别的-但它是有效的
https://stackoverflow.com/questions/57260219
复制