如何使用 Scrapy 爬取网站中的动态 Ajax 表格数据?

2023-04-17 00:00:00 动态 表格 如何使用

要使用 Scrapy 爬取网站中的动态 Ajax 表格数据,需要使用 Scrapy 的中间件来捕获 Ajax 请求并进行处理。以下是一个基本的 Scrapy 爬虫,可以爬取 pidancode.com 网站中的动态 Ajax 表格数据:

import scrapy
class PidancodeSpider(scrapy.Spider):
    name = 'pidancode'
    allowed_domains = ['pidancode.com']
    start_urls = ['https://www.pidancode.com/table']
    def parse(self, response):
        # 提取页面中的__RequestVerificationToken参数
        token = response.css('input[name="__RequestVerificationToken"]::attr(value)').get()
        # 发送Ajax请求
        yield scrapy.Request(
            'https://www.pidancode.com/Table/GetData',
            method='POST',
            headers={
                'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                'X-Requested-With': 'XMLHttpRequest'
            },
            body='__RequestVerificationToken={}'.format(token),
            callback=self.parse_ajax_response
        )
    def parse_ajax_response(self, response):
        # 解析Ajax响应
        for row in response.json().get('data'):
            yield {
                'name': row.get('Name'),
                'description': row.get('Description'),
                'url': row.get('Url')
            }

首先,我们定义了一个名为 pidancode 的 Scrapy 爬虫,并设定了目标网站的域名和起始爬取链接。接着,在 parse 方法中,我们使用 CSS 选择器提取了页面中的 __RequestVerificationToken 参数,并使用 scrapy.Request 发送了一个 POST 请求到目标 Ajax 页面,然后将响应交给 parse_ajax_response 方法进行处理。
parse_ajax_response 方法中,我们使用 JSON 解析器将 Ajax 响应解析为 Python 字典,并使用 yield 语句将每行数据提交到 Scrapy 爬虫的管道中,以便进行后续处理。
需要注意的是,由于 Scrapy 默认并不支持处理动态 Ajax 数据,我们需要在 settings.py 文件中添加以下配置:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 900
}

这个配置告诉 Scrapy 在下载每个响应时,使用 AjaxCrawlMiddleware 处理响应中包含的动态 Ajax 数据,以便我们可以捕获和处理这些数据。
最后,我们就可以运行这个爬虫,并得到我们需要的数据:

$ scrapy runspider pidancode.py -o pidancode.csv

在这个例子中,我们直接将数据存储到了 CSV 文件中,但你也可以使用其他支持的输出格式,如 JSON。

相关文章