Scrapy 如何处理 JavaScript

13 浏览
0 Comments

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,但无法掌握它。欢迎任何帮助。

0
0 Comments

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的操作而导致的数据提取问题。

0
0 Comments

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以及解决相关问题有所帮助。

0