日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬虫解析利器PyQuery详解及使用实践

發布時間:2024/9/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫解析利器PyQuery详解及使用实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:葉庭云

整理:Lemon

爬蟲解析利器

PyQuery詳解及使用實踐

之前跟大家分享了 selenium、Scrapy、Pyppeteer 等工具的使用。

今天來分享另一個好用的爬蟲解析工具 PyQuery。

一、簡介

每個網頁,都有一定的特殊結構和層級關系,而且很多節點都有 id 或 class 作為區分,我們可以借助它們的結構和屬性來提取信息。

PyQuery 是一個強大的 HTML 解析庫,利用它,我們可以直接解析 DOM 節點的結構,并通過 DOM 節點的一些屬性快速進行內容提取。

pyquery 是 Python 的第三方庫,可以用 pip3 來安裝,安裝命令如下:

pip3?install?pyquery?-i?http://pypi.douban.com/simple?--trusted-host?pypi.douban.com

在解析 HTML 文本的時候,首先需要將其初始化為一個 pyquery 對象。它的初始化方式有多種,比如直接傳入字符串、傳入 URL、傳入文件名等等。

字符串初始化

可以直接把 HTML 的內容當作參數來初始化 pyquery 對象,下面用一個實例來感受一下:

from?pyquery?import?PyQuery?as?pqhtml?=?''' <div><ul?class="clearfix"><li?class="item-0">first?item</li><li?class="item-1"><a?href="link2.html">second?item</a></li><li><img?src="http://pic.netbian.com/uploads/allimg/210107/215736-1610027856f6ef.jpg"></li><li><img?src="http://pic.netbian.com//uploads/allimg/190902/152344-1567409024af8c.jpg"></li>?</ul> </div> '''doc?=?pq(html) print(doc('li'))

運行結果如下:

<li?class="item-0">first?item</li> <li?class="item-1"><a?href="link2.html">second?item</a></li> <li><img?src="http://pic.netbian.com/uploads/allimg/210107/215736-1610027856f6ef.jpg"/></li> <li><img?src="http://pic.netbian.com//uploads/allimg/190902/152344-1567409024af8c.jpg"/></li>??

首先引入 pyquery 這個對象,取別名為 pq,然后定義了一個長 HTML 字符串,并將其當作參數傳遞給 pyquery 類,這樣就成功完成了初始化。

接下來,將初始化的對象傳入 CSS 選擇器。在這個實例中,我們傳入 li 節點,這樣就可以選擇所有的 li 節點。

URL 初始化

#?-*-?coding:?UTF-8?-*-from?pyquery?import?PyQuery?as?pqurl?=?'https://yetingyun.blog.csdn.net/'doc?=?pq(url) print(doc('title'))

運行結果如下:

<title>葉庭云的博客_CSDN博客-python?爬蟲,python數據可視化,計算機視覺圖像處理領域博主</title>

pyquery 對象會首先請求這個 URL,然后用得到的 HTML 內容完成初始化。這就相當于將網頁的源代碼以字符串的形式傳遞給 pyquery 類來初始化。

文件初始化

除了傳遞一個 URL,我們還可以傳遞本地的文件名,參數指定為 filename 即可:

from?pyquery?import?PyQuery?as?pqdoc?=?pq(filename='時間輪播圖.html') print(doc('title'))

運行結果如下:

<title>Awesome-pyecharts</title>

當然,這里需要有一個本地 HTML 文件,其內容是待解析的 HTML 字符串。這樣它會先讀取本地的文件內容,然后將文件內容以字符串的形式傳遞給 pyquery 類來初始化。

以上 3 種方式均可初始化,當然最常用的初始化方式還是以字符串形式傳遞。

二、pyquery基本使用

基本 CSS 選擇器

用一個實例來感受一下 pyquery 的 css 選擇器的用法:

from?pyquery?import?PyQuery?as?pq html?=?''' <div?id="container"><ul?class="list"><li?class="item-0">first?item</li><li?class="item-1"><a?href="link2.html">second?item</a></li><li?class="item-0?active"><a?href="link3.html"><span class="bold">third?item</span></a></li><li?class="item-1?active"><a?href="link4.html">fourth?item</a></li><li?class="item-0"><a?href="link5.html">fifth?item</a></li></ul></div> '''doc?=?pq(html) print(doc('#container?.list?li')) print(type(doc('#container?.list?li')))

