python接口自动化(二十六) requests-html爬虫框架

前言

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

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

谷歌浏览器中打开该网站,按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("https://www.cnblogs.com/canglongdao/category/1588084.html")
#只获取第一个
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("https://www.cnblogs.com/canglongdao/category/1588084.html")
#只获取第一个 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("https://www.cnblogs.com/canglongdao/category/1588084.html")
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与解码
<h5>
<a class="entrylistItemTitle" href="https://www.cnblogs.com/canglongdao/p/13451393.html">
<span>python接口自动化(二十五)  urlencode编码%E7%94%9F%E6%B4%BB与解码</span>
</a>
</h5>
{}
{'https://www.cnblogs.com/canglongdao/p/13451393.html'}
二十五
[<Element 'a' class=('entrylistItemTitle',) href='https://www.cnblogs.com/canglongdao/p/13451393.html'>]
[<Element 'a' class=('entrylistItemTitle',) href='https://www.cnblogs.com/canglongdao/p/13451393.html'>]

  

posted on 2020-08-07 15:12  星空6  阅读(473)  评论(0编辑  收藏  举报

导航