【问题标题】:Empty list for hrefs to achieve pagination through JavaScript onclick functions空列表hrefs通过JavaScript onclick函数实现分页
【发布时间】:2012-06-14 01:50:27
【问题描述】:

我的意图是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作为请求发布)我是真的很困惑,无法通过这个。

【问题讨论】:

    标签: javascript python href scrapy


    【解决方案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
    

    【讨论】:

    • 执行 parse 方法后,它应该通过调用它向 area_count 发送响应,但是这里 parse 没有向 area_count 发送任何响应,当我在 area_count 中打印响应时,我得到了这个。 .
    • 实际上spider在parse方法之前工作正常,但是没有进入area_count方法,如果我们在area_count方法中写错代码,它不会显示错误
    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多