目录

一 介绍

  Python上有一个非常著名的HTTP库——requests,相信大家都听说过,用过的人都说非常爽!现在requests库的作者又发布了一个新库,叫做requests-html,看名字也能猜出来,这是一个解析HTML的库,具备requests的功能以外,还新增了一些更加强大的功能,用起来比requests更爽!接下来我们来介绍一下它吧。

# 官网解释
'''
This library intends to make parsing HTML (e.g. scraping the web) as simple and intuitive as possible. If you’re interested in financially supporting Kenneth Reitz open source, consider visiting this link. Your support helps tremendously with sustainability of motivation, as Open Source is no longer part of my day job. When using this library you automatically get: - Full JavaScript support!
- CSS Selectors (a.k.a jQuery-style, thanks to PyQuery).
- XPath Selectors, for the faint at heart.
- Mocked user-agent (like a real web browser).
- Automatic following of redirects.
- Connection–pooling and cookie persistence.
- The Requests experience you know and love, with magical parsing abilities.
- Async Support
'''

  

  官网告诉我们,它比原来的requests模块更加强大,并且为我们提供了一些新的功能!

  • 支持JavaScript
  • 支持CSS选择器(又名jQuery风格, 感谢PyQuery)
  • 支持Xpath选择器
  • 可自定义模拟User-Agent(模拟得更像真正的web浏览器)
  • 自动追踪重定向
  • 连接池与cookie持久化
  • 支持异步请求

二 安装

  安装requests-html非常简单,一行命令即可做到。需要注意一点就是,requests-html只支持Python 3.6或以上的版本,所以使用老版本的Python的同学需要更新一下Python版本了。

# pip3 install requests-html

三 如何使用requests-html?

  在我们学爬虫程序的时候用得最多的请求库就是requests与urllib,但问题是这些包只给我们提供了如何去目标站点发送请求,然后获取响应数据,接着再利用bs4或xpath解析库才能提取我们需要的数据。

import requests

from bs4 import BeautifulSoup

url = 'http://www.zuihaodaxue.cn/'

HEADERS = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
} response = requests.get(url, headers=HEADERS) response.encoding = 'gbk' # print(response.status_code)
# print(response.text) soup = BeautifulSoup(response.text, 'lxml') # 获取最新的五则新闻
post_rankings = soup.find_all(name='article', attrs={"class": "post_ranking"}) # 循环打印新闻简介内容
for post_ranking in post_rankings:
new = post_ranking.find(name='div', attrs={"class": 'post_summary'})
print(new.text)

以往爬虫的请求与解析

  而在requests-html里面只需要一步就可以完成而且可以直接进行js渲染!requests的作者Kenneth Reitz 开发的requests-html 爬虫包 是基于现有的框架 PyQuery、Requests、lxml、beautifulsoup4等库进行了二次封装,作者将Requests的简单,便捷,强大又做了一次升级。

  requests-html和其他解析HTML库最大的不同点在于HTML解析库一般都是专用的,所以我们需要用另一个HTTP库先把网页下载下来,然后传给那些HTML解析库。而requests-html自带了这个功能,所以在爬取网页等方面非常方便。

  1、基本使用

from requests_html import HTMLSession

# 获取请求对象
session = HTMLSession() # 往新浪新闻主页发送get请求
sina = session.get('https://news.sina.com.cn/')
# print(sina.status_code)
sina.encoding = 'utf-8' # 获取响应文本信息,与requests无区别
# print(sina.text)

  2、获取链接(links与abolute_links)

    links返回的结果                                  absolute_links返回的结果

            

from requests_html import HTMLSession

# 获取请求对象
session = HTMLSession() # 往京东主页发送get请求
jd = session.get('https://jd.com/') # 得到京东主页所有的链接,返回的是一个set集合
print(jd.html.links)
print('*' * 1000) # 若获取的链接中有相对路径,我们还可以通过absolute_links获取所有绝对链接
print(jd.html.absolute_links)

  3、CSS选择器与XPATH

  request-html支持CSS选择器和XPATH两种语法来选取HTML元素。首先先来看看CSS选择器语法,它需要使用HTML的 find 函数来查找元素。

