当前位置: 首页>大数据>正文

XMLFeedSpider使用和应用方向

XMLFeedSpider是scrapy.Spider的子类,主要用于解决 xmlhtml 杂交的网页

以 http://shj.chengde.gov.cn/col/col823/index.html 这个网站为例

<script type="text/xml">
    <datastore>
        <nextgroup>
            <![CDATA[<a href="/module/web/jpage/dataproxy.jsp?page=1&appid=1&appid=1&webid=13&path=/&columnid=823&unitid=71805&webname=%25E6%2589%25BF%25E5%25BE%25B7%25E5%25B8%2582%25E7%2594%259F%25E6%2580%2581%25E7%258E%25AF%25E5%25A2%2583%25E5%25B1%2580&permissiontype=0"></a>]]></nextgroup>
        <recordset>
            <record><![CDATA[
<li>            <a href="/art/2022/8/5/art_823_868646.html">关于开展中国银行(国控)站点周边环境空气质量空间分布监测项目的采购公...</a>            <span>2022-08-05</span>          </li>]]></record>
            <record><![CDATA[
<li>            <a href="/art/2022/7/15/art_823_864745.html">承德市大气污染防治聘请第三方专业技术团队项目公开招标公告</a>            <span>2022-07-15</span>          </li>]]></record>

整个网页是由HTML构成 但是数据部分是由XML构成 这样就形成了所谓的杂交页面
上述代码中CDATA是XML的语法,不论是CSS选择器还是Xpath都是无法识别的
在以前我们提出过一种比较笨的解决方法,那就是用replace方法清洗掉XML语法部分,这种方法确实可以解决,但是Scrapy是个成熟的框架,他已经为我们提供好了现成的轮子那就是XMLFeedSpider

简单介绍

XMLFeedSpider主要为解析XML格式而设计的,通过使迭代各个节点来分析XML源。迭代器可以从以下选项中选择:iternodes , xml 和 html . 迭代器 xml 和 html 迭代一次需要读取整个DOM以便解析它, 由于性能原因建议使用 iternodes。然而在使用错误标记解析XML时,使用html作为迭代器可能很有用。

相关属性

iterator

定义:使用迭代器的名称。

  • 'iternodes' -基于正则表达式的快速迭代器
  • 'html' -使用的迭代器 Selector . 请记住,这使用了DOM解析,必须将所有的DOM加载到内存中,这对于大型提要来说可能是一个问题。
  • 'xml' -使用的迭代器 Selector . 请记住,这使用了DOM解析,必须将所有的DOM加载到内存中,这对于大型提要来说可能是一个问题。

默认为:'iternodes' .

itertag

定义:具体要迭代的节点(或者元素)名称。例子:

itertag = 'root'

除了这些新属性之外,这个蜘蛛还具有以下可重写的方法:

相关方法

adapt_response(response)

该方法在spider开始分析response前被调用。您可以在response被分析之前使用该函数来修改内容(body)。该方法接受一个response并返回一个response(可以相同也可以不同)。

parse_node(response, selector)

对与提供的标记名匹配的节点调用此方法 (itertag )接收响应和 Selector 对于每个节点。重写此方法是必须的。否则,你的蜘蛛就不能工作了。此方法必须返回 item object ,A Request 对象,或包含任何对象的iterable。

process_results(response, results)

当spider返回结果(item或request)时该方法被调用。它用于在将结果返回到框架核心之前执行所需的任何最后一次处理。

使用示例

class ChengdenatureresourceproSpider(XMLFeedSpider):
    name = 'ChengDeNatureResourcePro'
    start_urls = ['http://shj.chengde.gov.cn/col/col823/index.html']
    iterator = 'iternodes' # 设置迭代器名称
    itertag = 'datastore' # 设置迭代节点 传入下方的selector则是datastore节点

    def parse_node(self, response, selector):
        source_li= selector.css("recordset record::text").getall()
        item = {}
        for li in source_li:
            # 使用正则提取 名称 时间 和 地址
            pattern = re.search(r'<a href="(.*?)">(.*?)</a>.*<span>(.*?)</span>', li)
            item['title_name'] = pattern.group(2)
            item['title_date'] = pattern.group(3)
            item['title_url'] ="http://shj.chengde.gov.cn"+ str(pattern.group(1))
            print(item)

总结

使用XMLFeedSpider处理”杂交“类型的页面 会比原始的处理方法 干净 清爽很多 但是 其实整体逻辑没有太大变化


https://www.xamrdz.com/bigdata/7bv1996442.html

相关文章: