Hello,大家好我叫是Dream呀,一個(gè)有趣的Python博主,小白一枚,多多關(guān)照 ?
入門(mén)須知:這片樂(lè)園從不缺乏天才,努力才是你的最終入場(chǎng)券!
最后,愿我們都能在看不到的地方閃閃發(fā)光,一起加油進(jìn)步
“一萬(wàn)次悲傷,依然會(huì)有Dream,我一直在最溫暖的地方等你”,唱的就是我!哈哈哈~
?
?前言:?
?越來(lái)越發(fā)現(xiàn)學(xué)爬蟲(chóng)就像找女朋友一樣,慢慢來(lái),找到合適的機(jī)會(huì)才能拿下!讓我們來(lái)先把爬蟲(chóng)拿下吧!
爬蟲(chóng)BeautifulSoup模塊從入門(mén)到入坑
一、拿下她的必要準(zhǔn)備
1.構(gòu)建頁(yè)面:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div>
<ul>
<li id="l1">張三</li>
<li id="l2">李四</li>
<li>王五</li>
<a href="" id=""class="a1">尚硅谷</a>
<span>嘿嘿嘿</span>
</ul>
</div>
<a href="" title="a2">百度</a>
<div id="d1">
哈哈哈很牛哇
</div>
<p id="p1" class="p1">哈哈哈哈嘿嘿嘿</p>
</body>
</html>
2.知識(shí)儲(chǔ)備:
# -*-coding:utf-8 -*-
# @Author:到點(diǎn)了,心疼徐哥哥
# 奧利給干!??!
from bs4 import BeautifulSoup
# 通過(guò)解析本地文件 來(lái)將bs4基礎(chǔ)語(yǔ)法進(jìn)行講解
# 默認(rèn)打開(kāi)的文件的編碼格式為gbk 打開(kāi)文件時(shí)需要指定編碼
soup = BeautifulSoup(open('bs4基本使用.html',encoding='utf-8'),'lxml')
# print(soup)
# 根據(jù)標(biāo)簽名查找節(jié)點(diǎn)
# 找到的是第一個(gè)符合條件的數(shù)據(jù)
# print(soup.a)
# 獲取標(biāo)簽的屬性和屬性值
# print(soup.a.attrs)
# bs4的一些函數(shù)
# (1)find
# 返回的是第一個(gè)符合條件的數(shù)據(jù)
# print(soup.find('a'))
# 根據(jù)title的值來(lái)找到對(duì)應(yīng)的
# print(soup.find('a',title="a2")) # <a href="" title="a2">百度</a>
# print(soup.find('a',class="a1")) # class是關(guān)鍵字,不能用。相當(dāng)于古代皇帝叫這個(gè)名字,你不能用
# 根據(jù)class的值來(lái)找到對(duì)應(yīng)的標(biāo)簽對(duì)象,注意的是class需要添加下劃線
# print(soup.find('a',class_="a1")) # <a class="a1" href="" id="">尚硅谷</a>
# (2)find_all # 返回的是一個(gè)列表,并且返回所有的a標(biāo)簽
# print(soup.find_all('a'))# [<a class="a1" href="" id="">尚硅谷</a>, <a href="" title="a2">百度</a>]
# 如果想要獲取的是多個(gè)標(biāo)簽的數(shù)據(jù),那么需要在find_all的參數(shù)中添加的是列表的數(shù)據(jù)。
# print(soup.find_all(['a','span'])) # [<a class="a1" href="" id="">尚硅谷</a>, <span>嘿嘿嘿</span>, <a href="" title="a2">百度</a>]
# limit查找前幾個(gè)數(shù)據(jù)
# print(soup.find_all('li',limit=2)) # [<li>張三</li>, <li>李四</li>]
# (3)select(推薦)
# select方法返回列表和多個(gè)數(shù)據(jù)
# print(soup.select('a')) # [<a class="a1" href="" id="">尚硅谷</a>, <a href="" title="a2">百度</a>]
# 可以通過(guò).代表class 我們把這種操作叫做類(lèi)選擇器
# print(soup.select('.a1')) # [<a class="a1" href="" id="">尚硅谷</a>]
# print(soup.select('#l1')) # [<li id="l1">張三</li>]
# 屬性選擇器
# 查找li標(biāo)簽中有id的標(biāo)簽
# print(soup.select('li[id]')) # [<li id="l1">張三</li>, <li id="l2">李四</li>]
# 查找到li標(biāo)簽中id為l2的標(biāo)簽
# print(soup.select('li[id="l2"]')) # [<li id="l2">李四</li>]
# 層級(jí)選擇器
# 后代選擇器
# 找到的是div下面的li
# print(soup.select('div li')) # [<li id="l1">張三</li>, <li id="l2">李四</li>, <li>王五</li>]
# 子代選擇器
# 某標(biāo)簽的第一級(jí)子標(biāo)簽
# 注意:很多的計(jì)算機(jī)編程語(yǔ)言中。如果不加空格不會(huì)輸出內(nèi)容 但是bs4中 不會(huì)報(bào)錯(cuò) 會(huì)顯示內(nèi)容
# print(soup.select('div > ul > li')) # [<li id="l1">張三</li>, <li id="l2">李四</li>, <li>王五</li>]
# 找到a標(biāo)簽和li標(biāo)簽
# print(soup.select('a,li')) # [<li id="l1">張三</li>, <li id="l2">李四</li>, <li>王五</li>, <a class="a1" href="" id="">尚硅谷</a>, <a href="" title="a2">百度</a>]
# 節(jié)點(diǎn)信息
# 獲取節(jié)點(diǎn)內(nèi)容
# obj = soup.select('#d1')[0]
# 如果標(biāo)簽對(duì)象中 只有內(nèi)容 那么string和get_text()都可以使用
# 如果標(biāo)簽對(duì)象中 除了內(nèi)容還有標(biāo)簽 那么string就獲取不到數(shù)據(jù) 而get_text()是可以獲取數(shù)據(jù)
# 我們一般情況下 推薦使用get_text()
# print(obj.string)
# print(obj.get_text())
# 節(jié)點(diǎn)屬性
# obj = soup.select('#p1')[0]
# name是標(biāo)簽的名字
# print(obj.name)
# 將屬性值作為一個(gè)字典返回
# print(obj.attrs)
# 獲取節(jié)點(diǎn)的屬性
obj = soup.select('#p1')[0]
print(obj.attrs.get('class'))
二、冬天的第一杯星巴克送給你!
1.開(kāi)啟尋她之路
首先,進(jìn)入星巴克官網(wǎng):??星巴克??,然后進(jìn)入主頁(yè)的菜單界面,找到星巴克的一些種類(lèi)!
2.找到我喜歡的那個(gè)她
單擊右鍵進(jìn)行檢查然后刷新界面:
在解析的網(wǎng)絡(luò)模塊數(shù)據(jù)中,我們看到了menu這個(gè)東西,我深深地被她吸引了,所以說(shuō)我打算試一試,看看到底是啥吸引了我!
在她的預(yù)覽中心,我們可以看到,有很多不同種類(lèi)的咖啡:
然后在標(biāo)頭中找到我們需要的接口,來(lái)對(duì)她進(jìn)行更深一步的了解:
3.更加深入的了解她的內(nèi)心
1.嘗試直接進(jìn)入,看看她是否對(duì)我有防備
通過(guò)給定的接口直接進(jìn)入:
import urllib.request
url = 'https://www.starbucks.com.cn/menu/'
response = urllib.request.urlopen(url)
content = response.read().decode('utf-8')
print(content)
得到我們的數(shù)據(jù):
點(diǎn)擊??ctrl+F?
?搜索一下之前頁(yè)面上的第一杯奶茶:??阿馥奇朵?
?看看有沒(méi)有:
我們可以看到找到了!
2.更加一步解析她的內(nèi)心
對(duì)她大概有了一個(gè)了解之后,我們要深入到她的各個(gè)品性中去,我們她的每一個(gè)品性進(jìn)行深入了解!
進(jìn)一步分析,我們可以獲取各類(lèi)咖啡的不同解析位置:
這些標(biāo)簽里面的的小標(biāo)簽分別代表不同類(lèi)型咖啡里面的不同名稱(chēng)。
進(jìn)一步使用我的Xpath獲取數(shù)據(jù)具體內(nèi)容:
xpath不懂的同學(xué)自覺(jué)看:??1024不孤單!??Xpath爬蟲(chóng)——你最忠實(shí)的伴侶:老規(guī)矩給我一分鐘,萬(wàn)字教你入手Xpath!?
獲取具體內(nèi)容:
4.初步打開(kāi)心扉
按照我們剛才的步驟,使用bs4整理一下我們的思路代碼:
import urllib.request
url = 'https://www.starbucks.com.cn/menu/'
response = urllib.request.urlopen(url)
content = response.read().decode('utf-8')
# print(content)
from bs4 import BeautifulSoup
soup = BeautifulSoup(content,'lxml')
# //ul[@class="grid padded-3 product"]//strong/text()
name_list = soup.select('ul[class="grid padded-3 product"] strong')
print(name_list)
得到:
5.分析完畢,直接拿下?。?!
import urllib.request
url = 'https://www.starbucks.com.cn/menu/'
response = urllib.request.urlopen(url)
content = response.read().decode('utf-8')
# print(content)
from bs4 import BeautifulSoup
soup = BeautifulSoup(content,'lxml')
# //ul[@class="grid padded-3 product"]//strong/text()
name_list = soup.select('ul[class="grid padded-3 product"] strong')
# print(name_list)
for name in name_list:
print(name.string)
獲取其中的字符串:
for name in name_list:
print(name.string)
# 或者
print(name.get_text())
??????如果你喜歡的話,就不要吝惜你的一鍵三連了~
本文摘自 :https://blog.51cto.com/u