以 jQuery 之名 - 爬蟲利器 PyQuery
很多讀者在學習了 Python 之后都想做一些爬蟲程序,去網上采集數據或完成一些自動化操作。因此,我們也制作了一套爬蟲實戰課程,目前正在***的完善中,很快將和各位見面。
等不及的朋友,可以先來看看這個類似于 bs4 的網頁分析模塊——PyQuery。
如果說到 jQuery,熟悉前端的同學肯定不陌生,它可以簡單優雅地對 html 文件進行定位、選擇、移動等操作。而本文的主角 pyquery,支持以 jquery 的方式對 html 進行操作。因此非常適合有前端或 js 基礎的同學使用。
廢話不多說,一邊看文章,一邊打開編輯器,跟著我一探究竟吧。
1. 安裝
安裝過程比較簡單
- pip install pyquery
2. 入門使用
接下來,我們以分析簡書首頁文章為例,簡單梳理 pyquery 的部分函數 。
(1) 導入相關的庫
分別導入 網絡請求庫 requests、以及 pyquery 。
- import requests
- import pyquery
(2) 向 pyquery 導入數據
與 bs4 一樣,處理網頁首先建立一個 pyquery 對象。通過抓取到的網頁內容初始化即可。
- # 請求簡書地址
- url = 'http://www.jianshu.com/'
- req = requests.get(url)
- page = req.text
- # 導入 pyquery 處理
- pq = pyquery.PyQuery(page)
pyquery 也可以直接調用內置的網絡請求模塊,從網址初始化:
- url = 'http://www.baidu.com'
- pq = pyquery.PyQuery(urlurl=url)
(3) 定位元素
pyquery 提供多種定位元素的方法,這里簡單介紹三種,直接定位、根據 id 定位 ,根據 class 定位。
根據 html 標簽直接定位:
- # 直接定位 head 標簽
- pqpq_head = pq('head')
以上代碼就是獲取 html 中 < head>.......< /head> 標簽內的內容。
根據 id 定位:
在簡書首頁源代碼中可找到這么一段
根據 id 定位找到這個 li 標簽,代碼如下:
- # 定位 id = note-11772642 的 li 標簽
- pqpq_id = pq('#note-11772642')
以上代碼獲取 id 名為 note-11772642 的標簽,需要注意的是查詢 id 時添加 # 前綴,這是 css 選擇器語法。
根據 class 定位:
同樣以剛才的為例
我們根據 class=have-img 去獲取這個 li 標簽
- # 定位 class = have-img 的 li 標簽
- pqpq_class = pq('.have-img')
注意的是查詢 class 時添加 . 前綴,這也是 css 選擇器語法。
(4) 索引標簽
在上一節的***有個小問題,我們知道 head 標簽在 html 中只有一個,而 class 名為 have-img 的 li 標簽可能有多個,我們該
如何遍歷所有的 li 標簽呢? 又該如何單獨的取某一個 li 呢?
首先我們可以逐個遍歷
- # 遍歷所有 class = have-img 的 li 標簽
- for li in pq_class:
- # 獲取每一個 li 標簽
- pqpq_li = pq(li)
我們可以索引某一個 li 標簽
使用.ep(index) 函數。
- # 獲取***個 li 標簽
- li_first = pq_class.ep(0)
- # 獲取第二個 li 標簽
- li_second = pq_class.ep(1)
(5) 尋找標簽
同樣回到剛剛的那張圖
在上一步,我們已經找到了所有的 li 標簽,也知道如何取索引其中的元素,但我們現在要準確定位到某一個元素,比如上圖中 id = note-11772642 這個 li 標簽。
這時候 filter(selecter) 就派上了用場
- li_spec = pq_class.filter('#note-11772642')
這樣我們就找到了指定的這個 li 標簽,需要注意的是, filter 函數只能在同一級標簽中尋找,比如在這里只能過濾 li 標簽,而不能定位 li 標簽下的 a 標簽、 div 標簽等。
當然,針對這種情況, pyquery 為我們提供了另外一個函數 find(selector),該函數用于尋找子節點,繼續以上圖為例,尋找該特定 li 標簽下的 p 標簽
- p_tag = li_spec.find('p')
(6) 提取屬性與值
以上我們講了許多關于標簽的知識,現在來談談怎么獲取標簽內的屬性和標簽包裹的文本,實際的爬蟲項目中,通常這是最重要的一步,比如從 a 標簽中獲取鏈接、從 li 標簽或者 p標簽中獲取文本。
獲取屬性:
使用 attr() 函數,以我們之前獲取的 li 標簽為例,獲取其中的 id 屬性
- # 獲取 id 屬性的方法
- li_specli_spec_id = li_spec.attr('id')
- li_specli_spec_id_2 = li_spec.attr.id
- li_specli_spec_id_3 = li_spec.attr['id']
獲取文本:
使用 text()函數, 以我們之前得到的 p 標簽為例,獲取其中的文本。
- string = p_tag.text()
到此,在爬蟲中會使用到的函數就是這些了。
3. 小結
pyquery 還擁有操作文檔樹的能力,本篇文章著重介紹與爬蟲相關的知識,所以就不再此詳細敘述了,有興趣的同學移步官方文檔:
http://pythonhosted.org/pyquery/index.html
***,既然我們都分析了簡書首頁,請大家根據所學內容爬取簡書首頁所有的文章標題和文章鏈接,然后打印出來吧,像下圖一樣
【本文是51CTO專欄機構“Crossin的編程教室”的原創文章,轉載請通過微信公眾號(rossincode)聯系原作者】