'''
  CSS选择器 and XPATH
  1.通过css选择器选取一个Element对象
  2.获取一个Element对象内的文本内容
  3.获取一个Element对象的所有attributes
   4.渲染出一个Element对象的HTML内容
  5.获取Element对象内的特定子Element对象,返回列表
  6.在获取的页面中通过search查找文本
   7.支持XPath
   8.获取到只包含某些文本的Element对象
'''
from requests_html import HTMLSession

session = HTMLSession()
url = "https://www.qiushibaike.com/text/" # 获取响应数据对象
obj = session.get(url) # 1.通过css选择器选取一个Element对象
# 获取id为content-left的div标签,并且返回一个对象
content = obj.html.find('div#content-left', first=True) # 2.获取一个Element对象内的文本内容
# 获取content内所有文本
print(content.text) # 3.获取一个Element对象的所有attributes
# 获取content内所有属性
print(content.attrs) # 4.渲染出一个Element对象的完整的HTML内容
html = content.html
print(html) # 5.获取Element对象内的指定的所有子Element对象,返回列表
a_s = content.find('a')
print(a_s)
print(len(a_s)) # # 循环所有的a标签
for a in a_s:
# 获取a标签内所有属性的href属性 并拼接
href = a.attrs['href']
if href.startswith('/'):
url = 'https://www.qiushibaike.com' + href
print(url) # 6.在获取的页面中通过search查找文本
# {}大括号相当于正则的从头到后开始匹配,获取当中想要获取的数据
text = obj.html.search('把{}夹')[0] # 获取从 "把" 到 "夹" 字的所有内容
text = obj.html.search('把糗事{}夹')[0] # 获取从把子到夹字的所有内容
print(text) print('*' * 1000) # 7.支持XPath
a_s = obj.html.xpath('//a') # 获取html内所有的a标签
for a in a_s:
href = a.attrs['href'] # 若是//开头的url都扔掉
if href.startswith('//'):
continue # 若是/开头的都是相对路径
elif href.startswith('/'):
print('https://www.qiushibaike.com' + href) # 8.获取到只包含某些文本的Element对象(containing)
# 获取所有文本内容为幽默笑话大全_爆笑笑话_笑破你的肚子的搞笑段子 - 糗事百科 title标签
# 注意: 文本内有空格也必须把空格带上
title = obj.html.find('title', containing='幽默笑话大全_爆笑笑话_笑破你的肚子的搞笑段子 - 糗事百科')
print(title)

view code

四 支持JavaScript

  支持JavaScript是我觉得作者更新后最为牛逼的一个地方,但是需要在第一次执行render的时候下载chromeium,然后通过它来执行js代码。

1、render的使用

from requests_html import HTMLSession

session = HTMLSession()

url = 'http://www.win4000.com/'

obj = session.get(url)

obj.encoding = 'utf-8'

obj.html.render()  

  注意:第一次运行render()方法时,它会将Chromium下载到您的主目录中(例如~/.pyppeteer/)。这种情况只发生一次。

2、 下载Chromeium问题

  因为是从国外的站点下载几分钟才3%,实在是太慢了。所以我们需要通过国内的镜像去下载!需要做以下几步:

    • 手动下载Chrome

      先去国内源下载自己需要的版本,地址:https://npm.taobao.org/mirrors/chromium-browser-snapshots/
    • 修改chromeium_downloader.py文件
      下载后之后解压后,进入python安装目录下的\Lib\site-packages\pyppeteer目录, 并打开chromium_downloader.py文件。
      # 找到自己的操作系统相应的配置位置
      '''
      chromiumExecutable = {
      'linux': DOWNLOADS_FOLDER / REVISION / 'chrome-linux' / 'chrome',
      'mac': (DOWNLOADS_FOLDER / REVISION / 'chrome-mac' / 'Chromium.app' /
      'Contents' / 'MacOS' / 'Chromium'),
      'win32': DOWNLOADS_FOLDER / REVISION / 'chrome-win32' / 'chrome.exe',
      'win64': DOWNLOADS_FOLDER / REVISION / 'chrome-win32' / 'chrome.exe',
      }
      '''
      from pyppeteer import __chromium_revision__, __pyppeteer_home__ DOWNLOADS_FOLDER = Path(__pyppeteer_home__) / 'local-chromium'
      REVISION = os.environ.get('PYPPETEER_CHROMIUM_REVISION', __chromium_revision__) # 打印这两个变量可以知道执行的驱动具体位置
      print(DOWNLOADS_FOLDER)
      print(REVISION) '''
      由上面可以知道:chromium路径是:C:\Users\Ray\AppData\Local\pyppeteer\pyppeteer\local-chromium\575458\chrome-win32\chrome.exe 所以自己建文件夹,然后一直到chrome-win32文件夹,把上面下载的chromium文件,拷贝到此目录下
      '''

