前言requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html。之前解析html页面用过了lxml和bs4, requests-html集成了一些常用爬虫库的优点,依然是为人类服务:HTML Parsing for Humans。 目前只支持python3.6 环境准备requests-html的GitHub地址https://github.com/kennethreitz/requests-html,使用pip就能直接安装了。 pip install requests-html
该库旨在使解析HTML(例如,抓取Web)尽可能简单直观, 有以下优势: 抓页面url地址先发个get请求,返回response对象,通过r.html.links获取页面的全部链接,包含一些相对路径的地址,如果只想获取绝对路径的地址,可以用r.html.absolute_links from requests_html import HTMLSession session = HTMLSession()
r = session.get('https:///')
# 获取页面上的所有链接 all_links = r.html.links print(all_links)
# 绝对路径链接 all_absolute_links = r.html.absolute_links print(all_absolute_links) 运行结果, 返回内容太多,省略了一部分: {'http://pycon./', '/community/', 'http:///dev/peps/', '/events/python-events/831/', , 'http://www.'} {'http://pycon./', 'https://www./dev/', 'https://wiki./PySide', 'https://www./events/python-events/817/'} 从返回的结果可以看出,返回的是set集合,会自动的去除重复的链接地址 xpath定位用过lxml库的小伙伴应该知道https://www.cnblogs.com/yoyoketang/p/9661273.html,lxml可以支持xpath查找元素对象,requests-html也可以完美的支持xpath 接下来我需要获取目标网站:https://www.cnblogs.com/yoyoketang/tag/django/, 获取所有的文章标题,xpath语法:.//*[@id=’myposts’]/div/div/a 
参考代码 from requests_html import HTMLSession session = HTMLSession()
r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/') # 只获取第一个 f = r.html.xpath(".//*[@id='myposts']/div/div/a", first=True).text print(f)
# 获取全部 all = r.html.xpath(".//*[@id='myposts']/div/div/a") for i in all: print(i.text) # 获取文本 print(i.absolute_links) # 获取链接 运行结果 python测试开发django-49.allow_tags和mark_safe python测试开发django-49.allow_tags和mark_safe {'https://www.cnblogs.com/yoyoketang/p/10659137.html'} python测试开发django-48.xadmin上传图片django-stdimage {'https://www.cnblogs.com/yoyoketang/p/10655601.html'} python测试开发django-47.xadmin上传图片和文件 {'https://www.cnblogs.com/yoyoketang/p/10653878.html'} xpath方法返回是一个list,加上 first=True参数返回第一个结果 css定位支持requests-html同样支持CSS Selector的方法,把上面案例用css定位也可以实现同样效果 from requests_html import HTMLSession session = HTMLSession()
r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/') # 只获取第一个 css语法 f = r.html.find(".PostList>div>a", first=True).text print(f)
# 获取全部 css语法 all = r.html.find(".PostList>div>a") for i in all: print(i.text) # 获取文本 print(i.absolute_links) # 获取链接 其它方法from requests_html import HTMLSession session = HTMLSession()
r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/')
about = r.html.find(".PostList>div", first=True)
# 1.获取文本 print(about.text)
# 2.获取html内容 print(about.html)
# 3.获取全部属性 print(about.attrs)
# 4.获取链接 print(about.absolute_links )
# 5.搜索文字 print(about.search('python测试开发{}和mark_safe')[0])
# 6.继续定位子元素 print(about.find('a')) # 返回list element对象
# 7.containing 模糊匹配 只包含'django'文本的对象 a = about.find('a', containing='django') print(a) 运行结果 python测试开发django-49.allow_tags和mark_safe <div class="postTitl2"><a href="https://www.cnblogs.com/yoyoketang/p/10659137.html" id="PostsList1_rpPosts_TitleUrl_0">python测试开发django-49.allow_tags和mark_safe</a></div> {'class': ('postTitl2',)} {'https://www.cnblogs.com/yoyoketang/p/10659137.html'} django-49.allow_tags [<Element 'a' href='https://www.cnblogs.com/yoyoketang/p/10659137.html' id='PostsList1_rpPosts_TitleUrl_0'>] [<Element 'a' href='https://www.cnblogs.com/yoyoketang/p/10659137.html' id='PostsList1_rpPosts_TitleUrl_0'>] 这些只是一些基本的功能,requests-html还可以支持JavaScript渲染页面,看下一篇python接口自动化29-requests-html支持JavaScript渲染页面 2019年《python3接口自动化》课程3月17-4月14开课 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学 上课时间:每周六、周日晚上20:30-22:30 报名费:1000
|