【问题标题】:Scrape data from JavaScript-rendered website从 JavaScript 呈现的网站中抓取数据
【发布时间】:2017-01-03 06:39:56
【问题描述】:

我想废弃Lulu webstore。我有以下问题。

  • 网站内容是动态加载的。
  • 网站在尝试访问时,重定向到选择国家页面。
  • 选择国家后,弹出选择送货地点,然后跳转到首页。
  • 当您尝试以编程方式点击结束页面时,您会收到一个空响应,因为内容是动态加载的。

我有一个结束 URL 列表,我必须从中抓取数据。例如,考虑mobile accessories。现在我想

  • 直接获取该页面的 HTML 源代码,它是绕过选择国家、选择位置弹出窗口动态加载的,这样我就可以使用我的 Scrapy Xpath 选择器来提取数据。
  • 如果您建议我使用 Selenium、PhantomJS、Ghost 或其他东西来处理动态内容,请理解我希望在处理完所有将发送到 Scrapy 的动态内容后,最终 HTML 源就像在 Web 浏览器中一样。
  • 另外,我尝试使用代理跳过选择国家/地区弹出窗口,但它仍然会加载它并选择交货位置。
  • 我尝试过使用 Splash,但它返回了选择国家页面的来源。

【问题讨论】:

  • 动态内容意味着 AJAX 调用。只需获取请求的结构,然后使用产品的 id 在循环中调用它。通常你只需要requests 模块,结合BeautifulSoup。我猜的位置也是如此。
  • @Cal Eliacheff 感谢您的评论,但您的方式的问题是,即使我使用与 Web 浏览器相同的 cookie 和用户代理发出请求,我仍然得到相同的响应。我需要在来自服务器的响应和脚本之间的一些东西来处理这些动态内容并给出最终结果,以便我可以将其提供给 scrapy。
  • 您应该更好地查看电话。该位置存储在您从SelectLocation.aspx 获得的cookie 中。例如:http://www.luluwebstore.com/SelectLocation.aspx?Location=13241&DeliveryMode=H&ReturnUrl=http://www.luluwebstore.com 允许您绕过国家选择。看起来只有 GET 请求,通常使用起来更简单。恕我直言,您不想在此类网站上使用 scrapy。
  • @Cal Eliacheff 很抱歉,我没有理解您的评论。但我找不到任何SelectLocation.aspx 或类似的脚本/cookie 来设置位置。另外,我是动态内容爬行的新手。你能解释得更清楚一点吗?此外,我已经从 Web 浏览器的请求标头中引用了 cookie,并且还包含在标头中。
  • 好了,在requests.Session里面,调用上面的url就可以进入主页面,然后就可以调用产品了。提示:只需使用开发工具的网络选项卡查看发生了什么(您可以只过滤 html 和 xhr 事件),然后使用 requests 复制流程。

标签: python proxy scrapy web-crawler


【解决方案1】:

我终于找到了答案。我使用 EditThisCookie 插件来查看网页加载的 cookie。我发现它在我的本地存储中存储了 3 个 cookie CurrencyCode,ServerId,Site_Config。我使用上述插件以 JSON 格式复制 cookie。我参考了this manual 在请求中设置cookie。

现在我可以跳过那些位置、送货地址弹出窗口。之后我发现动态页面是通过<script type=text/javascript>加载的,发现页面url的一部分存储在一个变量中。我使用split() 提取了值。这是获取动态页面url的脚本部分。

from lxml import html
page_source=requests.get(url,cookies=jar)
tree=html.fromstring(page_source.content)    
dynamic_pg_link=tree.xpath('//div[@class="col3_T02"]/div/script/text()')[0] #entire javascript to load product pages
dynamic_pg_link=dynamic_pg_link.split("=")[1].split(";")[0].strip()#obtains the dynamic page url.
page_link="http://www.luluwebstore.com/Handler/ProductShowcaseHandler.ashx?ProductShowcaseInput="+dynamic_pg_link

现在我可以从这些链接中提取数据了。

感谢@Cal Eliacheff 之前的指导。

【讨论】:

    猜你喜欢
    • 2019-06-15
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2019-06-13
    • 1970-01-01
    • 2021-08-10
    相关资源
    最近更新 更多