前言
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'>]