Python網(wǎng)絡(luò)爬蟲04——requests_html庫

詳細(xì)學(xué)習(xí)requests_html庫

官方文檔:

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

安裝

pip3 install requests_html

獲取網(wǎng)頁:

from requests_html import HTMLSession,HTML

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

requests-html和其他解析HTML庫最大的不同點(diǎn)在于HTML解析庫一般都是專用的,所以我們需要用另一個HTTP庫先把網(wǎng)頁下載下來说莫,然后傳給那些HTML解析庫杨箭。
而requests-html自帶了這個功能,所以在爬取網(wǎng)頁等方面非常方便

查看頁面內(nèi)容

print(h.html.html)

獲取連接:

links和absolute_links兩個屬性分別返回HTML對象所包含的所有鏈接和絕對鏈接(均不包含錨點(diǎn))

相對路徑

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

絕對路徑

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

獲取元素:

request-html支持CSS選擇器和XPATH兩種語法來選取HTML元素唬滑。
1告唆、CSS選擇器語法棺弊,它需要使用HTML的find函數(shù)晶密,該函數(shù)有5個參數(shù),作用如下:

  • selector模她,要用的CSS選擇器稻艰;
  • clean,布爾值侈净,如果為真會忽略HTML中style和script標(biāo)簽造成的影響(原文是sanitize尊勿,大概這么理解);
  • containing,如果設(shè)置該屬性畜侦,會返回包含該屬性文本的標(biāo)簽元扔;
  • first,布爾值旋膳,如果為真會返回第一個元素澎语,否則會返回滿足條件的元素列表;
  • _encoding验懊,編碼格式擅羞。

首頁菜單文本

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

查看菜單元素

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

段子內(nèi)容

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語法义图,這需要另一個函數(shù)xpath的支持减俏,它有4個參數(shù)如下:

  • selector,要用的XPATH選擇器碱工;
  • clean娃承,布爾值奏夫,如果為真會忽略HTML中style和script標(biāo)簽造成的影響(原文是sanitize,大概這么理解);
  • first草慧,布爾值桶蛔,如果為真會返回第一個元素,否則會返回滿足條件的元素列表漫谷;
  • _encoding仔雷,編碼格式。

獲取首頁菜單文本

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

查看菜單元素

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

段子內(nèi)容

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

元素內(nèi)容

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

要獲取元素的attribute舔示,用attr屬性

print(e.attrs)

獲取元素的html代碼

print(e.html)

要搜索元素的文本內(nèi)容碟婆,用search函數(shù)

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

兩個鏈接屬性

print(e.links)  # 相對路徑
print(e.absolute_links) # 絕對路徑

JavaScript支持

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

3、render函數(shù)還有一些參數(shù)惕稻,順便介紹一下(這些參數(shù)有的還有默認(rèn)值竖共,直接看源代碼方法參數(shù)列表即可):

  • retries: 加載頁面失敗的次數(shù)
  • script: 頁面上需要執(zhí)行的JS腳本(可選)
  • wait: 加載頁面錢的等待時間(秒),防止超時(可選)
  • scrolldown: 頁面向下滾動的次數(shù)
  • sleep: 在頁面初次渲染之后的等待時間
  • reload: 如果為假俺祠,那么頁面不會從瀏覽器中加載公给,而是從內(nèi)存中加載
  • 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>這是一個神奇的網(wǎng)站蜘渣!</p>
        <hr>
        <div>
            <h2>這是一個例子程序</h2>
            <p>靜夜思</p>
            <p class="foo">床前明月光</p>
            <p id="bar">疑似地上霜</p>
            <p class="foo">舉頭望明月</p>
            <div><a ><p>低頭思故鄉(xiāng)</p></a></div>
        </div>
        <a class="foo" >騰訊網(wǎng)</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淌铐、自定義用戶代理:有些網(wǎng)站會使用UA來識別客戶端類型,有時候需要偽造UA來實(shí)現(xiàn)某些操作蔫缸。
如果查看文檔的話會發(fā)現(xiàn)HTMLSession上的很多請求方法都有一個額外的參數(shù)**kwargs腿准,
這個參數(shù)用來向底層的請求傳遞額外參數(shù)。我們先向網(wǎng)站發(fā)送一個請求拾碌,看看返回的網(wǎng)站信息

from pprint import pprint   # 提供了可以按照某個格式正確的顯示python已知類型數(shù)據(jù)的一種方法
import json

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

更換UA ,這里拿UA距離吐葱,如果有需要可以在header中修改其他參數(shù)

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等,對應(yīng)HTTP中各個方法防症。比如下面我們就來模擬一下表單登錄

表單登陸

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

實(shí)例:爬去自己簡書文章

my_url = 'http://www.reibang.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}:http://www.reibang.com{title.attrs["href"]}')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孟辑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子告希,更是在濱河造成了極大的恐慌扑浸,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燕偶,死亡現(xiàn)場離奇詭異喝噪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)指么,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門酝惧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榴鼎,“玉大人,你說我怎么就攤上這事晚唇∥撞疲” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵哩陕,是天一觀的道長平项。 經(jīng)常有香客問我,道長悍及,這世上最難降的妖魔是什么闽瓢? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮心赶,結(jié)果婚禮上扣讼,老公的妹妹穿的比我還像新娘。我一直安慰自己缨叫,他們只是感情好椭符,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著耻姥,像睡著了一般销钝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咏闪,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天曙搬,我揣著相機(jī)與錄音摔吏,去河邊找鬼鸽嫂。 笑死,一個胖子當(dāng)著我的面吹牛征讲,可吹牛的內(nèi)容都是我干的据某。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼诗箍,長吁一口氣:“原來是場噩夢啊……” “哼癣籽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滤祖,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤筷狼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匠童,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埂材,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年汤求,在試婚紗的時候發(fā)現(xiàn)自己被綠了俏险。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片严拒。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖竖独,靈堂內(nèi)的尸體忽然破棺而出裤唠,到底是詐尸還是另有隱情,我是刑警寧澤莹痢,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布种蘸,位于F島的核電站,受9級特大地震影響竞膳,放射性物質(zhì)發(fā)生泄漏劈彪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一顶猜、第九天 我趴在偏房一處隱蔽的房頂上張望沧奴。 院中可真熱鬧,春花似錦长窄、人聲如沸滔吠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疮绷。三九已至,卻和暖如春嚣潜,著一層夾襖步出監(jiān)牢的瞬間冬骚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工懂算, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留只冻,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓计技,卻偏偏與公主長得像喜德,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子垮媒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Python上有一個非常著名的HTTP庫——requests舍悯,相比大家都聽說過,用過的人都說好睡雇!現(xiàn)在request...
    樂百川閱讀 6,476評論 4 18
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5萌衬? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 27,474評論 1 45
  • HTML 5 HTML5概述 因特網(wǎng)上的信息是以網(wǎng)頁的形式展示給用戶的它抱,因此網(wǎng)頁是網(wǎng)絡(luò)信息傳遞的載體秕豫。網(wǎng)頁文件是用...
    阿啊阿吖丁閱讀 3,887評論 0 0
  • 昨天八姐我們冒著天下之大不韙,揭露了孫悟空原型石槃陀的事跡抗愁,其實(shí)寫孫悟空的另一目的是為八姐仰慕已久的唐僧正名馁蒂。首先...
    辣八閱讀 1,033評論 0 1
  • 大年初四的早晨呵晚,濃霧還未散去,外面一片白茫茫沫屡,隱約聽見樓下說話的聲音饵隙,便起床下樓看看。原來家里來客人了沮脖,只見一位陌...
    夕馨閱讀 318評論 0 1