首页 > 技术文章 > 爬虫学习02_数据提取

JeromeLong 2020-07-04 16:51 原文

JSON数据

哪里能找到返回json的url呢?
1、使用chrome切换到手机页面
2、抓包手机app的软件

JSONView插件,方便查看json数据

有时候url里有callback参数,可以直接去除,得到想要的数据

json.loads()
json.dumps(ret,ensure_ascii=False,indent=4)   # 不转换成ascii码,且使用4空格缩进

json使用注意点

  • json中的字符串都是双引号引起来的,如果不是双引号需要进行预处理:

    • eval:能实现简单的字符串和python类型的转化
    • replace:把单引号替换为双引号
  • 往一个文件中写入多个json串,不再是一个json串,不能直接读取

    • 解决办法:一行写一个json串,按照行来读取

正则使用的注意点

  • re.findall("a(.*?)b","str"),能够返回括号中的内容,括号前后的内容起到定位和过滤的效果

  • 原始字符串r,待匹配字符串中有反斜杠的时候,使用r能够忽视反斜杠带来的转义的效果

  • 点号默认情况匹配不到\n

  • \s能够匹配空白字符,不仅仅包含空格,还有\t|\r\n

  • 匹配中文需要先将字符串编码成utf8格式

XPath

XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,
可用来在 HTML\XML 文档中对元素和属性进行遍历。
W3School官方文档

使用xpath helper或者是chrome中的copy xpath都是从element中提取的数据,但是爬虫获取的是url对应的响应,往往和elements不一样

  • 获取文本text()

      a/text()     # 只能获取a下的文本
      a//text()    # 能够获取a下的和a包含的标签的文本
      //a[text()='下一页']    # 选择文本为下一页三个字的a标签
    
  • @符号

      a/@href     # 获取属性
      //ul[@id="detail-list"]     # 筛选属性
      //ul[contains(text(),'今日更新')]   # 筛选包含字段的节点
    
  • //

      //...    # 在xpath最前面表示从当前html中任意位置开始选择
      li//a    # 放在节点后面的时候,能够选择当前节点下的所有的标签
    
  • xpath获取某一个或者某几个

      //a[1]          # 第一个
      //a[last()]     # 最后一个
      //a[position()<=3]
      //a[1]|//a[3]
    
  • 通配符

      *       # 匹配任何元素节点
      @*      # 匹配任何属性节点
      node()  # 匹配任何类型节点
      |       # 或
    

xpath的更多语法

lxml使用注意点

lxml是一款高性能的 Python HTML/XML 解析器,我们可以利用XPath,来快速的定位特定元素以及获取节点信息

from lxml import etree
html = etree.HTML(text)     # 将字符串转化为Element对象,能够接受bytes和str的字符串
etree.tostring(html)        # 查看转换后的字符串
html.xpath('//a/text()')    # Element对象具有xpath的方法, 结果是一个Element对象的列表(无则为空)

lxml能够修正补全HTML代码,但是可能会改错了

-> 使用etree.tostring观察修改之后的html的样子,根据修改之后的html字符串写xpath

提取页面数据的思路

1. 先分组,渠道一个包含分组标签的列表
2. 遍历,取其中每一组进行数据的提取,不会造成数据的对应错乱

    # 1.设置起始url
    start_url = self.url_temp
    # 2.发送请求,获取响应
    content_str = self.parse_url(start_url)
    # 3.提取数据
    xml = etree.XML(content_str)     # 将字符串转化为Element对象,能够接受bytes和str的字符串
    # etree.tostring(xml)        # 查看转换后的字符串
    print(xml.xpath('//class//text()'))

推荐阅读