首页 > 解决方案 > 无法使用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()
      }

标签: pythonscrapy

解决方案


我认为由于您的 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: shopiditemid如您所见,名称之间存在差异 - 但它有效


推荐阅读