Python爬蟲之解析網頁

常用的類庫為lxml, BeautifulSoup, re(正則)

以獲取豆瓣電影正在熱映的電影名為例,url='https://movie.douban.com/cinema/nowplaying/beijing/'

網頁分析

部分網頁源碼

<ul class="lists"><liid="3878007"class="list-item"data-title="海王"data-score="8.2"data-star="40"data-release="2018"data-duration="143分鐘"data-region="美國 澳大利亞"data-director="溫子仁"data-actors="杰森·莫瑪 / 艾梅柏·希爾德 / 威廉·達福"data-category="nowplaying"data-enough="True"data-showed="True"data-votecount="105013"data-subject="3878007">

分析可知我們要的電影名稱信息在li標簽的data-title屬性里

下面開始寫代碼

爬蟲源碼展示

import requests
from lxml import etree              # 導入庫
from bs4 import BeautifulSoup
import reimport time# 定義爬蟲類
class Spider():def __init__(self):self.url = 'https://movie.douban.com/cinema/nowplaying/beijing/'self.headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}r = requests.get(self.url,headers=self.headers)r.encoding = r.apparent_encodingself.html = r.textdef lxml_find(self):'''用lxml解析'''start = time.time()                     # 三種方式速度對比selector = etree.HTML(self.html)        # 轉換為lxml解析的對象titles = selector.xpath('//li[@class="list-item"]/@data-title')    # 這里返回的是一個列表for each in titles:title = each.strip()        # 去掉字符左右的空格print(title)end = time.time()print('lxml耗時', end-start)def BeautifulSoup_find(self):'''用BeautifulSoup解析'''start = time.time()soup = BeautifulSoup(self.html, 'lxml')   # 轉換為BeautifulSoup的解析對象()里第二個參數為解析方式titles = soup.find_all('li', class_='list-item')for each in titles:title = each['data-title']print(title)end = time.time()print('BeautifulSoup耗時', end-start)def re_find(self):'''用re解析'''start = time.time()titles = re.findall('data-title="(.+)"',self.html)for each in titles:print(each)end = time.time()print('re耗時', end-start)if __name__ == '__main__':spider = Spider()spider.lxml_find()spider.BeautifulSoup_find()spider.re_find()

輸出結果

海王
無名之輩
無敵破壞王2:大鬧互聯網
狗十三
驚濤颶浪
毒液:致命守護者
憨豆特工3
神奇動物:格林德沃之罪
恐龍王
老爸102歲
生活萬歲
進擊的男孩
摘金奇緣
亡命救贖
一百年很長嗎
云上日出
誰是壞孩子
照相師
緣·夢
網絡謎蹤
龍貓
印度合伙人
綠毛怪格林奇
最萌警探
春天的馬拉松
lxml耗時 0.007623910903930664
海王
無名之輩
無敵破壞王2:大鬧互聯網
狗十三
驚濤颶浪
毒液:致命守護者
憨豆特工3
神奇動物:格林德沃之罪
恐龍王
老爸102歲
生活萬歲
進擊的男孩
摘金奇緣
亡命救贖
一百年很長嗎
超時空大冒險
天渠
愛不可及
二十歲
你好,之華
冒牌搭檔
鐵甲戰神
克隆人
恐怖快遞
中國藍盔
阿凡提之奇緣歷險
名偵探柯南:零的執行人
為邁克爾·杰克遜鑄造雕像
再見仍是朋友
心迷宮
淡藍琥珀
阿拉姜色
兩個俏公主
云上日出
誰是壞孩子
照相師
緣·夢
網絡謎蹤
龍貓
印度合伙人
綠毛怪格林奇
最萌警探
春天的馬拉松
BeautifulSoup耗時 0.061043500900268555
海王
無名之輩
無敵破壞王2:大鬧互聯網
狗十三
驚濤颶浪
毒液:致命守護者
憨豆特工3
神奇動物:格林德沃之罪
恐龍王
老爸102歲
生活萬歲
進擊的男孩
摘金奇緣
亡命救贖
一百年很長嗎
超時空大冒險
天渠
愛不可及
二十歲
你好,之華
冒牌搭檔
鐵甲戰神
克隆人
恐怖快遞
中國藍盔
阿凡提之奇緣歷險
名偵探柯南:零的執行人
為邁克爾·杰克遜鑄造雕像
再見仍是朋友
心迷宮
淡藍琥珀
阿拉姜色
兩個俏公主
云上日出
誰是壞孩子
照相師
緣·夢
網絡謎蹤
龍貓
印度合伙人
綠毛怪格林奇
最萌警探
春天的馬拉松
re耗時 0.0004856586456298828

代碼說明

1. lxml

lxml是通過xpath來查找

使用前需使用調用ertee.HTML()方法('()'內填HTML代碼)生成一個可查找的對象

常用xpath語法如下

// 兩個斜杠為向下查找孫子標簽

/ 一個斜杠為查找直接兒子標簽

