1. 程式人生 > >Python爬蟲實戰——requests-html

Python爬蟲實戰——requests-html

編寫爬蟲時requests+BeautifulSoup是一對完美的組合,現在requests庫的作者又釋出了一個功能強大的新庫requests-html

用過requests庫的同學都應該都喜歡他的簡潔優雅,現在requests-html同樣優雅,而且從名稱可以看出應該是解析html的庫,下面先簡單的介紹一下使用方法,然後再來編寫一個爬蟲

從requests-html的Github的主頁,我們可以看到這個庫有以下功能特點:

  • 支援JavaScript
  • 支援CSS選擇器。
  • 支援xpath選擇器
  • 模擬使用者代理
  • 自動重定向
  • 連線池和cookie永續性
  • 支援非同步

安裝requests-html

pip install requests-html
  • 需要注意的是這個庫目前只支援python3.6版本

基本使用

學過requests庫的同學看到requests-html的api應該會很熟悉,使用方法基本一致,不同的是使用requests編寫爬蟲時,要先把網頁爬取下來,然後再交給BeautifulSoup等一些html解析庫,現在可以直接解析了,下面我們通過小案例來感受一下

from requests_html import HTMLSession

session = HTMLSession()

def parse():
    r = session.get('http://www.qdaily.com/'
) # 獲取首頁新聞標籤、圖片、標題、釋出時間 for x in r.html.find('.packery-item'): yield { 'tag': x.find('.category')[0].text, 'image': x.find('.lazyload')[0].attrs['data-src'], 'title': x.find('.smart-dotdotdot')[0].text if x.find('.smart-dotdotdot') else x.find('.smart-lines'
)[0].text, 'addtime': x.find('.smart-date')[0].attrs['data-origindate'][:-6] }

通過簡短的幾行程式碼,就可以把整個首頁的文章抓取下來,下面我來分別介紹一下案例中使用的幾個方法

  • find( ) 可以接收兩個引數

    • 第一個引數可以是class名稱或ID
    • 第二個引數first=True時,只選取第一條資料
  • text 獲取元素的文字內容

  • attrs 獲取元素的屬性,返回值是個字典。如:

{'class': ('smart-date',), 'data-origindate': '2018-11-02 10:27:10 +0800'}
  • html 獲取元素的html內容

此外還支援xpath選擇器,使用方法也很簡單

r.html.xpath('/html/body/div[2]/div[1]/div[2]/div/div[3]')[0].text

'登入\n登入檢視你的好奇心指數'

高階用法

對 JavaScript的支援無疑是requests-html最大的亮點,上篇文章分享Python爬蟲實戰——搭建自己的IP代理池時,我們就遇到這樣一個問題,代理的埠號都是js渲染的,我們不得不去分析他們的加密方式,然後再來解密,雖然最後也能成功解密,但是費時費力,現在使用requests-html我們可以輕鬆解決這個問題。

下面我們來演示一下使用方法

from requests_html import HTMLSession
from re
session = HTMLSession()

def parse():
    r = session.get('http://www.goubanjia.com')
    r.html.render()

    reg = re.compile('<p.*?/p*>|<.*?>', re.S)
    for x in r.html.find('.ip'):
        data = re.sub(reg, '', str(x.html))
        yield data

輸出結果

def main():
    for x in parse():
        print(x)
        
# IP代理地址
103.212.236.5:80
103.31.45.106:23500
.
.
.

同樣是簡短的幾行程式碼,和之前的破解js相比,真是大大提升了我們的爬蟲效率,這裡主要是用了render函式,我們來一起看一下它的原始碼

 def render(self, retries: int = 8, script: str = None, 
 wait: float = 0.2, scrolldown=False, sleep: int = 0, 
 reload: bool = True, timeout: Union[float, int] = 8.0, 
 keep_page: bool = False):
 
        """
        retries: 載入次數
        script: 頁面載入時要執行的js腳步(可選).
        wait: 載入頁面之前等待的秒數,防止超時 (可選).
        scrolldown: 頁面向下滾動的次數
        sleep: 初始渲染後要等多長時間
        reload: 如果等於False,內容不會從瀏覽器載入,而是將從記憶體中載入.
        keep_page: 如果是True 將允許您通過``r.html.page`頁面與瀏覽器進行互動.
  • 需要注意的是第一次使用這個方法,他會先下載Chromium,然後使用Chromium來執行程式碼,但是下載的時候你可能需要一個梯子,這裡就不展開討論了。

更多方法可以參考requests-html的Github主頁

總結:requests-html在某些方面並不一定能代替requests+BeautifulSoup這對完美組合,正是因為這些優秀的庫才讓我們現在編寫爬蟲越來越簡單。

參考文件

爬蟲原始碼