hrefs的空列表,通过JavaScript onclick函数实现分页

时间:2012-06-11 06:29:28

标签: javascript python href scrapy

我的意图是achieve the pagination from javascript functions,所以例如我将URL作为http://events.justdial.com/events/index.php?city=Hyderabad从此URL中获取,因为您可以在页面末尾看到分页,所以如果你观察到HTML的话它们是通过href标记为#的JavaScript函数编写的,我只是尝试收集那些href标记,即使它们是#。 以下是我的代码

class justdialdotcomSpider(BaseSpider):
   name = "justdialdotcom"
   allowed_domains = ["www.justdial.com"]
   start_urls = ["http://events.justdial.com/events/index.php?city=Hyderabad"]

   def parse(self, response):
       hxs = HtmlXPathSelector(response)
       pagination = hxs.select('//div[@id="main"]/div[@id="content"]/div[@id="pagination"]/a').extract()
       print pagination,">>>>>>>>>>>>>>>>>."

当我运行上面的代码时,我得到的结果为[],我的意思是没有,任何人都可以告诉我如何通过JavaScript onclick函数实现分页以及结果为空的原因。我正在观察HTML中的某种奇怪的东西,例如分页中的一个页面的锚标记为<a onclick="jdevents.setPageNo(2)" href="#">2</a> 但是当我试图通过浏览器点击view page source来查看时,我看不到任何函数jdevents.setPageNo(2),(我希望如果我们能看到他在HTML中做了什么,我们可以通过formdata发布它请求)我真的很困惑,无法通过这个。

1 个答案:

答案 0 :(得分:1)

如果您跟踪了请求,您会发现对以下网址的帖子请求: http://events.justdial.com/events/search.php

发布数据:

city:Hyderabad 
cat:0 
area:0 
fromDate: 
toDate: 
subCat:0 
pageNo:2
fetch:events

并且响应采用JSON格式。

所以,您的代码应该是以下

import re
import json

class justdialdotcomSpider(BaseSpider):
    name = "justdialdotcom"
    domain_name = "www.justdial.com"
    start_urls = ["http://events.justdial.com/events/search.php"]


    # Initial request
    def parse(self, response):
        return [FormRequest(url="http://events.justdial.com/events/search.php",
                                        formdata={'fetch': 'area',
                                                  'pageNo': '1',
                                                  'city' : 'Hyderabad',
                                                  'cat' : '0',
                                                  'area' : '0',
                                                  'fromDate': '',
                                                  'toDate' : '',
                                                  'subCat' : '0'
                                                  },
                                        callback=self.area_count
                                        )]


# Get total count and paginate through events
    def area_count(self, response):
        total_count = 0
        for area in  json.loads(response.body):
            total_count += int(area["count"])

        pages_count = (total_count / 10) + 1

        page = 1
        while (page <= pages_count):
            yield FormRequest(url="http://events.justdial.com/events/search.php",
                                        formdata={'fetch': 'events',
                                                  'pageNo': str(page),
                                                  'city' : 'Hyderabad',
                                                  'cat' : '0',
                                                  'area' : '0',
                                                  'fromDate': '',
                                                  'toDate' : '',
                                                  'subCat' : '0'
                                                  },
                                        callback=self.parse_events
                                        )
            page += 1


# parse events 
    def parse_events(self, response):
        events = json.loads(response.body)
        events.pop(0)

        for event_details in events:
            yield FormRequest(url="http://events.justdial.com/events/search.php",
                                        formdata={'fetch': 'event',
                                                  'eventId': str(event_details["id"]),
                                                  },
                                        callback=self.parse_event
                                        )



    def parse_event(self, response):
        event_details = json.loads(response.body)
        items = []
        #item = Product()

        items.append(item)
        return items