python - 无法使用scrapy从第二页刮取数据
问题描述
我在抓取一页以上的数据时遇到问题。在启动控制台中,我设法获得了 2-3 页的 HTML 内容。在第一个循环中的 Lua 脚本中,我定义迭代一次以提取一个页面,我得到 50 个 url。如果 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()
}
解决方案
我认为由于您的 lua 脚本,您会收到超时错误。当您从蜘蛛发出请求时,接收响应的时间就开始了。在您的 lua 脚本中,您有以下内容: 运行 js 两次以进行滚动,这需要一些时间 两次调用函数splash:wait(5.0)
以下载和呈现一些数据 然后您调用assert(splash:wait(8.0))
最终最短时间:(3 * 8) + (2 * 5) + 运行时间splash:runjs
和其他一些东西
但在您的情况下,不需要 Splash。您可以直接从您的蜘蛛发出下一页的请求。Chrome->Dev Tools->Network->XHR,在那里你会找到请求 url https://shopee.sg/api/v2/search_items/?by=relevancy&keyword=hdmi&limit=50&newest=250&order=desc&page_type=search
然后,您可以使用它来获取您需要的所有信息。在您的情况下,它是产品的 URL,但没有直接的 url,您必须对名称进行 slugify。例如[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-
2 个 ids: shopid
,itemid
如您所见,名称之间存在差异 - 但它有效
推荐阅读
- java - 用户输入后如何存储选择的值?目标是在用户完成后打印出 array2 作为收据,其中包含所有选择的治疗
- javascript - leetcode 加热器输出错误
- java - 使用 OkHttp 上传 Android 多部分文件
- typeorm - Typeorm:使用参数执行原始查询
- sql - 如果 PostgreSQL 中存在另一个表,如何使用 IF 语句删除一个表
- html - 使用 jQuery 动态添加 textarea 元素
- python - 返回“或响应”时会产生什么响应“process_response()”?
- vue.js - Vee-Validate 不使用表单向导
- asp.net-core - ASP.NET Core 3.1 中的 asp-action 不适用于端点路由
- r - 按组计算 dplyr 中具有先前值的字段