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