爬虫学习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() # 匹配任何类型节点 | # 或
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()'))