学习 requests

介绍

requests_html是一个基于requests可以做 HTML parsing 的模块。以前如果想要爬取某个网页数据,简单网页可以用 requests + lxml 通过 xpath 获取数据,但是 requests 不能渲染 JavaScript。所以稍微复杂一点的页面,就需要 Headless 的浏览器,如 Phantomjs,甚至是 Selenium。

requests_html 使用了, 一个非官方的python 实现,启用了 Chrome 来渲染 JavaScript。当有页面元素用 JavaScript 渲染时,也能通过 lxml 来获取到页面元素。

简单例子

使用 requests + lxml,是获取不到百度中「学术」的元素。

使用 requests_html

学习 requests_html

requests_html 是 kennethreitz 写的库,打算通过阅读源码,进一步了解相关内容。

阅读源码好处:

requests_html 是单个文件,比较简单,而且很快就能看完。

学习 Python 3.6 相关语法,尤其是和

学习 pytest 相关用法

v0.1.0

依赖

查看 setup.py, 看到有下面的依赖:

requests

pyquery

html2text

fake-useragent

parse

可以看到还没有依赖 pyppeteer, 只是用 pyquery 和 parse,更方便的解析 HTML。

Test

没有测试用例

代码

代码比较简单,主要是定义了一个 HTML 的类,当用 requests 获取 response 后,通过 hook 调用函数,为添加了一个 HTML 实例。

HTML 类主要有三个功能:

通过传入 CSS 选择器,返回 Element 类的列表。

利用 parse 库,可以定义一个 template,然后返回 search 的内容。

返回页面中的超链接列表。

有趣代码

生成器

返回列表时,都定义了一个生成器,然后函数用 list 返回,而用 set 返回。

比效率高,如果可以剔除重复并且顺序无关,用 set 更专业一点。

PyQuery

pyquery 是 Python 实现的 CSS 选择器,简单的一个例子。

v0.2.0

0.1.0 比较简单,继续下个 tag。

依赖

看到去掉了 html2text,增加了 bs4 (多了 xpath?)。

Test

多了测试用例,先看一下具体的内容。

用了 requests 的, 直接访问了 HTML 文件,然后测试了一下 CSS selector,links,和 xpath。有个小问题是验证时没用,写了个假的测试用例。

代码

主要改动:

提取了一个公共类, Element 和 HTML 都继承于此类。

添加了 xpath,可以用 xpath 来查找元素。

为了获取 link 的绝对路径,将 url 传入 Element 中。

有趣代码

代码不怎么复杂,k神删了 markdown 相关,又抽象了一个基类。

优化是需要贯彻始终的,对于 Python 来说,先实现功能,再不断优化就好。

定义函数中的 *

Python3 中,声明函数中如果有,那么在调用时,后面的参数,是必选要输入的。

例子如下:

当然,name 也可以有默认值,有默认值调用的例子:

继承 requests 的 Session 类

通过继承 requests 的 Session 类,自定义 hooks,可以更方便的完成一些自定义的操作。

比如,校验每次返回的 status_code 是不是 200

可以看到第二个请求,返回了302,所以 assert 错误了。

其他:

requests_html Github 地址: https://github.com/kennethreitz/requests-html

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180722G1CZH300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券