網路爬蟲(二) BS4提取之Selector

2021-10-23 00:15:39 字數 3668 閱讀 6668

如果執行 pip install bs4 後報錯為「pip 不是可執行的命令」,將pip 的路徑加入環境變數即可

urls =

[''.format

(str

(i))

for i in

range(1

,24)]

我們需要的所有url就都包含在urls中了

一般瀏覽器都會有反爬機制,用來區別是人還是機器訪問的一種手段。我們設定請求頭為瀏覽器的請求頭,以模擬**為的訪問,當然這只是最簡單的一種防反爬的手段,一般我們都會帶上,**如下:

headers =

這個headers是先通過人為訪問,在headers中的user-agent找到:

使用 requests 庫的get方法訪問網頁,第乙個引數為**,第二個引數為請求頭,返回值裡面有很多結果,包括有狀態響應碼,網頁原始碼,二進位制等,賦值給我們定義的response

呼叫請求結果 response 中的status_code檢視請求狀態碼,200代表請求成功,就返回,否則返回乙個 none,狀態碼一般有 2xx,4xx,3xx,5xx,分別代表請求成功,客戶端訪問失敗,重定向,伺服器問題。

return response.text表示返回響應結果的text,即網頁html原始碼

在請求訪問網頁中我們得到了我們需要的response,其中的html原始碼也被我們所得到,但是這個原始碼比較醜陋,所以我們可以利用beautifulsoup來對原始碼進行煲湯。

在瀏覽器中將滑鼠指向我們所需要提取的元素,右擊檢查後會出現對應原始碼,右擊→copy→copy selector

可以得到

ranks = html.select(

'#rankwrap > div.pc_temp_songlist > ul > li > span.pc_temp_num'

)names = html.select(

'#rankwrap > div.pc_temp_songlist > ul > li > a'

)times = html.select(

'#rankwrap > div.pc_temp_songlist > ul > li > span.pc_temp_tips_r > span'

)

for r,n,t in

zip(ranks,names,times)

: r = r.get_text(

).replace(

'\n',''

).replace(

'\t',''

).replace(

'\r',''

) n = n.get_text(

) t = t.get_text(

).replace(

'\n',''

).replace(

'\t',''

).replace(

'\r',''

)

這種提取方式是不會常用的,因為效果很不健壯,如果網頁改了改結構,就不能使用了。

**如下:

import requests

import time

from bs4 import beautifulsoup

defget_html

(url)

: headers =

response = requests.get(url, headers=headers)

if response.status_code ==

200:

return response.text

else

:return

defget_infos

(html)

: html = beautifulsoup(html)

# 排名

ranks = html.select(

'#rankwrap > div.pc_temp_songlist > ul > li > span.pc_temp_num'

)# 歌手 + 歌名

names = html.select(

'#rankwrap > div.pc_temp_songlist > ul > li > a'

) times = html.select(

'#rankwrap > div.pc_temp_songlist > ul > li > span.pc_temp_tips_r > span'

)# 列印資訊

for r,n,t in

zip(ranks,names,times)

: r = r.get_text(

).replace(

'\n',''

).replace(

'\t',''

).replace(

'\r',''

) n = n.get_text(

) t = t.get_text(

).replace(

'\n',''

).replace(

'\t',''

).replace(

'\r',''

) data =

print

(data)

defmain()

: urls =

[''.format

(str

(i))

for i in

range(1

,24)]

for url in urls:

html = get_html(url)

get_infos(html)

time.sleep(1)

if __name__ ==

'__main__'

: main(

)

執行效果如下:

資料提取之二 bs4

資料提取之bs4 find name,attes,recursive,text,kwargs 查詢所有符合條件的元素,傳入一些屬性或文字 1 name根據節點名查詢元素 返回乙個列表 soup.find all name a soup.find all a 2 attrs根據一些屬性來查詢 soup...

python爬蟲資料提取之bs4的使用方法

pip install bs4 pip install lxml 解析器 官方推薦2.引用方法 from bs4 import beautifulsoup 引入我們的主題3.解析原理 4.使用方法 將一段文件傳入beautifulsoup 的構造方法,就能得到乙個文件的物件,可以傳入一段字串或乙個檔...

爬蟲架構 bs4

方便解析html xml等格式的原始碼,快速查詢 修改等操作,節省數小時乃至更多的工作時間 官網文件 from bs4 import beautifulsoup print path beautifulsoup path 非真實網頁 html doc 夏日炎炎,要你幹嘛 print soup.hea...