爬虫数据获取三种方式
bs4
xpath
re(正则表达式)
bs4
Beautiful Soup 是一个HTML/XML 的解析器,主要用于解析和提取 HTML/XML 数据。
requests.get–(获得)–>HTML字符串–(解析)–>HTML文档
1.导入: from bs4 import BeautifulSoup
2.使用:
创建BeautifulSoup对象
soup = BeautifulSoup (html,"lxml")
bs4库的HTML内容遍历方法
平行:同辈
上行:前辈
下行:晚辈
bs4库的HTML内容的常用查找方法
.find() | 搜索且只返回一个结果 |
---|---|
.find_parents() | 在先辈节点中搜索,返回列表类型 |
.find_parent() | 在先辈节点中返回一个结果 |
1.获取所有标签:
soup.find_all()[标签位置] 输出结果为列表
2.获取指定标签:
2.1.soup.find_all(‘标签’,‘属性’)
2.2.soup.find_all(‘标签’,attrs={属性})
3.获取标签的属性值:
soup.find_all(‘属性’)
3.1通过下标方式:
alist = soup.find_all('a')
for a in alist:
href = a['href']
3.2利用attrs参数提取
alist = soup.find_all('a')
for a in alist:
href = a.attrs['href']
实战: 中国大学排名定向爬取
# 导入库
import requests
from bs4 import BeautifulSoup
import bs4
#获取页面内容
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "异常"
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
tbody = soup.tbody
for tr in tbody.children:
if isinstance(tr, bs4.element.Tag):
#找出所有td标签啊
tds = tr.find_all('td')
# 提取前四个内容
ulist.append([tds[0].string, tds[1].string, tds[3].string])
# 对中英文混排输出问题进行优化:对format(),设定宽度和添加参数chr(12288)
def printUnivList(ulist, num=20):
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format('排名', '学校名称', '总分', chr(12288)))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], chr(12288)))
u_info = [] # 存储爬取结果的容器
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'
html = getHTMLText(url)
fillUnivList(u_info, html) # 爬取
printUnivList(u_info, num=30) # 打印输出30个信息
Xpath
XPath 用于在HTML文档中通过元素(HTML标签)
和属性(HTML标签的属性)
进行的数据定位
1.环境配置
Xpath插件下载以及环境配置步骤
2.Xpath语法
nodename | 选取此节点的所有子节点。 |
---|---|
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
… | 选取当前节点的父节点 |
@ | 选取属性 |
/text() | 提取标签下面的文本内容 |
//目标标签上一层/目标标签[@所在标签属性][目标属性位置]/text()
lxml
lxml是一个HTML解析器,主要功能是解析和提取HTML数据
1.导入:from lxml import etree
2.使用
解析html字符串:etree.HTML
解析html文件:etree.parse
Xpath-lxml
一般步骤
- 导入必要的库/模块 定义网页和请求头(有的比较简单不用请求头)
- 获取html页面(注意!编码和解码问题)
- etree解析
- 据网页源码,查标签特征
- 通过XPath获取标签内容(/text()与string())
- 存储数据
实战:丁香园用户名和回复内容的抓取
注意! 回复内容有换行标签,后用了string(),前不用加/text()
因为疏忽这点花费了一些时间
# 导入库
from lxml import etree
import requests
url = "http://www.dxy.cn/bbs/thread/626626#626626"
#获取url的html
req = requests.get(url)
html = req.text
#lxml解析html
tree = etree.HTML(html)
#利用Xpath表达式获取user和content
user = tree.xpath('//div[@class="auth"]/a/text()')
content = tree.xpath('//td[@class="postbody"]')
results = []
for i in range(0, len(user)):
# 因为回复内容中有换行等标签,所以需要用string()来获取数据
results.append(user[i].strip() + ": " + content[i].xpath('string(.)').strip())
# 打印爬取的结果
for i,result in zip(range(0, len(user)),results):
print("user" + "-" + result)
print("*"*100)
re库
re是数据提取中解析速度最快的,同时难度也是最大的。
1.re库的调用
import re
2.re库的使用
正则表达式规则大全
主要函数
贪婪匹配与最小匹配