2

我正在尝试抓取多个 URL,但由于某种原因,只有 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 行,您可以看到空单元格

4

3 回答 3

1

文档

start_requests()

此方法必须返回一个迭代器,其中包含要为该蜘蛛爬行的第一个请求。

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

您可以在 中指定 urlstart_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
        )
于 2016-11-01T17:06:25.417 回答
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)。

于 2016-11-01T18:00:13.113 回答
0

对我有用的是增加请求之间的延迟

下载器在从同一网站下载连续页面之前应等待的时间(以秒为单位)。这可以用来限制爬行速度,以避免对服务器造成太大影响。

DOWNLOAD_DELAY = 5

在 4 个 url 上对其进行了测试,并得到了所有这些的结果:

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',
]
于 2016-11-04T17:00:53.713 回答