1. 程式人生 > >python接口自動化28-requests-html爬蟲框架

python接口自動化28-requests-html爬蟲框架

import pos ttr lec 完美 dev 美的 ons 接口自動化

前言

用過requests庫的都知道好,最近這個庫的作者又退出了一個好用的爬蟲框架requests-html。之前解析html頁面用過了lxml和bs4。
requests-html集成了一些常用爬蟲庫的優點,依然是為人類服務:HTML Parsing for Humans。
目前只支持python3.6

環境準備

requests-html的GitHub地址https://github.com/kennethreitz/requests-html](https://github.com/kennethreitz/requests-html),使用pip就能直接安裝了。

pip install requests-html

該庫旨在使解析HTML(例如,抓取Web)盡可能簡單直觀, 有以下優勢:

  • 完整的JavaScript支持!
  • CSS Selectors(又名jQuery風格,感謝PyQuery)。
  • XPath Selectors,對於膽小的人來說。
  • 模擬用戶代理(如真實的Web瀏覽器)。
  • 自動跟蹤重定向。
  • 連接池和cookie持久性。
  • 請求體驗您熟悉和喜愛,具有神奇的解析能力。
  • 異步支持

抓頁面url地址

先發個get請求,返回response對象,通過r.html.links獲取頁面的全部鏈接,包含一些相對路徑的地址,如果只想獲取絕對路徑的地址,可以用r.html.absolute_links

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('https://python.org/')

# 獲取頁面上的所有鏈接
all_links = r.html.links
print(all_links)

# 絕對路徑鏈接
all_absolute_links = r.html.absolute_links
print(all_absolute_links)

運行結果, 返回內容太多,省略了一部分:

{'http://pycon.blogspot.com/', '/community/', 'http://python.org/dev/peps/', '/events/python-events/831/', , 'http://www.scipy.org'}
{'http://pycon.blogspot.com/', 'https://www.python.org/dev/',  'https://wiki.qt.io/PySide', 'https://www.python.org/events/python-events/817/'}

從返回的結果可以看出,返回的是set集合,會自動的去除重復的鏈接地址

xpath定位

用過lxml庫的小夥伴應該知道https://www.cnblogs.com/yoyoketang/p/9661273.html,lxml可以支持xpath查找元素對象,requests-html也可以完美的支持xpath

接下來我需要獲取目標網站:https://www.cnblogs.com/yoyoketang/tag/django/, 獲取所有的文章標題,xpath語法:.//*[@id=‘myposts‘]/div/div/a

技術分享圖片

參考代碼

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/')
# 只獲取第一個
f = r.html.xpath(".//*[@id='myposts']/div/div/a", first=True).text
print(f)

# 獲取全部
all = r.html.xpath(".//*[@id='myposts']/div/div/a")
for i in all:
    print(i.text)            # 獲取文本
    print(i.absolute_links)  # 獲取鏈接

運行結果

python測試開發django-49.allow_tags和mark_safe
python測試開發django-49.allow_tags和mark_safe
{'https://www.cnblogs.com/yoyoketang/p/10659137.html'}
python測試開發django-48.xadmin上傳圖片django-stdimage
{'https://www.cnblogs.com/yoyoketang/p/10655601.html'}
python測試開發django-47.xadmin上傳圖片和文件
{'https://www.cnblogs.com/yoyoketang/p/10653878.html'}

xpath方法返回是一個list,加上 first=True參數返回第一個結果

css定位支持

requests-html同樣支持CSS Selector的方法,把上面案例用css定位也可以實現同樣效果

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/')
# 只獲取第一個 css語法
f = r.html.find(".PostList>div>a", first=True).text
print(f)

# 獲取全部 css語法
all = r.html.find(".PostList>div>a")
for i in all:
    print(i.text)          # 獲取文本
    print(i.absolute_links)  # 獲取鏈接

其它方法

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('https://www.cnblogs.com/yoyoketang/tag/django/')

about = r.html.find(".PostList>div", first=True)

# 1.獲取文本
print(about.text)

# 2.獲取html內容
print(about.html)

# 3.獲取全部屬性
print(about.attrs)

# 4.獲取鏈接
print(about.absolute_links )

# 5.搜索文字
print(about.search('python測試開發{}和mark_safe')[0])

# 6.繼續定位子元素
print(about.find('a'))

運行結果

python測試開發django-49.allow_tags和mark_safe
<div class="postTitl2"><a href="https://www.cnblogs.com/yoyoketang/p/10659137.html" id="PostsList1_rpPosts_TitleUrl_0">python測試開發django-49.allow_tags和mark_safe</a></div>
{'class': ('postTitl2',)}
{'https://www.cnblogs.com/yoyoketang/p/10659137.html'}
django-49.allow_tags
[<Element 'a' href='https://www.cnblogs.com/yoyoketang/p/10659137.html' id='PostsList1_rpPosts_TitleUrl_0'>]

python接口自動化28-requests-html爬蟲框架