【问题标题】:How to use scrapy to crawl a website which hides the url as href="javascript:;" in the next button如何使用scrapy抓取将网址隐藏为href="javascript:;"的网站在下一个按钮中
【发布时间】:2015-08-12 13:45:35
【问题描述】:

我最近在学习 python 和 scrapy。我用谷歌搜索并搜索了几天,但我似乎没有找到任何关于如何在具有隐藏网址的网站上抓取多个页面的说明 - <a href="javascript:;"。基本上每个页面包含20个listing,每次点击“>>”按钮,都会加载接下来的20个listing。我不知道如何找到实际的 url,下面是源代码供您参考。非常感谢任何指针和帮助。

【问题讨论】:

  • 据我所知,按钮是用锚元素实现的?在不知道网站是什么的情况下,很难提供帮助。我的猜测是,锚点 onClick 事件被绑定到一些 javascript 函数,该函数在单击锚点时触发 AJAX 调用。根据站点(以及它的混淆程度),跟踪实际 HTTP 请求的位置可能具有挑战性。
  • 你可以在rent.591.com.hk看到这个网站,它是中文的,但你可以在右上角将它切换为Eng。任何进一步的帮助都非常感谢 junnytony
  • 检查浏览器开发者工具中的网络标签,了解该网站正在执行哪些请求。
  • 我试过了,在网络选项卡的顶部显示“rent.591.com.hk/…”。我复制了这个 URL 并将其粘贴到浏览器上,显示的是空白页面。在 Network Tab -> Initiator 下,它显示 query-1.8.2.min.js:2,不确定它是否告诉我任何信息。顺便说一句,我继续尝试 Selenium 来模拟单击下一页的 >> 按钮,当我在单击操作后检查 URL (driver.current_url) 时,它始终显示 rent.591.com.hk/#list,该 URL 仍然隐藏。如果有人能帮我解决这个问题,我将不胜感激

标签: javascript python pagination web-crawler scrapy


【解决方案1】:

使用 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 中获取。

我最终得到了这个乱码(还有改进的空间):

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

这个网站对于一个scrapy初学者来说真的很不容易 - 所以我编译了这个详细的答案。

【讨论】:

  • Firebug 不是唯一的选择。 Firefox 中还有一个内置工具,Chrome 中也有一个。
  • 感谢@ArturGaspar 的提示。我将我的答案改写为不以 Firefox/Firebug 为中心。
  • 弗兰克,非常感谢您的帮助并抽出时间来尝试一下。我最终使用 Selenium 来模拟浏览器在 >> 按钮上的单击操作,并收集了我需要的所有后续页面链接,尽管我仍然在 Scrapy 框架下这样做,因为我将使用它来过滤元素并构建项目列表。我一定会尝试你的方式来学习 Scrapy 单独的方式,加上有关 Firebug 的信息对我未来的发展很有用。再次感谢您的帮助。我是 stackoverflow 的新手,请告诉我如何评价您的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 2013-05-09
  • 2020-10-12
  • 1970-01-01
  • 2016-11-30
  • 2021-07-27
相关资源
最近更新 更多