前言
在上一篇文章(小白学爬虫(四)– 数据提取之json)介绍了如何使用json来提取数据,其实也就是json.loads()和json.dump()两个方法,另外注意一下json.dump()方法的两个属性(ensure_ascii、indent)。但是这种方式有很强的局限性,那就是只能处理json数据。这里将介绍对于一般的HTML页面如何进行数据的提取。
xpath helper插件
xpath是一门从html中提取数据的语言。
在介绍具体的方法之前先来介绍一下如何在浏览器中找到我们需要的数据对应的HTML标签。需要安装一个google插件 xpath helper ,
xpath helper的安装
具体见:xpath helper 谷歌浏览器插件 网盘地址 下载 使用。我也是安照这篇博文安装的。
xpath helper基本使用
这里以豆瓣电影排行榜为例。
1, 选择节点(标签)
“/html/head/meta” 表示选择 html 标签下的 head 标签 下的 mata 标签
可以看到,在Query窗口输入之后,在Results窗口出现了 8 个结果。另外在elements 下面可以看到 meta标签 都多了一个 class=”xh-hightlight” ,只要出现了:class=”xh-hightlight”,就代表选中了这个标签。2, “//” 能够定义任意节点下的所有标签
“//div” 表示选择页面下所有的div标签。
3, @ 符号的用法
1,选择某个具体的标签
“//div[@id=”footer”]”选择当前页面下 id = “footer” 的div标签
2,获取某个标签的参数
//div[@id=”wrapper”]//tr[@class=”item”]//a[@title=”死侍2”]/@href
4, 获取文本
- ”/a/text()” : 获取 a 的文本, 但是不包含子标签的文本
- “/a//text()” : 获取 a 的文本, 包含子标签的文本
- 5,”./”表示当前路径下的xxx
- 比如:”./a” : 表示当前路径下的a标签
xpath 的基本语法就这些,如何在程序里面使用才是最主要的
lxml
lxml的安装
首先安装lxml, 一般都会出错,而且是那个 .whl 文件的问题。教程挺多的 这里就不贴了。安装好了lxml就可以开始写程序了。
lxml的使用
from lxml import etree
element = etree.HTML(""html字符串")
element.xpath("")
首先从lxml中导入etree类,然后使用etree类的HTML()方法,参数是一个html字符串,它会返回一个element对象,然后就可以使用 xpath 方法了,在这个方法里面写路径就可以了。
豆瓣电影爬取实例
下面是一个爬取豆瓣电影排行榜的例子。包括电影名、分数、评论数
import requests
from lxml import etree
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36"
}
class DouBan:
def __init__ (self):
self.url="https://movie.douban.com/chart"
def getReponse(self, url):
reponse = requests.get(url,headers=headers)
html_str = reponse.content.decode("utf-8")
return html_str
def getData(self, html_str):
element = etree.HTML(html_str)
table_list = element.xpath("/html/body//table");
#print(table_list) # 每一个table元素都是一个element对象,因此可使用.xpath方法
del table_list[0] # 因为第一个元素是空元素,所以去掉
for table in table_list:
item = {}
item["title"] = table.xpath(".//div[@class='pl2']//a/text()")[0].replace("/","").strip()
item["grade"] = table.xpath(".//div[@class='star clearfix']/span[@class='rating_nums']/text()")[0]
item["rate"] = table.xpath(".//div[@class='star clearfix']/span[@class='pl']/text()")[0]
# 保存数据
with open("douban.txt", "a", encoding="utf-8") as f:
f.write(str(item)+'\n')
print(item)
def run(self):
# 获取响应页面
#print(self.url)
html_str = self.getReponse(self.url)
# 从响应中提取数据并存储
self.getData(html_str)
db = DouBan()
db.run()
最后结果: