Scrapy 如何处理 JavaScript
Scrapy 如何处理 JavaScript
参考蜘蛛:
import scrapy from scrapy.spiders import Spider from scrapy.selector import Selector from script.items import ScriptItem class RunSpider(scrapy.Spider): name = "run" allowed_domains = ["stopitrightnow.com"] start_urls = ( 'http://www.stopitrightnow.com/', ) def parse(self, response): for widget in response.xpath('//div[@class="shopthepost-widget"]'): #print widget.extract() item = ScriptItem() item['url'] = widget.xpath('.//a/@href').extract() url = item['url'] #print url yield item
当我运行时,终端输出如下:
2015-08-21 14:23:51 [scrapy] DEBUG: Scraped from <200 http://www.stopitrightnow.com/> {'url': []}
这是HTML代码:
<
对我来说,当尝试激活JavaScript时似乎遇到了一些问题。我知道scrapy无法运行JavaScript,但一定有办法获取这些链接。我已经看了selenium,但无法掌握它。欢迎任何帮助。
Scrapy是一个用于爬取网页数据的Python框架,但是它在处理包含JavaScript的网页时会遇到一些问题。为了解决这个问题,有一个非JavaScript的替代方案是手动检查页面加载内容的来源,并添加相应的功能。具体方法可以参考stackoverflow上的一个问题(链接:https://stackoverflow.com/a/8594831/1901546)。通过检查页面加载内容的来源,我们可以得到一个网络流量图,可以看到JavaScript执行了一个嵌入URL的操作。通过手动生成这些URL的请求,我们可以解决这个问题。以下是一个示例代码:
def parse(self, response): for widget in response.xpath('//div[@class="shopthepost-widget"]'): widget_id = widget.xpath('@data-widget-id').extract()[0] widget_url = "http://widgets.rewardstyle.com/stps/{id}.html".format(id=widget_id) yield Request(widget_url, callback=self.parse_widget) def parse_widget(self, response): for link in response.xpath('//a[contains(@class, "stp-product")]'): item = JavasItem() item['link'] = link.xpath("@href").extract() yield item # Do whatever else you want with the opened page.
如果需要将这些小部件与它们所属的帖子/文章关联起来,可以通过meta参数将相关信息传递给请求。以上是一个更好的解决方案,而不需要依赖第三方库。该解决方案可以让我们直接从小部件的源页面获取数据,而不是从页面中加载的内容中提取数据。这样可以避免由于JavaScript的操作而导致的数据提取问题。
Scrapy是一个用Python编写的用于爬取网站数据的框架。然而,Scrapy在处理JavaScript时会遇到一些问题。为了解决这个问题,可以使用ScrapyJS。
ScrapyJS是一个用于处理JavaScript的工具,可以帮助Scrapy处理那些依赖于JavaScript生成的动态网页。下面是使用ScrapyJS的设置说明和一个示例代码:
# -*- coding: utf-8 -*- import scrapy class TestSpider(scrapy.Spider): name = "run" allowed_domains = ["stopitrightnow.com"] start_urls = ( 'http://www.stopitrightnow.com/', ) def start_requests(self): for url in self.start_urls: yield scrapy.Request(url, meta={ 'splash': { 'endpoint': 'render.html', 'args': {'wait': 0.5} } }) def parse(self, response): for widget in response.xpath('//div[.="shopthepost-widget"]'): print widget.xpath('.//a/').extract()
使用ScrapyJS后,可以在控制台上得到以下结果:
[u'http://rstyle.me/iA-n/7bk8r4c_', u'http://rstyle.me/iA-n/7bk754c_', u'http://rstyle.me/iA-n/6th5d4c_', u'http://rstyle.me/iA-n/7bm3s4c_', u'http://rstyle.me/iA-n/2xeat4c_', u'http://rstyle.me/iA-n/7bi7f4c_', u'http://rstyle.me/iA-n/66abw4c_', u'http://rstyle.me/iA-n/7bm4j4c_'] [u'http://rstyle.me/iA-n/zzhv34c_', u'http://rstyle.me/iA-n/zzhvw4c_', u'http://rstyle.me/iA-n/zwuvk4c_', u'http://rstyle.me/iA-n/zzhvr4c_', u'http://rstyle.me/iA-n/zzh9g4c_', u'http://rstyle.me/iA-n/zzhz54c_', u'http://rstyle.me/iA-n/zwuuy4c_', u'http://rstyle.me/iA-n/zzhx94c_']
然而,有时候在控制台上会看到以下信息:
2015-08-21 16:36:14 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2015-08-21 16:37:00 [scrapy] DEBUG: Gave up retrying <POST 192.168.59.103:8050/render.html> (failed 3 times): TCP connection timed out: 60: Operation timed out. 2015-08-21 16:37:00 [scrapy] ERROR: Error downloading <POST 192.168.59.103:8050/render.html>: TCP connection timed out: 60: Operation timed out.
这个问题的原因是Scrapy无法连接到ScrapyJS的Splash服务。要解决这个问题,需要确保已经启动了Splash的Docker容器,并且可以通过浏览器访问到Splash的地址(例如:192.168.59.103:8050)。如果无法访问到Splash的地址,则需要检查是否正确运行了Splash的Docker容器。
希望以上内容对你理解Scrapy如何处理JavaScript以及解决相关问题有所帮助。