[] 方括號內填標簽屬性,如查找class屬性為name的a標簽,格式為a[@class="name"]

/text() 取出標簽的內容,如查找網頁中的 <a class="name">KAINHUCK</a> 中的KAINHUCK,格式為//a[@class="name"]/text()

/@attr 取出標簽的屬性,如查找網頁中的 <a class="name">KAINHUCK</a> 中的class屬性值name,格式為//a[@class="name"]/@class

2. BeautifulSoup

使用前需先將HTML轉換為課查找對象,格式為

BeautifulSoup(html, 'lxml')

html 為HTML代碼, 后面的參數為轉換方法(其他方法有'html.parser' , 'html5lib', 推薦使用'lxml')

查找方法

info = find('a', id='kain') 查找第一個id屬性為kain的a標簽,并存進info變量中(其他標簽同理)

find_all('a', class_='name') 查找所有class屬性為name的a標簽(注:class屬性需寫成'class_')

info.p.text 獲取第一個id屬性為kain的a標簽下的p標簽的內容(info為上面例子里的info,其他同理)

info.p['name'] 獲取第一個id屬性為kain的a標簽下的p標簽的name屬性值(info為上面例子里的info,其他同理)

當代碼中有很多同級標簽時

<p class='info-list'><a class='name'>text1</a><a class='name'>text2</a><a class='name'>text3</a><a class='name'>text4</a></p>

示例代碼如下

from bs4 import BeautifulSouphtml = '''<p class='info-list'><a class='name'>text1</a><a class='name'>text2</a><a class='name'>text3</a><a class='name'>text4</a></p>
'''
soup = BeautifulSoup(html, 'lxml')
texts = soup.find('p', class_='info-list')
print(texts.contents[1].text)    # 輸出text1
print(texts.contents[2].text)    # 輸出text2
print(texts.contents[3].text)    # 輸出text3
print(texts.contents[4].text)    # 輸出text4

注意:不是從0開始

3. re(正則表達式)

正則表達式內容較多,大家可以參考這里

總結

使用lxml查找時可以在目標網頁按F12調出開發者窗口然后再在按Ctrl+f查找,在查找欄里輸入你的xpath語法可以檢查是否能找到對應內容

可以從看例子的輸出中看出三種方法的速度

lxml耗時 0.007623910903930664

BeautifulSoup耗時 0.061043500900268555

re耗時 0.0004856586456298828

對以上三種最常用的解析網頁的方法做個對比

lxmlBeautifulSoupre
語法難易度簡單簡單復雜
查找速度較快

綜上,對于網頁內容的解析,這里推薦新手使用lxml方法,而對速度有要求就使用正則表達式(入門有點困難)

轉載于:https://www.cnblogs.com/kainhuck/p/10090448.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/250056.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/250056.shtml
英文地址,請注明出處:http://en.pswp.cn/news/250056.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

騰訊企業郵箱報錯 smtp.exmail.qq.comport 465, isSSL false

一、報錯 "smtp.exmail.qq.com" port 465, isSSL false 通過網上搜索查詢一些資料&#xff0c;推測是郵箱的配置出問題了。 二、修改郵箱配置 1 // 創建屬性2 Properties props new Properties();3 props.setProperty("mail.transport.protocol", "s…

spring與JDK版本對應關系

搭建spring框架得時候要考慮jdk的版本&#xff0c;提供一下參考 JDK 8 中可以使用 Spring Framework 5.x JDK 7 中可以使用 Spring Framework 4.x JDK 6 中可以使用 Spring Framework 4.x JDK 5 中可以使用 Spring Framework 3.x

Markdown預覽功能不可用解決方案

初學者在使用Markdown時也許會遇到這個問題 原因是電腦缺少一個組件&#xff0c;解決方案很簡單&#xff0c;安裝上就好了&#xff0c;以下是鏈接 http://markdownpad.com/download/awesomium_v1.6.6_sdk_win.exe轉載于:https://www.cnblogs.com/j9oker/p/10092829.html

Linux 中yum的配置

1.進入yum的路徑 cd /etc/yum.repos.d 2.將原始的repo文件移入一個新建的backup文件下做備份 mv CentOS* backup 3.在/etc/yum.repos.d下新建一個自己的文件(這里的文件必須以repo結尾); vi zhi.repo 其中&#xff0c;第一行必須是[文件名]的格式  是一個標記 name*** 這是一…

[生態建設] - js判斷小技巧

0、參考 說明: 從幾個易得的點出發,逐步向外擴展延申,保證代碼的可靠性 1、判斷是否為某個類型 // 判斷是否為 null const isNull o > {return o null; };// 判斷是否為 undefined const isUndefined o > {return o undefined; };// 判斷是否為 null or undefined…

Spring中Bean的概念

一、Bean的定義 <beans…/>元素是Spring配置文件的根元素&#xff0c;<beans…/>元素可以包含多個<bean…/>子元素&#xff0c;每個<bean…/>元素可以定義一個Bean實例&#xff0c;每一個Bean對應Spring容器里的一個Java實例定義Bean時通常需要指定兩…

