我正在尝试抓取多个网址,但出于某种原因,仅显示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®ionId=&adults=2', 'https://www.expedia.com/Hotel-Search?#&destination=dallas&startDate=11/15/2016&endDate=11/16/2016®ionId=&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®ionId=&adults=2', 'https://www.expedia.com/Hotel-Search?#&destination=dallas&startDate=11/15/2016&endDate=11/16/2016®ionId=&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行,您可以看到空单元格
答案 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®ionId=&adults=2', 'https://www.expedia.com/Hotel-Search?#&destination=dallas&startDate=11/15/2016&endDate=11/16/2016®ionId=&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®ionId=&adults=2', 'https://www.expedia.com/Hotel-Search?#&destination=dallas&startDate=11/15/2016&endDate=11/16/2016®ionId=&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®ionId=&adults=2',
'https://www.expedia.com/Hotel-Search?#&destination=dallas&startDate=11/15/2016&endDate=11/16/2016®ionId=&adults=2',
'https://www.expedia.com/Hotel-Search?#&destination=washington&startDate=11/15/2016&endDate=11/16/2016®ionId=&adults=2',
'https://www.expedia.com/Hotel-Search?#&destination=philadelphia&startDate=11/15/2016&endDate=11/16/2016®ionId=&adults=2',
]