前言:今天介紹一個相對性能更高的爬蟲庫requests_html,會不會感覺和requests有點聯系?是的。為什么開始不直接介紹呢?因為我覺得requests是最基本入門的東西,并且在學習過程中也能學到很多東西。我的python老師在介紹這兩個庫時是直接一起講的,然后我就很混亂,各自特點以及用法都分不清楚。不是說老師講得不好啊,老師是高手,是我太菜了~.~
requests_html庫也是requests
的作者開發的,是對requests
、PyQuery
、lxml
、beautifulsoup4
等庫的二次封裝。它將請求和解析功能集成在一起,使用起來更加方便。此外,requests_html
還支持異步請求,能夠提高爬蟲的效率。但是,在某些復雜場景下,它的使用不如單獨使用requests
和BeautifulSoup
靈活。
首先第一步當然是安裝requests_html庫啦,前面的文章有介紹,自行查閱
發送請求
from requests_html import HTMLSession #從requests_html模塊中導入了HTMLSession類(封裝了 requests)
session=HTMLSession() #創建HTMLSession的實例(一個會話對象),用于發送HTTP請求
r=session.get('https://blog.csdn.net/2402_88126487?type=blog') #發起GET請求,r是Response對象(同requests)
if r.status_code!=200:raise Exception('error')
print(r.text) #返回的是響應的原始HTML文本
print(r.html.html) #r.html是requests_html庫提供的功能(包含一些額外的處理,比如自動解碼)
#r.html是一個HTML對象,對響應的HTML內容進行了解析和封裝,r.html.html是將解析后的HTML對象轉換為字符串形式,便于查看和操作
requests_html為html對象提供了許多方便的屬性和方法
r.html.html #返回解析后的HTML內容的字符串形式
r.html.url #返回實際請求的URL,可能與初始請求的URL不同(例如經過重定向后)
r.html.base_url #返回頁面的基準URL
r.html.links #返回頁面中所有鏈接的集合
r.html.absolute_links #返回頁面中所有絕對鏈接的集合(完整的URL)
r.html.encoding #查看以及更改頁面的編碼格式
r.html.render() #渲染頁面以執行JavaScript
#如果請求的網頁包含動態加載的數據,那么在提取數據之前需調用r.html.render(),確保頁面上的JavaScript代碼被執行,從而加載所有動態內容
#使用需下載包(前面的文章介紹過了),
r.html.find()
r.html.xpath() #這兩個方法將在下面介紹
request-html支持CSS選擇器和XPATH兩種語法來選取HTML元素
r.html.find(selector,first=False)
使用 CSS 選擇器查找頁面中的元素,如果 first=True
,則只返回第一個匹配的Element
對象;否則返回所有匹配的Element
對象的列表,使用方法有點類似于soup.find(),但不能直接在 find
方法中指定如class等的參數,selector參數說明如下:
r.html.find('div') #查找所有標簽為<div>的元素
r.html.find('div.article-list') #查找所有標簽為<div>類名為article-list的元素
r.html.find('div#abc123') #查找id為abc123的<div>標簽的元素
Element
對象是requests_html
庫中用于表示HTML元素的對象,有如下屬性和方法
element.text #獲取元素的文本內容
element.attrs['href'] #通過element.attrs字典(包含了元素的所有屬性)來訪問元素的屬性
element.find() #查找當前元素的子元素
element.html #獲取元素的HTML內容
現在我們來嘗試打印主包博客首頁每篇文章的標題
from requests_html import HTMLSession
session=HTMLSession()
r=session.get('https://blog.csdn.net/2402_88126487?type=blog')
if r.status_code!=200:raise Exception('error')
titles=r.html.find('article.blog-list-box') #titles是列表,不能繼續.find
for title in titles:title=title.find('h4', first=True)print(title.text)
r.html.xpath(xpath,first=False)
使用 XPath 表達式查找頁面中的元素,如果 first=True
,則只返回第一個匹配的元素;否則返回所有匹配的元素(element對象),xpath參數說明如下
r.html.xpath('//div') #查找所有標簽為<div>的元素
r.html.xpath("//div[@class='example']") #查找所有<div>的class="example"的元素
r.html.xpath("//a[@href='https://example.com']")查找所有href=https://example.com的<a>元素
給大家分享一下如何快速得到xpath
找到要提取的元素,右鍵,點擊“復制”,點擊“復制完整的XPath”
我們復制前兩篇文章標題的xpath,如下,可以發現除了article后面的數字,其它都完全相同,并且數字代表篇數,那么我們可以通過改變數字獲取所有標題的h4標簽(為什么會想到這個呢?因為可以發現標題的存儲都十分有規律)
/html/body/div[2]/div/div[1]/div/div/div/div/div/div[2]/div/div[2]/div[1]/div[2]/div/article[1]/a/div[2]/div[1]/div[1]/h4
/html/body/div[2]/div/div[1]/div/div/div/div/div/div[2]/div/div[2]/div[1]/div[2]/div/article[2]/a/div[2]/div[1]/div[1]/h4
再寫代碼之前還要補充下:從瀏覽器開發者工具中復制的 XPath 是基于當前頁面的完整結構生成的絕對路徑。若網頁中的某些內容是通過 JavaScript 動態生成的,這個XPath就會失效。解決方法是調用r.html.render()
來渲染動態內容。博客首頁開始有些地方是沒有展示的,當我們在底部繼續往下拉后才顯示出來,但是url沒有改變,說明這個網頁是動態加載的
代碼如下
from requests_html import HTMLSession
session=HTMLSession()
r=session.get('https://blog.csdn.net/2402_88126487?type=blog')
if r.status_code!=200:raise Exception('error')
r.html.render()
for n in range(1,11):title=r.html.xpath(f'/html/body/div[2]/div/div[1]/div/div/div/div/div/div[2]/div/div[2]/div[1]/div[2]/div/article[{n}]/a/div[2]/div[1]/div[1]/h4')if title==[]:continueprint(title[0].text)
展示如下,不知道為什么STL那篇沒法顯示,但我單獨查找article[7]是可以搜索到的,可能是頁面加載時間過長了吧
?關閉會話
完成請求后,建議關閉會話對象,釋放資源(雖然不關不會報錯,但這可以避免潛在的資源泄漏)
session.close()
?爬取百度
現在,我們來解決一下之前遺留的問題(入門那一篇),當然用上一篇的抓包動態加載也可以,但requests_html支持JavaScript真的方便很多哦
代碼如下
from requests_html import HTMLSession
url='https://www.baidu.com/'
session=HTMLSession()
r=session.get(url)
r.html.render()
titles=r.html.find('ul#hotsearch-content-wrapper',first=True).find('li')
for title in titles:data=title.find('span')print(title.find('a',first=True).attrs['href'],data[0].text,data[1].text)
展示如下
至此,一代新星即將升起,你已經“出師”了
最后,再給大家分享個網站——博客園,主包之前查信息有看到過這個網站,不過沒去細看,最近發現里面真的有好多好棒的IT(Information Technology)專業信息文章,并且網頁都是渲染過的,視覺體驗好棒