1

我的意图是achieve the pagination from javascript functions,例如,我将 URL 作为http://events.justdial.com/events/index.php?city=Hyderabad,从这个 URL 中你可以看到页面末尾的分页,所以如果你观察到它们是通过带有href标签的JavaScript 函数编写的 HTML #,我我只是想收集那些 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 发布它作为请求)我真的很困惑,无法通过这个。

4

1 回答 1

1

如果您跟踪请求,您会发现对以下 URL 的发布请求: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
于 2012-06-11T12:08:36.437 回答