五 自定义User-Agent

  有些网站会使用User-Agent来识别客户端类型,有时候需要伪造UA来实现某些操作。如果查看文档的话会发现HTMLSession上的很多请求方法都有一个额外的参数**kwargs,这个参数用来向底层的请求传递额外参数。我们先向网站发送一个请求,看看返回的网站信息。

from requests_html import HTMLSession
# pprint可以把数据打印得更整齐
from pprint import pprint
import json
get_url = 'http://httpbin.org/get' session = HTMLSession() # 返回的是当前系统的headers信息
res = session.get(get_url)
pprint(json.loads(res.html.html)) # 可以在发送请求的时候更换user-agent
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0'
post_url = 'http://httpbin.org/get'
res = session.get(post_url, headers={'user-agent': ua})
pprint(json.loads(res.html.html)) # 如果你有需要可以在header中修改其他参数。

六 模拟表单提交(POST)

  HTMLSession封装了一整套的HTTP方法,包括get、post、delete等, 对应HTTP中各个方法。

# 表单登录
r = session.post('http://httpbin.org/post', data={'username': 'tank_jam', 'password': 'tank9527'})
pprint(json.loads(r.html.html))
''' # 打印结果
{'args': {},
'data': '',
'files': {},
'form': {'password': 'tank9527', 'username': 'tank_jam'},
'headers': {'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Content-Length': '35',
'Content-Type': 'application/x-www-form-urlencoded',
'Host': 'httpbin.org',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) '
'AppleWebKit/603.3.8 (KHTML, like Gecko) '
'Version/10.1.2 Safari/603.3.8'},
'json': None,
'origin': '112.65.61.109, 112.65.61.109',
'url': 'https://httpbin.org/post'}
'''

七 支持异步请求

  requests-html内部就封装好了aynsc异步请求的功能,可以提高我们的爬虫效率。

from requests_html import AsyncHTMLSession
from requests_html import HTMLSession
import time # 使用异步发送请求
async_session = AsyncHTMLSession() async def get_baidu():
url = 'https://www.baidu.com/'
res = await async_session.get(url)
print(res.html.absolute_links) async def get_sougou():
url = 'https://www.sogou.com/'
res = await async_session.get(url)
print(res.html.links) start_time = time.time()
async_session.run(get_baidu, get_sougou)
print('耗时:', time.time() - start_time) # 同步发送请求
session = HTMLSession() start_time = time.time()
res = session.get('https://www.baidu.com/')
print(res.html.links)
res = session.get('https://www.sogou.com/')
print(res.html.absolute_links)
print('耗时:', time.time() - start_time)

