python爬蟲—學習筆記-4

wind风语發表於2024-04-23

課堂內容:

  1. 刪除原匯出檔案的venv,pycham開啟此文夾,重新建立本地虛擬編譯器。

image-20240423210215516

  1. 安裝依賴庫,開啟pycham終端輸入pip install -r yilaiku.txt,安裝依賴庫中的庫。

image-20240423210234782

  1. 繼續安裝bs4、lxml庫,命令為:pip install bs4 和 pip install lxml。

image-20240423210249649

  1. 安裝好後,pycham來到spiders目錄下,新建Python專案“spider422”,爬取豆瓣250的首頁HTML;

程式碼為:

import requests
import re
url="https://movie.douban.com/top250"
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"}
response=requests.get(url,headers=headers)
with open('h422.html',mode='w',encoding='utf-8')as f:
    f.write(response.text)

透過request識別網頁資訊,獲取相應資訊,最後寫入“h422.html”檔案中

  1. 透過bs4庫解析網頁中的相關資訊。

程式碼如下:

也可用import bs4直接匯入庫

from bs4 import BeautifulSoup as bs //匯入bs4庫中的BeautifulSoup並命名為bs

with open('h422.html',mode='r',encoding='utf-8') as f:
    text =f.read()  //開啟h422.html並存入text中
    
soup = bs(text,"html.parser") //透過標準的html庫解析
#獲取標籤
# print(soup.title)
# print(soup.span)
#獲取標籤文字
# print(soup.title.text)
# print(soup.title.string)
#獲取標籤名
# print(soup.title.name)
#獲取上一級標籤
# print(soup.title.parent)
#獲取上一級標籤名
# print(soup.title.parent.name)
#獲取標籤屬性值
# print(soup.span['class'])
# print(soup.span.get('class'))
# print(soup.span.get('id'))
#透過find獲取
print(soup.find('span', class_='title')) //透過find方式獲取

image-20240423210437314

6.獲取所以標籤的內容

#透過findAll獲取所以標籤
print(soup.findAll('span',class_ = 'title'))
#透過迴圈語句單獨查出標籤中的內容
items = soup.findAll('span',class_ = 'title')
for item in items:
    print(item.text)

image-20240423210506660

7.透過select來篩選需要的標籤以及層級關係篩選。

應用select引數來篩選要的東西
# print(soup.select('span'))
#單獨應用select層級篩選
# print(soup.select('span.title'))
# print(soup.select('span#icp'))

print(soup.select('div > p.pl'))

image-20240423210540859

當然網頁中F12可以直接複製select元素,就可以應用select層級篩選

image-20240423210549159

8.資料清洗,運用splist和join進行資料清洗。

#利用split和join進行資料清洗
items = soup.select('span.title') //獲取資料
namelist=[]
for item in items:
    name = "".join(item.text.split(maxsplit=1)) //以第一個空格為刪除條件刪除後連線兩個資料
    if name[0]=='/':
        namelist[-1] += name 
    else:
        namelist.append(name)

print(namelist)

image-20240423210619566

附加知識:

Pycham****更換軟體包映象源:

image-20240423210638054

image-20240423210643072

image-20240423210647676

清華: https://pypi.tuna.tsinghua.edu.cn/simple

豆瓣: http://pypi.douban.com/simple/

阿里: http://mirrors.aliyun.com/pypi/simple/

Beautifulsoup的各種用法:

beautifulsoup:HTML或XML檔案資料解析庫

安裝bs4,lxml(有的需要安裝)

匯入:from bs4 import BeautifulSoup as bs

解析指定內容:soup = beautifulsoup(解析內容,解析器)

解析器:

\1. python 標準庫:‘html.parser':

2.lxml:

with open('h1.html',mode='r',encoding='utf-8') as f:

text = f.read()

# 定義解析物件:

soup = bs(text,'html.parser')

#標籤:

print(soup.title)

print(soup.span) #輸出第一個span標籤

#標籤文字

print(soup.title.text)

或者:

print(soup.title.string)

#標籤名稱:

print(soup.title.name)

#父級標籤

print(soup.title.parent)

#父級標籤名稱:

print(soup.title.parent.name)

#第一個span 標籤的class屬性值:

soup.span['class']

soup.span.get('class')

soup.span.get('id') #沒有則返回none

#指定屬性值的標籤:

print(soup.find('span', class_='title')) #注:class因為是關鍵字,要加下劃線

print(soup.find('span', {'class': 'title'}))

#所有相同屬性名標籤的獲取:

print(soup.findAll('span', class_='title'))

print(soup.findAll('span', {'class': 'title'}))

print(soup.findAll('span',attrs={'class':'title'}))

資料清洗:

split() 方法語法:str.split(str="",maxsplit=string.count(str))[n]

​ 功能:用指定字元分割字串,分割結果為列表,預設分割符為空格

join函式語法:'sep'.join(sep_object),

​ 功能:連線任意數量的字串(包括要連線的元素字串、元組、列表、字典),用新的目標分隔符連線,返回新的字串。

namelist=[]

for i in soup.findAll('span', {'class': 'title'}):

# 字串處理:(資料清洗)

name="".join(i.text.split())

if name[0]=='/':

​ namelist[-1] += name

else:

​ namelist.append(name)

print(namelist)

獲取圖片url:

for i in soup.findAll('img'):

print(i.get('src'))

常用的字元處理函式(方法):

strip():刪除字串開頭和結尾的空格或或指定字元

格式:str.strip([chars]),不指定引數時刪除開頭或結尾處的空格

字串拼接:+

替換字元:replace():

格式:str.replace(old, new[, max])

大小寫轉換方法:lower,upper()

len( )函式計算字串的長度

capitalize( )方法將字串首字母大寫

find()方法:查詢指定字元(串)的起始位置,找不到返回-1

startswith( )方法判斷字串的開頭字元(串)

endswith( )方法判斷字串的結尾字元(串)

isdigit( )方法判斷字串是否由數字組成

isalpha( )方法判斷字串是否由字母組成

isalnum( )方法判斷字串是否由數字和字母組成

select 選擇器

用於選取特定標籤,選取規則依賴於css,所有叫css選擇器

# select 選擇器

# 所有span標籤

# print(soup.select('span'))

#特定類名的標籤

# print(soup.select('.title'))

# # 指定id的標籤

# print(soup.select('#dale_movie_top250_bottom_right'))

# 組合

# items=soup.select('span.title')

#string,text:檢視文字,attrs檢視所有屬性,檢視某個屬性:attrs['class']

# for item in items:

# print(item.string,item.text,item.attrs)

# print('---------------------------------------')

# print(soup.select('div#footer'))

# 遞進選擇

print(soup.select('div > p.pl'))#直接父子關係

print(soup.select('div.info span.title'))#不直接(用空格)

https://beautifulsoup.readthedocs.io/zh-cn/v4.4.0/#id41

相關文章