如何使用scrapy抓取隐藏网址的网站为href ="javascript:;" 在下一个按钮

Pot*_*Pot 0 javascript python pagination web-crawler scrapy

我最近在学习python和scrapy.我用Google搜索并搜索了几天,但我似乎没有找到任何有关如何使用隐藏网址抓取多个网页的说明 - <a href="javascript:;".基本上每个页面包含20个列表,每次单击">>"按钮,它将加载下20个项目.我无法弄清楚如何找到实际的网址,下面是您参考的源代码.任何指针和帮助非常感谢.

Fra*_*tin 5

使用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初学者来说真的不容易 - 所以我编写了这个详细的答案.