Scrapy with Splash Only Scrapes 1页

时间:2016-11-01 15:25:31

标签: python scrapy scrapy-splash

我正在尝试抓取多个网址,但出于某种原因,仅显示1个网站的结果。在每种情况下,它都是start_urls中显示的最后一个URL。

我相信我的问题缩小到我的解析功能。

关于我做错的任何想法?

谢谢!

class HeatSpider(scrapy.Spider):
name = "heat"

start_urls = ['https://www.expedia.com/Hotel-Search?#&destination=new+york&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2', 'https://www.expedia.com/Hotel-Search?#&destination=dallas&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2']

def start_requests(self):
    for url in self.start_urls:
        yield SplashRequest(url, self.parse,
            endpoint='render.html',
            args={'wait': 8},
        )

def parse(self, response):
    for metric in response.css('.matrix-data'):
        yield {
            'City': response.css('title::text').extract_first(),
            'Metric Data Title': metric.css('.title::text').extract_first(),
            'Metric Data Price': metric.css('.price::text').extract_first(),
        }

编辑:

我修改了我的代码以帮助调试。运行此代码后,我的csv如下所示:csv results 每个URL都有一行,应该有,但只有一行填充了信息。

class HeatSpider(scrapy.Spider):
name = "heat"

start_urls = ['https://www.expedia.com/Hotel-Search?#&destination=new+york&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2', 'https://www.expedia.com/Hotel-Search?#&destination=dallas&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2']

def start_requests(self):
    for url in self.start_urls:
        yield SplashRequest(url, self.parse,
            endpoint='render.html',
            args={'wait': 8},
        )


def parse(self, response):
    yield {
        'City': response.css('title::text').extract_first(),
        'Metric Data Title': response.css('.matrix-data .title::text').extract(),
        'Metric Data Price': response.css('.matrix-data .price::text').extract(),
        'url': response.url,
    }

编辑2: 这是完整输出http://pastebin.com/cLM3T05P 在第46行,您可以看到空单元格

3 个答案:

答案 0 :(得分:0)

来自docs

  

<强> start_requests()

     

此方法必须返回一个带有第一个爬网请求的iterable。

     

这是在没有指定特定URL时打开蜘蛛进行抓取时Scrapy调用的方法。如果指定了特定URL,则使用make_requests_from_url()来创建请求。此方法也只在Scrapy中调用一次,因此将其实现为生成器是安全的。

您可以在start_requests()中指定网址,也可以覆盖make_requests_from_url(url)来发出start_urls的请求。

示例1

start_urls = []
def start_requests(self):
    urls = ['https://www.expedia.com/Hotel-Search?#&destination=new+york&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2', 'https://www.expedia.com/Hotel-Search?#&destination=dallas&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2']
    for url in urls:
        yield SplashRequest(url, self.parse,
        endpoint='render.html',
        args={'wait': 8},
        dont_filter=True
        )

示例2

start_urls = ['https://www.expedia.com/Hotel-Search?#&destination=new+york&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2', 'https://www.expedia.com/Hotel-Search?#&destination=dallas&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2']
def make_requests_from_url(self, url):
    yield SplashRequest(url, self.parse,
        endpoint='render.html',
        args={'wait': 8},
        dont_filter=True
        )

答案 1 :(得分:0)

您确定scrapy-splash配置正确吗?

Scrapy默认的dupefilter不会考虑帐户中的URL片段(即#之后的URL的一部分),因为此部分不会作为HTTP请求的一部分发送到服务器。但是,如果您在浏览器中呈现页面,则片段很重要。

scrapy-splash提供了一个定制的dupefilter,它可以考虑碎片;启用它设置DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'。如果您不使用此dupefilter,则两个请求都将具有相同的指纹(如果删除了片段,则它们是相同的),因此第二个请求将被过滤掉。

尝试检查所有其他设置是否也正确(请参阅https://github.com/scrapy-plugins/scrapy-splash#configuration)。

答案 2 :(得分:0)

对我有用的是在请求之间添加delay

  

下载者之前应该等待的时间(以秒为单位)   从同一网站下载连续页面。这可以使用   限制爬行速度以避免过于严重地击中服务器。

DOWNLOAD_DELAY = 5

在4个网址上测试并获得所有结果:

start_urls = [
    'https://www.expedia.com/Hotel-Search?#&destination=new+york&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2',
    'https://www.expedia.com/Hotel-Search?#&destination=dallas&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2',
    'https://www.expedia.com/Hotel-Search?#&destination=washington&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2',
    'https://www.expedia.com/Hotel-Search?#&destination=philadelphia&startDate=11/15/2016&endDate=11/16/2016&regionId=&adults=2',
]