運行結果如下:

<li?class="item-0">first?item</li> <li?class="item-1"><a?href="link2.html">second?item</a></li> <li?class="item-0?active"><a?href="link3.html"><span?class="bold">third?item</span></a></li> <li?class="item-1?active"><a?href="link4.html">fourth?item</a></li> <li?class="item-0"><a?href="link5.html">fifth?item</a></li><class?'pyquery.pyquery.PyQuery'>

初始化 pyquery 對象之后,傳入 css 選擇器 #container .list li,它的意思是先選取 id 為 container 的節點,然后再選取其內部 class 為 list 的所有 li 節點,最后打印輸出。

可以看到,我們成功獲取到了符合條件的節點。我們將它的類型打印輸出后發現,它的類型依然是 pyquery 類型。

下面,我們直接遍歷這些節點,然后調用 text 方法,就可以獲取節點的文本內容

from?pyquery?import?PyQuery?as?pq html?=?''' <div?id="container"><ul?class="list"><li?class="item-0">first?item</li><li?class="item-1"><a?href="link2.html">second?item</a></li><li?class="item-0?active"><a?href="link3.html"><span class="bold">third?item</span></a></li><li?class="item-1?active"><a?href="link4.html">fourth?item</a></li><li?class="item-0"><a?href="link5.html">fifth?item</a></li></ul></div> '''doc?=?pq(html) for?item?in?doc('#container?.list?li').items():print(item.text())

運行結果如下:

first?item second?item third?item fourth?item fifth?item

而是直接通過選擇器和 text 方法,就得到了我們想要提取的文本信息,是不是挺方便的?

獲取信息

提取到節點之后,我們的最終目的當然是提取節點所包含的信息了。比較重要的信息有兩類,一是獲取屬性,二是獲取文本,下面分別進行說明。

獲取屬性:提取到某個 pyquery 類型的節點后,可以調用 attr 方法來獲取屬性:

from?pyquery?import?PyQuery?as?pq html?=?''' <div?class="wrap"><div?id="container"><ul?class="list"><li?class="item-0">first?item</li><li?class="item-1"><a?href="link2.html">second?item</a></li><li?class="item-0?active"><a?href="link3.html"><span class="bold">third?item</span></a></li><li?class="item-1?active"><a?href="link4.html">fourth?item</a></li><li?class="item-0"><a?href="link5.html">fifth?item</a></li></ul></div></div> '''doc?=?pq(html) a?=?doc('.item-0.active?a') print(a,?type(a)) print(a.attr('href')) print(a.attr.href)

運行結果如下:

<a?href="link3.html"><span class="bold">third?item</span></a>?<class?'pyquery.pyquery.PyQuery'> link3.html link3.html

在這個例子中我們首先選中 class 為 item-0 和 active 的 li 節點內的 a 節點,它的類型是 pyquery 類型。然后調用 attr 方法。在這個方法中傳入屬性的名稱,就可以得到屬性值了。此外,也可以通過調用 attr 屬性來獲取屬性值。

遍歷獲取所有的 a 節點的屬性:

from?pyquery?import?PyQuery?as?pq html?=?''' <div?class="wrap"><div?id="container"><ul?class="list"><li?class="item-0">first?item</li><li?class="item-1"><a?href="link2.html">second?item</a></li><li?class="item-0?active"><a?href="link3.html"><span class="bold">third?item</span></a></li><li?class="item-1?active"><a?href="link4.html">fourth?item</a></li><li?class="item-0"><a?href="link5.html">fifth?item</a></li></ul></div></div> '''doc?=?pq(html) nodes?=?doc('a') for?item?in?nodes.items():print(item.attr('href'))

運行結果如下:

link2.html link3.html link4.html link5.html

因此,在進行屬性獲取時,先要觀察返回節點是一個還是多個,如果是多個,則需要遍歷才能依次獲取每個節點的屬性。

獲取文本

獲取節點之后的另一個主要操作就是獲取其內部文本了,此時可以調用 text 方法來實現:

