python爬蟲

Sol_9發表於2024-06-13

What's 爬蟲?

簡單來說:

爬蟲,即網路蜘蛛,是偽裝成客戶端與伺服器進行資料互動的程式。

程式碼

點選檢視程式碼
from bs4 import BeautifulSoup        #網頁解析
import urllib.request,urllib.error   #制定URL,獲取網頁資料
import re                            #正規表示式  進行文字匹配
import xlwt                          #進行excel操作
from tqdm import trange              #進度條庫
 
def main():
    baseurl = "https://movie.douban.com/top250?start="
    # 1.爬取網頁
    # 2.逐一解析資料
    datalist =getDate(baseurl)
    # 3.儲存資料
    savepath = "豆瓣top250.xls"
    savedata(datalist,savepath)
 
#影片詳情連結
findLink = re.compile(r'<a href="(.*?)">')     #建立正規表示式,表示規則(字串的模式)
#影片圖片的連結
findImagesrc = re.compile( r'<img[^>]+src=["\']([^"\']+)["\']')     #ai寫的正則
#影片中文片名
findName = re.compile(r'<span class="title">(.*)</span>')
#影片評分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#影片熱評
findComment = re.compile(r'<span class="inq">(.*?)</span>')
 
def getDate(baseurl):
    datalist = []
    # 1.爬取網頁
    for i in trange(0,10):
        url = baseurl + str(i*25)
        html = askURL(url)      #儲存獲取到的網路原始碼
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):
            # 2.逐一解析資料
            item =str(item)
            data=[]
            name = re.findall(findName,item)[0]
            data.append(name)
            link = re.findall(findLink,item)[0]
            data.append(link)
            img = re.findall(findImagesrc,item)[0]
            data.append(img)
            rating = re.findall(findRating,item)
            data.append(rating)
            comment = re.findall(findComment,item)
            if len(comment)!=0:
                comment=comment[0].replace("。","")
                data.append(comment)
            else:
                data.append("  ")
            datalist.append(data)
 
    return datalist
 
def askURL(url):
    head={
        "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0"
    }
    request = urllib.request.Request(url,headers=head)
    html= ""
    try:
        response=urllib.request.urlopen(request)
        html=response.read().decode("utf-8")
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html
 
def savedata(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)   #壓縮樣式效果,設為0
    sheet = book.add_sheet('top250',cell_overwrite_ok=True)  #每個單元在寫入時覆蓋以前的內容
    col = ('電影中文名','電影詳情連結','圖片連結','電影評分','電影熱評')
    for i in range(0,len(col)):
        sheet.write(0,i,col[i])   #列名
    for i in range (0,250):
        data = datalist[i]
        for j in range (0,len(col)):
            sheet.write(i+1,j,data[j])
 
    book.save(savepath)
 
if __name__ == "__main__":
    main()
    print("爬取完成")
需要用到的庫: from bs4 import BeautifulSoup #網頁解析 import urllib.request,urllib.error #制定URL,獲取網頁資料 import re #正規表示式 進行文字匹配 import xlwt #進行excel操作 from tqdm import trange

進度條庫,當然你也可以不用,這個庫只需要把for迴圈裡的range改為trange,你就可以得到一個進度條

思路

1.獲取網頁的原始碼

def askURL(url):
    head={
        "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0"
    }
    request = urllib.request.Request(url,headers=head)
    html= ""
    try:
        response=urllib.request.urlopen(request)
        html=response.read().decode("utf-8")
        #print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
        if hasattr(e,"reason"):
            print(e.reason)
    return html

用個迴圈,根據網頁制定一下url

找到用於偽裝客戶端User-Agent
在network裡重新整理一下網頁,找到傳送的標頭header

這個是user-agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0

用urllib獲取你制定的url的原始碼
在 try 塊中:

呼叫 urllib.request.urlopen(request) 傳送HTTP請求,並獲取響應物件 response。
透過 response.read() 獲取伺服器返回的原始二進位制資料。
使用 decode("utf-8") 方法將二進位制資料解碼成UTF-8編碼的字串,並將其賦值給變數 html。
如果在執行 urlopen 函式過程中出現 urllib.error.URLError 異常,則進入 except 塊:

判斷異常物件是否包含 .code 屬性,如果有則列印出HTTP狀態碼。
再判斷異常物件是否包含 .reason 屬性,如果有則列印出錯誤原因。
最後,無論是否發生異常,都返回抓取到的網頁HTML內容(即變數 html)

2.解析資料

def getDate(baseurl):
    datalist = []
    # 1.爬取網頁
    for i in trange(0,10):
        url = baseurl + str(i*25)
        html = askURL(url)      #儲存獲取到的網路原始碼
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):
            # 2.逐一解析資料
            item =str(item)
            data=[]
            name = re.findall(findName,item)[0]
            data.append(name)
            link = re.findall(findLink,item)[0]
            data.append(link)
            img = re.findall(findImagesrc,item)[0]
            data.append(img)
            rating = re.findall(findRating,item)
            data.append(rating)
            comment = re.findall(findComment,item)
            if len(comment)!=0:
                comment=comment[0].replace("。","")
                data.append(comment)
            else:
                data.append("  ")
            datalist.append(data)
 
    return datalist

BeautifulSoup
bs4是一個強大的庫,用於從HTML和XML檔案中提取資料,它能夠將複雜的HTML結構轉換成樹形結構(即元素樹),使得開發者可以方便地搜尋、遍歷以及修改網頁內容。

"html.parser": 這是BeautifulSoup用來解析HTML文件的解析器。在這個案例中,它是指Python自帶的標準HTML解析器。除了標準的解析器外,BeautifulSoup還可以配合其他第三方解析器如 lxml 來使用。

用bs4和re篩選資訊

3.儲存資料 寫入excel表中

需要用到xwlt庫

def savedata(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)   #壓縮樣式效果,設為0
    sheet = book.add_sheet('top250',cell_overwrite_ok=True)  #每個單元在寫入時覆蓋以前的內容
    col = ('電影中文名','電影詳情連結','圖片連結','電影評分','電影熱評')
    for i in range(0,len(col)):
        sheet.write(0,i,col[i])   #列名
    for i in range (0,250):
        data = datalist[i]
        for j in range (0,len(col)):
            sheet.write(i+1,j,data[j])
 
    book.save(savepath)

相關文章