[TJOI2010]閱讀理解

題目描述 英語老師留了N篇閱讀理解作業&#xff0c;但是每篇英文短文都有很多生詞需要查字典&#xff0c;為了節約時間&#xff0c;現在要做個統計&#xff0c;算一算某些生詞都在哪幾篇短文中出現過。 輸入輸出格式 輸入格式&#xff1a; 第一行為整數N&#xff0c;表示短文篇…

ccentos 7下安裝php5.6并使用nginx + php-fpm部署多個不同端口網站

作為一個的勤雜工&#xff0c;近期因公司內部信息化的需求&#xff0c;給新進員工提供基礎的知識培訓和介紹&#xff0c;也為了給公司內部建立一個溝通交流的平臺&#xff0c;百度找了開源的百科系統HDwiki和開源的問答系統Tipask問答系統&#xff0c;蛋痛的這兩套系統均是phpm…

Zookeeper基礎使用機制原理

Znode&#xff1a; 1、Znode既是路徑(目錄)也是信息(文件) 2、Znode有兩種分類&#xff1a;一分為臨時節點(會話生命周期)和永久節點&#xff1b;二分為普通節點和順序節點 Watch&#xff1a; 1、監聽與通知機制&#xff0c;可以在節點上監聽其本身(增、刪、改)或其子節點(增、…

JS ajax請求參數格式( formData 、serialize)

1 $("#importBtn").click(function(){2 if($("#conId").val() ""){3 alert("請填寫Id");4 return;5 }6 if($("#fromWhere").val() "…

【小工具分享】 - vscode注釋自動生成

參考 關閉文件頭部注釋 點擊設置 輸入fileheader搜索 關閉頭部注釋 "fileheader.customMade" : {"autoAdd": false }

Spring的bean實例化過程

以XmlBeanFactory為例&#xff0c;最簡單的取bean方式是&#xff1a; BeanFactory factory new XmlBeanFactory(new FileSystemResource("D:\\workspace\\JavaApplication2\\src\\javaapplication2\\spring\\beans.xml")); Car obj (Car)factory.getBean("c…

最全整理瀏覽器兼容性問題與解決方案(轉)

所謂的瀏覽器兼容性問題&#xff0c;是指因為不同的瀏覽器對同一段代碼有不同的解析&#xff0c;造成頁面顯示效果不統一的情況。在大多數情況下&#xff0c;我們的需求是&#xff0c;無論用戶用什么瀏覽器來查看我們的網站或者登陸我們的系統&#xff0c;都應該是統一的顯示效…

【算法】 - 滑動窗口

1. 題目鏈接 2. 分析 最多可以將K個值從0變成1,因此滑動窗口的限制條件: 0的數量(zeros)小于K,算法過程如下 有一個滑動窗口(slipper),每次都會從A中讀入一個數當讀入的數為0時,zeros當zeros的數量大于K時,會取出slipper首部的元素,當取值為0時zeros-- 總體代碼如下: var lo…

Springboot整合thymeleaf模板

Thymeleaf是個XML/XHTML/HTML5模板引擎&#xff0c;可以用于Web與非Web應用。 Thymeleaf的主要目標在于提供一種可被瀏覽器正確顯示的、格式良好的模板創建方式&#xff0c;因此也可以用作靜態建模。你可以使用它創建經過驗證的XML與HTML模板。相對于編寫邏輯或代碼&#xff0…

Java代碼輸出到txt文件(申請專利貼源碼的必備利器)

最近公司在申請專利&#xff0c;編寫不少文檔&#xff0c;項目的代碼量實在是過于龐大。如果一個一個的復制粘貼雖然能夠完成&#xff0c;但是對于程序員而言實在沒有這個必要。shell或者python就能解決這個問題。由于我個人對于shell和python不是非常熟練的情況下&#xff0c;…

【算法】 - 動態規劃 + 位運算

題目描述 思路1: 寫一個返回2進制中1數量的函數countOne遍歷0到num,對每一個數使用countOne,并將結果保存到res中返回 var countBits function (num) {let res new Array(num 1).fill(0);for (let i 0; i < num; i) {res[i] countOne(i.toString(2));}return res; };…

Spring配置AOP切入點execution詳解

例&#xff1a; execution (* com.sample.service…*. *(…)) 整個表達式可以分為五個部分&#xff1a; 1、execution():&#xff1a;表達式主體。 2、第一個*號&#xff1a;表示返回類型&#xff0c; *號表示所有的類型。 3、包名&#xff1a;表示需要攔截的包名&#xff…

Netty

1BS/CS? 2斷點續傳需要activeX,需要獨立客戶端有狀態,tomcat無狀態,或者Netty有狀態,可以斷點續傳 3Netty核心java nio性能比較高 4Jetty和Netty和dubbo區別? 5 轉載于:https://www.cnblogs.com/xinglongbing521/p/10105351.html