【发布时间】:2015-09-24 02:49:30
【问题描述】:
我在 Scrapy 中编写了一个 webscraper,它最初会转到 this 网页,抓取每张票的票信息,然后抓取“票”按钮重定向到的每个链接。在门票页面上,为了获得价格,必须请求 JSON file(现在这不是什么大问题),并且需要提取文件中的第一个价格并将其保存到 Scrapy 项目加载器中.
我尝试使用以下语句在 scrapy shell 中查找价格对象:
jsonresponse = json.loads(response.body_as_unicode())
jsonresponse["p"]
和
jsonresponse["lp"]
和
jsonresponse['hp']
但由于某种原因,他们都没有在文件中找到价格对象。如果您查看tickets page,您可以看到目前最低价格为 28 美元。对于这个特定的链接,我需要得到 $28 的字符串。
我知道scrapy 不处理javascript,并且scrapy.js 可用于将js 集成到scrapy 中,但我不确定是否应该在这种情况下使用它。无论如何,找到该对象并将其提取到变量中的正确方法是什么。任何帮助,将不胜感激。谢谢! [编辑] 这是到目前为止的代码:
bandname = raw_input("Enter a bandname \n")
vs_url = "http://www.vividseats.com/concerts/" + bandname + "-tickets.html"
class MySpider(CrawlSpider):
handle_httpstatus_list = [416]
name = 'comparator'
allowed_domains = ["www.vividseats.com"]
start_urls = [vs_url]
tickets_list_xpath = './/*[@itemtype="http://schema.org/Event"]'
def parse_json(self, response):
loader = response.meta['loader']
#not sure what to put here yet
return loader.load_item()
def parse_price(self, response):
loader = response.meta['loader']
ticketLink = loader.get_output_value("ticketsLink")
json_id_list= re.findall(r"\d{2,9}", ticketsLink)
json_id= "".join(json_id_list)
json_url = "www.vividseats.com/javascript/tickets.shtml?productionId=" + json_id
yield scrapy.Request(json_url, meta={'loader': loader}, callback = self.parse_json, dont_filter = True)
def parse(self, response):
"""
"""
selector = HtmlXPathSelector(response)
# iterate over tickets
for ticket in selector.select(self.tickets_list_xpath):
loader = XPathItemLoader(ComparatorItem(), selector=ticket)
# define loader
loader.default_input_processor = MapCompose(unicode.strip)
loader.default_output_processor = Join()
# iterate over fields and add xpaths to the loader
loader.add_xpath('eventName' , './/*[@class="productionsEvent"]/text()')
loader.add_xpath('eventLocation' , './/*[@class = "productionsVenue"]/span[@itemprop = "name"]/text()')
loader.add_xpath('ticketsLink' , './/*/a[@class = "btn btn-primary"]/@href')
loader.add_xpath('eventDate' , './/*[@class = "productionsDate"]/text()')
loader.add_xpath('eventCity' , './/*[@class = "productionsVenue"]/span[@itemprop = "address"]/span[@itemprop = "addressLocality"]/text()')
loader.add_xpath('eventState' , './/*[@class = "productionsVenue"]/span[@itemprop = "address"]/span[@itemprop = "addressRegion"]/text()')
loader.add_xpath('eventTime' , './/*[@class = "productionsTime"]/text()')
print "Here is ticket link \n" + loader.get_output_value("ticketsLink")
ticketsURL = "concerts/" + bandname + "-tickets/" + bandname + "-" + loader.get_output_value("ticketsLink")
ticketsURL = urljoin(response.url, ticketsURL)
yield scrapy.Request(ticketsURL, meta={'loader': loader}, callback = self.parse_price, dont_filter = True)
【问题讨论】:
-
你能展示一下你目前拥有的完整代码吗?
标签: javascript python json web-scraping scrapy