from?pyquery?import?PyQuery?as?pq html?=?''' <div?class="wrap"><div?id="container"><ul?class="list"><li?class="item-0">first?item</li><li?class="item-1"><a?href="link2.html">second?item</a></li><li?class="item-0?active"><a?href="link3.html"><span class="bold">third?item</span></a></li><li?class="item-1?active"><a?href="link4.html">fourth?item</a></li><li?class="item-0"><a?href="link5.html">fifth?item</a></li></ul></div></div> '''doc?=?pq(html) nodes?=?doc('li') for?item?in?nodes.items():print(item.text())

運行結果如下:

first?item second?item third?item fourth?item fifth?item

三、爬取B站視頻熱搜榜單數據

下面用一個爬取B站視頻熱搜榜單數據的實例來熟悉 PyQuery 的使用

URL:https://www.bilibili.com/ranking?spm_id_from=333.851.b_7072696d61727950616765546162.3

1. 發送請求

import?requests #?偽裝請求頭 headers?=?{"Origin":?"https://www.bilibili.com","User-Agent":"Mozilla/5.0?(Windows?NT?6.1;?WOW64)?AppleWebKit/537.1?(KHTML,?like?Gecko)?Chrome/22.0.1207.1?Safari/537.1" } #?目標URL url?=?'https://www.bilibili.com/v/popular/rank/all' #?request請求獲取的文本傳入PyQuery初始化 resp?=?requests.get(url,?headers=headers) print(resp.status_code) print(resp.text)

在上面的代碼中,我們完成了以下幾件事:

  • 導入 requests 庫

  • 偽裝請求頭

  • 使用 get 方法構造請求

  • 打印查看請求的狀態碼和網頁源代碼文本

2. 解析提取數據和保存

from?pyquery?import?PyQuery?as?pq import?openpyxlwb?=?openpyxl.Workbook()????#?初始化工作簿對象 sheet?=?wb.active???????????#?獲取活動的工作表 #?添加列名 sheet.append(['rank',?'title',?'link',?'bicon_play',?'bicon_view',?'creator',?'score']) doc?=?pq(resp) #?獲取class=rank-list?下所有li節點內容 #?遍歷li節點 con1?=?doc('.rank-list?li') for?item?in?con1.items():rank?=?item('.num').text()???#?排名title?=?item('.content?.info?a:first-child').text()?????????#?視頻標題link?=?'https:'?+?item('.content?.info?a').attr('href')?????#?視頻鏈接#?creator?=?item('.content?.info?.detail?a?span').text()????#?UP主bicon_play,?bicon_view,?creator?=?item('.content?.info?.detail?span').text().split('?')#?print(bicon_play,?bicon_view,?creator)?????score?=?item('.content?.info?.pts?div').text()sheet.append([rank,?title,?link,?bicon_play,?bicon_view,?creator,?score]) wb.save(filename='data.xlsx')

3. 完整代碼

#?-*-?coding:?UTF-8?-*- from?pyquery?import?PyQuery?as?pq import?requests import?logging import?openpyxlwb?=?openpyxl.Workbook()????#?初始化工作簿對象 sheet?=?wb.active???????????#?獲取活動的工作表 #?添加列名 sheet.append(['rank',?'title',?'link',?'bicon_play',?'bicon_view',?'creator',?'score']) #?日志輸出配置 logging.basicConfig(level=logging.INFO,?format='%(asctime)s?-?%(levelname)s:?%(message)s') #?偽裝請求頭 headers?=?{"Origin":?"https://www.bilibili.com","User-Agent":"Mozilla/5.0?(Windows?NT?6.1;?WOW64)?AppleWebKit/537.1?(KHTML,?like?Gecko)?Chrome/22.0.1207.1?Safari/537.1" } #?目標URL url?=?'https://www.bilibili.com/v/popular/rank/all' #?request請求獲取的文本傳入PyQuery初始化 resp?=?requests.get(url,?headers=headers).text doc?=?pq(resp) #?獲取class=rank-list?下所有li節點內容 #?遍歷li節點 con1?=?doc('.rank-list?li') for?item?in?con1.items():rank?=?item('.num').text()???#?排名title?=?item('.content?.info?a:first-child').text()?????????#?視頻標題link?=?'https:'?+?item('.content?.info?a').attr('href')?????#?視頻鏈接#?creator?=?item('.content?.info?.detail?a?span').text()????????#?UP主bicon_play,?bicon_view,?creator?=?item('.content?.info?.detail?span').text().split('?')#?print(bicon_play,?bicon_view,?creator)?????#?排名score?=?item('.content?.info?.pts?div').text()sheet.append([rank,?title,?link,?bicon_play,?bicon_view,?creator,?score])logging.info([rank,?title,?link,?bicon_play,?bicon_view,?creator,?score])wb.save(filename='data.xlsx')

