如何使用 Scrapy 爬取网站中的动态 Ajax 表格数据?
要使用 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。
相关文章