前言

python拥有众多的爬虫框架,其中最简单的莫过于requests-html了。它和著名的网络请求库requests是同一个作者,着重于XML数据提取,可以说是最简单的爬虫框架了。

环境安装

pip install requests-html

该库旨在解析HTML(例如,抓取Web)尽可能简单直观,有以下优势

完整的JavaScript支持

CSS Selectors(又名jQuery风格,感谢PyQuery)

XPath Selectors,对于胆小的人来说。

模拟用户代理(如真实的Web浏览器)

自动跟踪重定向。

连接池和cookie持久性

令人欣喜的请求体验,具有神奇的解析能力。

异步支持

抓页面url地址

先发个get请求,返回response对象,通过r.html.links获取页面的全部链接,包含一些相对的地址,如果只想获取绝对路径的地址,可以用r.html.absolute_links

from requests_html import HTMLSession
session=HTMLSession()
r=session.get("https://www.baidu.com/")
#获取页面上的所有链接
all_links=r.html.links
print(all_links)
print(type(all_links))
print(len(all_links))
#绝对路径链接
all_absolute_links=r.html.absolute_links
print(all_absolute_links)
print(len(all_absolute_links))

运行结果


从返回的结果可以看出,返回的是set集合,会自动的去除重复的链接地址

xpath定位

用过lxml库的小伙伴应该知道,lxml可以支持xpath查找元素对象,requests-html也可以完美的支持xpath

接下来我需要获取目标网站:(备注,下面尝试的是未登陆状态,所以这里的网址是不登录,可以访问的),获取所有的文章标题,

谷歌浏览器中打开该网站,按F12,弹出DevTools,根据下图步骤,复制xpath地址。

鼠标在href行时,xpath地址: //*[@id="main"]/div[2]/h5/a;尝试其它文章标题,xpath地址://*[@id="main"]/div[1]/h5/a;发现div后面的数字不同,所以若是想提取到所有文章的href行,则将数字去掉,//*[@id="main"]/div/h5/a


参考代码:

from requests_html import HTMLSession
session=HTMLSession()
r=session.get("")
#只获取第一个
one=r.html.xpath("//*[@id='main']/div/h5/a/span",first=True).text
print("one:{}".format(one))
#获取全部
f=r.html.xpath("//*[@id='main']/div/h5/a/span")
print(type(f),len(f))
u=r.html.xpath("//*[@id='main']/div/h5/a")
for i,j in zip(f,u):
print(i.text,j.absolute_links) #文本,链接

运行结果


xpath方法返回是一个list,加上first=True参数返回第一个结果

css定位支持

rquests-html同样支持CSS Selector的方法,把上面案例用css定位也可以实现同样效果

from requests_html import HTMLSession
session=HTMLSession()
r=session.get("")
#只获取第一个 css语法
one=r.html.find(".post>h5>a>span",first=True).text
print("one:{}".format(one))
#获取全部 css语法
f=r.html.find(".post>h5>a>span")
print(type(f),len(f))
u=r.html.find(".post>h5>a")
for i,j in zip(f,u):
print(i.text,j.absolute_links) #文本,链接
其它方法
from requests_html import HTMLSession
session=HTMLSession()
r=session.get("")
a=r.html.find(".post>h5",first=True)
#1.获取文本
print(a.text)
#2.获取html内容
print(a.html)
#3.获取全部属性
print(a.attrs)
#4.获取链接
print(a.absolute_links)
#5.搜索文字
print(a.search('python接口自动化({}) urlencode编码%E7%94%9F%E6%B4%BB与解码')[0])
#6.继续定位子元素
print(a.find('a'))
#7.containing 模糊匹配 只包含‘python'文本的对象
b=a.find('a',containing='python')
print(b)

运行结果

python接口自动化(二十五) urlencode编码%E7%94%9F%E6%B4%BB与解码


python接口自动化(二十五) urlencode编码%E7%94%9F%E6%B4%BB与解码