requests-html的更多相关文章

  1. requests的content与text导致lxml的解析问题

    title: requests的content与text导致lxml的解析问题 date: 2015-04-29 22:49:31 categories: 经验 tags: [Python,lxml, ...

  2. requests源码阅读学习笔记

    0:此文并不想拆requests的功能,目的仅仅只是让自己以后写的代码更pythonic.可能会涉及到一部分requests的功能模块,但全看心情. 1.另一种类的初始化方式 class Reques ...

  3. Python爬虫小白入门(二)requests库

    一.前言 为什么要先说Requests库呢,因为这是个功能很强大的网络请求库,可以实现跟浏览器一样发送各种HTTP请求来获取网站的数据.网络上的模块.库.包指的都是同一种东西,所以后文中可能会在不同地 ...

  4. 使用beautifulsoup与requests爬取数据

    1.安装需要的库 bs4 beautifulSoup  requests lxml如果使用mongodb存取数据,安装一下pymongo插件 2.常见问题 1> lxml安装问题 如果遇到lxm ...

  5. python爬虫学习(6) —— 神器 Requests

    Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 H ...

  6. ImportError: No module named 'requests'

    补充说明: 当前环境是在windows环境下 python版本是:python 3.4. 刚开始学习python,一边看书一边论坛里阅读感兴趣的代码, http://www.oschina.net/c ...

  7. Python-第三方库requests详解

    Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTT ...

  8. Requests 乱码

    当使用Requests请求网页时,出现下面图片中的一些乱码,我就一脸蒙逼. 程序是这样的. def getLinks(articleUrl): headers = { "Uset-Agent ...

  9. 爬虫requests模块 2

    会话对象¶ 会话对象让你能够跨请求保持某些参数.它也会在同一个 Session 实例发出的所有请求之间保持 cookie, 期间使用 urllib3 的 connection pooling 功能.所 ...

  10. 爬虫requests模块 1

    让我们从一些简单的示例开始吧. 发送请求¶ 使用 Requests 发送网络请求非常简单. 一开始要导入 Requests 模块: >>> import requests 然后,尝试 ...

随机推荐

  1. C# HTTP系列10 form表单的enctype属性

    系列目录     [已更新最新开发文章,点击查看详细] 在ASP.NET编程中经常遇到下面的代码片段,将人员信息以表单方式提交到后台程序并保存到服务器与数据库中. <form action=&q ...

  2. Python Web编程

    1.统一资源定位符(URL) URL用来在Web上定位一个文档.浏览器只是Web客户端的一种,任何一个向服务器端发送请求来获取数据的应用程序都被认为是客户端 URL格式:port_sch://net_ ...

  3. Kelp.Net是一个用c#编写的深度学习库

    Kelp.Net是一个用c#编写的深度学习库 基于C#的机器学习--c# .NET中直观的深度学习   在本章中,将会学到: l  如何使用Kelp.Net来执行自己的测试 l  如何编写测试 l  ...

  4. Unity Shader 屏幕后效果——景深

    景深效果的原理是,在摄像机的近裁剪平面和远裁剪平面之间可以设置一个焦距,在这个距离所在的平面上的物体最为清晰,而这个距离之前或之后的物体成像是一种模糊状态(根据距离逐渐模糊,最终达到最为模糊的状态). ...

  5. axios的各种传参方式

    axios的各种传参方式 1. params方式 axios({ url: '/users', method: 'get', params: { id: '11111', name: '22222' ...

  6. Dubbo简介与使用

    1:Dubbo是什么 阿里生产的一种rpc 实现框架  Dubbo 是一个分布式服务框架,是阿里巴巴开源项目 ,被国内电商及互联网项目中使用. Dubbo 致力于提供高性能和透明化的RPC远程服务调用 ...

  7. 你知道Object中有哪些方法及其作用吗?

    一.引言二.Object方法详解1.1.registerNatives()1.2.getClass()1.2.1.反射三种方式:1.3.hashCode()1.4.equals()1.4.clone( ...

  8. c# asp.net core取当月第一天和最后一天及删除最后一个字符的多种方法

    当月第一天0时0分0秒 DateTime.Now.AddDays( - DateTime.Now.Day).Date 当月最后一天23时59分59秒 DateTime.Now.AddDays( - D ...

  9. Python 绘图与可视化 matplotlib text 与transform

    Text 为plots添加文本或者公式,反正就是添加文本了 参考链接:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.text.html#ma ...

  10. python 双层for循环,在第二层的for循环中的else中的continue,会退出到第一层for循环继续执行

    for a in [1,2,3,4,5]: for b in [1,2,3]: if a == b: print("a = b = %s" % a) break # 退出本次for ...