爬虫学习02_数据提取

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()'))

posted @ 2020-07-04 16:51  Jerome12138  阅读(155)  评论(0)    收藏  举报