scrapy抓取ajax请求的网页

在上一篇博客

http://zhouxi2010.iteye.com/blog/1450177

中介绍了用scrapy抓取网页,但是只能抓取普通html中的链接,对于ajax请求的网页却抓不到,但是实际应用中ajax请求又是十分普遍的,所以这里在记录下抓取ajax页面的方法.

仍然是spiders/book.py:

Java代码   收藏代码
  1. class BookSpider(CrawlSpider):    
  2.     ................  
  3.     ................  
  4.     ................  
  5.     def parse_item(self, response):    
  6.         hxs = HtmlXPathSelector(response)    
  7.         item = BookItem()    
  8.         ........  
  9.         ..........  
  10.         #这里url是虚构的,使用时需要修改  
  11.         url =  "http://test_url/callback.php?ajax=true"  
  12.         request =  Request(url, callback=self.parse_ajax)  
  13.         request.meta['item'] = item  
  14.         #这里将ajax的url找出来,然后够找请求,框架执行请求收到返回后再回调  
  15.         yield request  
  16.   
  17.     def parse_ajax(self, response):  
  18.         data = response.body  
  19.         #这里写正则匹配或者选择XPathSelector获取需要捕获的数据,略  
  20.         ajaxdata = get_data(data)  
  21.   
  22.         #由于返回可能是js,可以采用python来模拟js解释器,不过这里偷懒就用json来进行转换  
  23.         if ajaxdata:  
  24.             x = '{"data": "' + ajaxdata.replace('\n''') + '"}'  
  25.             ajaxdata = simplejson.loads(x)['data']  
  26.         else:  
  27.             ajaxdata = ''  
  28.          
  29.         item = response.meta['item']  
  30.         item['ajaxdata'] = ajaxdata  
  31.         for key in item:  
  32.             if isinstance(item[key], unicode):  
  33.                 item[key] = item[key].encode('utf8')  
  34.         #到这里一个Item的全部元素都抓齐了,所以返回item以供保存  
  35.         return item  
### 使用Scrapy抓取AJAX加载的数据 当面对通过AJAX技术异步加载数据网页时,传统的HTML解析方法可能会失效,因为初始页面并不包含最终展示给用户的全部内容。对于这类问题,一种有效的方法是直接定位并请求提供实际数据显示的API端点。 #### 分析目标网站的网络活动 为了实现这一点,开发者工具成为不可或缺的一部分。打开浏览器的开发者工具(通常是按F12),切换到“Network”标签页刷新页面模拟正常浏览行为下的资源加载过程。观察哪些HTTP请求是在特定交互动作发生后发出的——比如滚动到底部触发更多内容加载或点击按钮显示更多信息等场景下产生的XHR类型的请求[^1]。 一旦识别出了负责传输所需数据的那个URL模式及其参数构成规律,则可以直接利用此接口进行后续操作而无需理会前端复杂的DOM结构变化逻辑。 #### 构建自定义Request对象发起查询 在明确了具体的API路径之后就可以着手编写Spider脚本来构建针对这些服务端暴露出来的RESTful API的`scrapy.Request()`实例了: ```python import scrapy from urllib.parse import urlencode class AjaxExampleSpider(scrapy.Spider): name = 'ajax_example' def start_requests(self): base_url = "https://example.com/api/data?" # 替换成真实的api url params = { 'param1': value1, 'param2': value2, # 添加其他必要的查询字符串参数... } yield scrapy.Request( url=base_url + urlencode(params), callback=self.parse_api_response ) def parse_api_response(self, response): json_data = response.json() items = json_data.get('items', []) for item in items: yield { 'title': item['title'], 'description': item['desc'] # 提取出感兴趣的信息字段... } ``` 上述代码片段展示了如何创建一个新的爬虫类继承于`scrapy.Spider`,并通过重写`start_requests`方法来自定义首次访问的目标地址以及传递任何必需的GET参数;接着定义回调函数用于处理返回的结果集,并从中提取有用的部分作为item输出保存下来[^2]。 如果遇到的是POST方式提交表单或者其他形式更加复杂的情况,也可以调整`FormRequest.from_response()`或者手动设置headers/body等方式适配不同的需求[^3]。 另外值得注意的一点在于并非所有的动态加载都遵循易于预测和模仿的方式来进行通信,有时候可能涉及到加密签名验证机制等问题使得简单地复制粘贴网址变得不可行。此时就需要考虑采用像Selenium、Pyppeteer这样的自动化测试框架配合headless browser来完成整个流程模拟直至获取完整的渲染后的文档流再做进一步分析处理[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值