運行效果如下:

作者:葉庭云

CSDN:https://yetingyun.blog.csdn.net/

推薦閱讀 誤執行了rm -fr /*之后,除了跑路還能怎么辦?!程序員必備58個網站匯總大幅提高生產力:你需要了解的十大Jupyter Lab插件----------? END? ----------

總結

以上是生活随笔為你收集整理的爬虫解析利器PyQuery详解及使用实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 另类天堂av | 黄色一级免费网站 | 天天综合天天做 | 亚洲三级a | 性欧美18一19性猛交 | wwwxxx日本免费| 欧美日韩中文在线观看 | 日韩一卡二卡三卡四卡 | 精品国产乱子伦一区二区 | 欧美精品一区在线 | 在线观看av资源 | 日日麻批免费视频播放 | 美女污污网站 | 五月婷综合 | 国产一级aa大片毛片 | 羞羞涩涩视频 | 久久久噜噜噜www成人网 | 国产精品永久久久久久久久久 | 粉嫩在线 | 日韩在线观看免费网站 | 啦啦啦免费高清视频在线观看 | 精品无码久久久久久国产 | 在线免费观看视频 | 五月婷婷深爱 | 波岛野结衣 | 国产又黄又粗又猛又爽 | 中文字幕成人在线视频 | xnxx国产 | 成人激情综合 | 欧美日韩精品一区二区 | 在线免费观看中文字幕 | 国产精品久久久久久久久久久久 | 男男毛片 | 老女人一区 | 久艹在线观看视频 | 午夜8888| 高清中文字幕av | 色婷婷伊人 | 亚洲区中文字幕 | 亚洲天堂日韩av | 91亚洲国产精品 | 人妻少妇精品中文字幕av蜜桃 | 男女69视频 | 91久久精品夜夜躁日日躁欧美 | 精品一区av | 朝桐光av一区二区三区 | 97人妻精品一区二区三区免费 | 日本女教师电影 | 成人久久电影 | 制服丝袜国产精品 | 精品国产精品三级精品av网址 | 少妇野外性xx老女人野外性xx | 成人精品视频在线 | 日本高清视频免费看 | 性色国产成人久久久精品 | 大乳女喂男人吃奶视频 | a午夜| 波多野吉衣伦理片 | 日韩毛片无码永久免费看 | 中文字幕在线字幕中文 | 丁香七月激情 | 久久亚洲av无码精品色午夜麻豆 | 国内精品久久久久久久影视简单 | 国产激情一区二区三区在线观看 | 4438x亚洲最大| 欧洲女女同性videoso | 熟女人妻aⅴ一区二区三区60路 | 亚洲精品免费看 | 欧美日韩观看 | 女同av在线| 欧美日韩一区二 | 无码粉嫩虎白一线天在线观看 | 国产成人精品久久 | 成人久久国产 | 欧美日韩免费观看视频 | 18禁男女爽爽爽午夜网站免费 | 性生生活大片又黄又 | 日本一级片在线播放 | 青青国产在线 | 国产亚洲自拍一区 | 日韩精品在线观看免费 | 欧美另类videosbestsex日本 | 日韩色在线观看 | 国产资源网 | 色狠狠一区二区三区香蕉 | 欧美毛片基地 | 污视频免费在线 | 日韩国产成人在线 | 日韩电影一区二区三区四区 | 亚洲欧美亚洲 | 免费观看视频一区 | 成人精品视频一区二区 | 久久久国产精品一区二区三区 | 国产嫩草av | 成人黄色在线视频 | 超碰干| 国产精品交换 | www.欧美日韩 | 校园春色中文字幕 |