Python网络爬虫04——requests_html库

详细学习requests_html库

官方文档:

http://html.python-requests.org/

安装

pip3 install requests_html

获取网页:

from requests_html import HTMLSession,HTML

session = HTMLSession()
url = "https://www.qiushibaike.com/text/"
h = session.get(url=url)

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

查看页面内容

print(h.html.html)

获取连接:

links和absolute_links两个属性分别返回HTML对象所包含的所有链接和绝对链接(均不包含锚点)

相对路径

for _ in h.html.links:
    print(_)

绝对路径

for _ in h.html.absolute_links:
    print(_)

获取元素:

request-html支持CSS选择器和XPATH两种语法来选取HTML元素。
1、CSS选择器语法,它需要使用HTML的find函数,该函数有5个参数,作用如下:

  • selector,要用的CSS选择器;
  • clean,布尔值,如果为真会忽略HTML中style和script标签造成的影响(原文是sanitize,大概这么理解);
  • containing,如果设置该属性,会返回包含该属性文本的标签;
  • first,布尔值,如果为真会返回第一个元素,否则会返回满足条件的元素列表;
  • _encoding,编码格式。

首页菜单文本

print(h.html.find('div#menu',first=True).text)

查看菜单元素

print(h.html.find('div#menu a'))

段子内容

list_story = []
for i in h.html.find('div.content span'):
    # print(i.text)
    # print()
    list_story.append(i.text)
print(list_story)

2、XPATH语法,这需要另一个函数xpath的支持,它有4个参数如下:

  • selector,要用的XPATH选择器;
  • clean,布尔值,如果为真会忽略HTML中style和script标签造成的影响(原文是sanitize,大概这么理解);
  • first,布尔值,如果为真会返回第一个元素,否则会返回满足条件的元素列表;
  • _encoding,编码格式。

获取首页菜单文本

print(h.html.xpath("//div[@id='menu']",first=True).text)

查看菜单元素

print(h.html.xpath("//div[@id='menu']/a"))

段子内容

print(h.html.xpath("//div[@class='content']/span/text()"))

元素内容

e = h.html.find('div#hd_logo',first=True)
print(e.text)

要获取元素的attribute,用attr属性

print(e.attrs)

获取元素的html代码

print(e.html)

要搜索元素的文本内容,用search函数

print(e.search('糗{事}{}科')[0])

两个链接属性

print(e.links)  # 相对路径
print(e.absolute_links) # 绝对路径

JavaScript支持

r = session.get('http://python-requests.org/')
r.html.render()

3、render函数还有一些参数,顺便介绍一下(这些参数有的还有默认值,直接看源代码方法参数列表即可):

  • retries: 加载页面失败的次数
  • script: 页面上需要执行的JS脚本(可选)
  • wait: 加载页面钱的等待时间(秒),防止超时(可选)
  • scrolldown: 页面向下滚动的次数
  • sleep: 在页面初次渲染之后的等待时间
  • reload: 如果为假,那么页面不会从浏览器中加载,而是从内存中加载
  • keep_page: 如果为真,允许你用r.html.page访问页面

智能分页

rq = session.get("https://reddit.com")
for html in rq.html:
    print(html)

直接使用HTML

doc = """
        <!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="gbk2312">
        <title>首页</title>
    </head>
    <body>
        <h1>Hello, world!</h1>
        <p>这是一个神奇的网站!</p>
        <hr>
        <div>
            <h2>这是一个例子程序</h2>
            <p>静夜思</p>
            <p class="foo">床前明月光</p>
            <p id="bar">疑似地上霜</p>
            <p class="foo">举头望明月</p>
            <div><a href="http://www.baidu.com"><p>低头思故乡</p></a></div>
        </div>
        <a class="foo" href="http://www.qq.com">腾讯网</a>
        <img src="./img/pretty-girl.png" alt="美女">
        <img src="./img/hellokitty.png" alt="凯蒂猫">
        <img src="/static/img/pretty-girl.png" alt="美女">
        <table>
            <tr>
                <th>姓名</th>
                <th>上场时间</th>
                <th>得分</th>
                <th>篮板</th>
                <th>助攻</th>
            </tr>
        </table>
    </body>
</html>
test_html = HTML(html=doc)
print(test_html.links)

直接渲染JS代码

script = """
        () => {
            return {
                width: document.documentElement.clientWidth,
                height: document.documentElement.clientHeight,
                deviceScaleFactor: window.devicePixelRatio,
            }
        }
    """
my_html = test_html.render(script=script,reload=False)
print(my_html)
print(test_html.html)

自定义请求

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

from pprint import pprint   # 提供了可以按照某个格式正确的显示python已知类型数据的一种方法
import json

pp_r = session.get('http://httpbin.org/get')
pprint(json.loads(pp_r.html.html))

更换UA ,这里拿UA距离,如果有需要可以在header中修改其他参数

ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0'
ppp_r = session.get('http://httpbin.org/get',headers={'user-agent': ua})
pprint(json.loads(ppp_r.html.html))

模拟表单登陆:

HTMLSession带了一整套的HTTP方法,包括get、post、delete等,对应HTTP中各个方法。比如下面我们就来模拟一下表单登录

表单登陆

r1 = session.post('http://httpbin.org/post', data={'username': 'good', 'passwd': 123456})
pprint(json.loads(r1.html.html))

实例:爬去自己简书文章

my_url = 'https://www.jianshu.com/u/1f9e71a85238'
my_requests = session.get(url=my_url)
my_requests.html.render(scrolldown=50,sleep=2)
titles = my_requests.html.find('a.title')
for i,title in enumerate(titles):
    print(f'{i+1} {title.text}:https://www.jianshu.com{title.attrs["href"]}')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Python上有一个非常著名的HTTP库——requests,相比大家都听说过,用过的人都说好!现在request...
    乐百川阅读 6,446评论 4 18
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,406评论 1 45
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 3,828评论 0 0
  • 昨天八姐我们冒着天下之大不韪,揭露了孙悟空原型石槃陀的事迹,其实写孙悟空的另一目的是为八姐仰慕已久的唐僧正名。首先...
    辣八阅读 1,018评论 0 1
  • 大年初四的早晨,浓雾还未散去,外面一片白茫茫,隐约听见楼下说话的声音,便起床下楼看看。原来家里来客人了,只见一位陌...
    夕馨阅读 313评论 0 1