Pot*_*Pot 0 javascript python pagination web-crawler scrapy
我最近在学习python和scrapy.我用Google搜索并搜索了几天,但我似乎没有找到任何有关如何使用隐藏网址抓取多个网页的说明 - <a href="javascript:;".基本上每个页面包含20个列表,每次单击">>"按钮,它将加载下20个项目.我无法弄清楚如何找到实际的网址,下面是您参考的源代码.任何指针和帮助非常感谢.
使用Web浏览器和激活的Web-Developer-Tools访问该站点(以下屏幕截图是使用Firefox和附加的Firebug制作的),您应该能够分析网络请求和响应.它将向您显示网站分页按钮发送如下所示的请求:

所以URL似乎是:
http://rent.591.com.hk/?m=home&c=search&a=rslist&type=1&shType=list&p=2&searchtype=1
但这不是一个正常的要求.这是一个XMLHttpRequest.Header标签表示更改.响应是在JSON中:

因此,您不需要从复杂的嵌套html结构中获取数据,但可以直接从JSON dict获取.
我最终得到了这个scrapy代码(有改进的余地):
import scrapy
import json
class RentObject(scrapy.Item):
address = scrapy.Field()
purpose = scrapy.Field()
# Add more fields as needed
class ScrapeSpider(scrapy.Spider):
name = "rent_hk"
allowed_domains = ['591.com.hk']
start_urls = ['http://rent.591.com.hk/?hl=en-us#list' ]
page_number = 0
page_num_max = 5 # for test purposes grab only up to 5 pages
def parse(self, response):
if 'page_number' in response.meta:
result_dict = json.loads(response.body) # get data as dict
for object in result_dict['items']:
ro = RentObject()
ro['address'] = object['address']
ro['purpose'] = object['purpose']
yield ro
# Make request for (next page) JSON data
self.page_number += 1
payload = {
'm': 'home',
'c': 'search',
'a': 'rslist',
'type': '1',
'p': str(self.page_number),
'searchtype': '1'
}
if self.page_number < self.page_num_max:
request = scrapy.FormRequest(url='http://rent.591.com.hk/',
method='GET',
formdata=payload,
headers={'Referer': 'http://rent.591.com.hk/?hl=en-us',
'X-Requested-With': 'XMLHttpRequest'},
callback=self.parse)
request.meta['page_number'] = self.page_number
yield request
Run Code Online (Sandbox Code Playgroud)
这个网站对于scrapy初学者来说真的不容易 - 所以我编写了这个详细的答案.