課堂內容:
- 刪除原匯出檔案的venv,pycham開啟此文夾,重新建立本地虛擬編譯器。
- 安裝依賴庫,開啟pycham終端輸入pip install -r yilaiku.txt,安裝依賴庫中的庫。
- 繼續安裝bs4、lxml庫,命令為:pip install bs4 和 pip install lxml。
- 安裝好後,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”檔案中
- 透過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方式獲取
6.獲取所以標籤的內容
#透過findAll獲取所以標籤
print(soup.findAll('span',class_ = 'title'))
#透過迴圈語句單獨查出標籤中的內容
items = soup.findAll('span',class_ = 'title')
for item in items:
print(item.text)
7.透過select來篩選需要的標籤以及層級關係篩選。
應用select引數來篩選要的東西
# print(soup.select('span'))
#單獨應用select層級篩選
# print(soup.select('span.title'))
# print(soup.select('span#icp'))
print(soup.select('div > p.pl'))
當然網頁中F12可以直接複製select元素,就可以應用select層級篩選
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)
附加知識:
Pycham****更換軟體包映象源:
清華: 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