scrapy爬虫—获取script中的data数据

初涉scrapy,在项目中的爬虫需求中,遇到了需要获取html中的script标签中的data数据,:

获取的方式有很多

1.原生response.xpath()获取

response.xpath("//body//script/text()")就可以拿到该script的标签内容,之后对字符串进行处理分析,转换为json之类的都可以

2.使用正则表达式,直接获取类似title的内容:

for match in re.finditer("title":"(.*?)",response.text):
    print(match.group())

#返回结果
# "title": "安砾"
# "title": "陈卓"
# "title": "金涛"
# "title": "鞠建东"
# "title": "李波"
# "title": "廖理"

正则表达式:"title":"(.*?)"

3.使用js2xml分析获取

还有另外一种方法,就是使用js2xml进行分析获取,js2xml已经支持python3.6

js2xml是将javascript代码转换为xml document的工具,转换之后,可以更加方便的通过使用xpath提取数据

js2xml安装

  1. scrapy下控制台输入:pip install js2xml
  2. 在集成环境下输入:,过程如下

详细代码如下:

import scrapy
import time
import datetime
import pymongo
from lxml import html, etree
from scrapy.selector import Selector
import js2xml
from bs4 import  BeautifulSoup
import re

class PbcsftsinghuaeducnSpider(scrapy.Spider):
    name = PbcsfTsinghuaEduCn
    allowed_domains = [pbcsf.tsinghua.edu.cn]
    
    def start_requests(self):
        url = http://www.pbcsf.tsinghua.edu.cn/portal/list/index/id/10.html
        yield scrapy.Request(url, dont_filter=True, callback=self.parse)
    def parse(self, response):
        demo = response.text
        soup = BeautifulSoup(demo, html)
        icount = 1
        for script in soup.select(body script):
            icount += 1
            if icount > 7:
                pass
            else:
                script_text = js2xml.parse(script.string, encoding=utf-8, debug=False)
                script_tree = js2xml.pretty_print(script_text)
                selector = etree.HTML(script_tree)
                for obj in selector.xpath("//var[@name=data]//object"):
                    url = str(response.urljoin(obj.xpath(".//property[@name=url]/string/text()")[0]))
                    name = str(obj.xpath(".//property[@name=title]/string/text()")[0])
                    print(name+:	+url)
经验分享 程序员 微信小程序 职场和发展