通過模仿學會Python爬蟲(一):零基礎上手

来源:https://www.cnblogs.com/FatTiger4399/archive/2023/06/17/17454012.html
-Advertisement-
Play Games

好家伙,爬蟲來了 爬蟲,這玩意,不會怎麼辦, 誒,先抄一份作業回來 1.別人的爬蟲 Python爬蟲史上超詳細講解(零基礎入門,老年人都看的懂)_ChenBinBini的博客-CSDN博客 # -*- codeing = utf-8 -*- from bs4 import BeautifulSoup ...


好家伙,爬蟲來了

 

爬蟲,這玩意,不會怎麼辦,

誒,先抄一份作業回來

1.別人的爬蟲

 Python爬蟲史上超詳細講解(零基礎入門,老年人都看的懂)_ChenBinBini的博客-CSDN博客

# -*- codeing = utf-8 -*-
from bs4 import BeautifulSoup  # 網頁解析,獲取數據
import re  # 正則表達式,進行文字匹配`
import urllib.request, urllib.error  # 制定URL,獲取網頁數據
import xlwt  # 進行excel操作
#import sqlite3  # 進行SQLite資料庫操作
findLink = re.compile(r'<a href="(.*?)">')  # 創建正則表達式對象,標售規則   影片詳情鏈接的規則
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)
findTitle = re.compile(r'<span class="title">(.*)</span>')
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
findJudge = re.compile(r'<span>(\d*)人評價</span>')
findInq = re.compile(r'<span class="inq">(.*)</span>')
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
def main():
    baseurl = "https://movie.douban.com/top250?start="  #要爬取的網頁鏈接
    # 1.爬取網頁
    datalist = getData(baseurl)
    savepath = "豆瓣電影Top250.xls"    #當前目錄新建XLS,存儲進去
    # dbpath = "movie.db"              #當前目錄新建資料庫,存儲進去
    # 3.保存數據
    saveData(datalist,savepath)      #2種存儲方式可以只選擇一種
    # saveData2DB(datalist,dbpath)
# 爬取網頁
def getData(baseurl):
    datalist = []  #用來存儲爬取的網頁信息
    for i in range(0, 10):  # 調用獲取頁面信息的函數,10次
        url = baseurl + str(i * 25)
        html = askURL(url)  # 保存獲取到的網頁源碼
        # 2.逐一解析數據
        soup = BeautifulSoup(html, "html.parser")
        for item in soup.find_all('div', class_="item"):  # 查找符合要求的字元串
            data = []  # 保存一部電影所有信息
            item = str(item)
            link = re.findall(findLink, item)[0]  # 通過正則表達式查找
            data.append(link)
            imgSrc = re.findall(findImgSrc, item)[0]
            data.append(imgSrc)
            titles = re.findall(findTitle, item)
            if (len(titles) == 2):
                ctitle = titles[0]
                data.append(ctitle)
                otitle = titles[1].replace("/", "")  #消除轉義字元
                data.append(otitle)
            else:
                data.append(titles[0])
                data.append(' ')
            rating = re.findall(findRating, item)[0]
            data.append(rating)
            judgeNum = re.findall(findJudge, item)[0]
            data.append(judgeNum)
            inq = re.findall(findInq, item)
            if len(inq) != 0:
                inq = inq[0].replace("", "")
                data.append(inq)
            else:
                data.append(" ")
            bd = re.findall(findBd, item)[0]
            bd = re.sub('<br(\s+)?/>(\s+)?', "", bd)
            bd = re.sub('/', "", bd)
            data.append(bd.strip())
            datalist.append(data)
    return datalist
# 得到指定一個URL的網頁內容
def askURL(url):
    head = {  # 模擬瀏覽器頭部信息,向豆瓣伺服器發送消息
        "User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122  Safari / 537.36"
    }
    # 用戶代理,表示告訴豆瓣伺服器,我們是什麼類型的機器、瀏覽器(本質上是告訴瀏覽器,我們可以接收什麼水平的文件內容)

    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):
    print("save.......")
    book = xlwt.Workbook(encoding="utf-8",style_compression=0) #創建workbook對象
    sheet = book.add_sheet('豆瓣電影Top250', cell_overwrite_ok=True) #創建工作表
    col = ("電影詳情鏈接","圖片鏈接","影片中文名","影片外國名","評分","評價數","概況","相關信息")
    for i in range(0,8):
        sheet.write(0,i,col[i])  #列名
    for i in range(0,250):
        # print("第%d條" %(i+1))       #輸出語句,用來測試
        data = datalist[i]
        for j in range(0,8):
            sheet.write(i+1,j,data[j])  #數據
    book.save(savepath) #保存

if __name__ == "__main__":  # 當程式執行時
    # 調用函數
     main()
    # init_db("movietest.db")
     print("爬取完畢!")

 

 卧槽,有點東西

這東西看上去挺nb啊,

也很方便,把我想要的一些數據直接總結到一個excel表格中了 

 

 我們來看看這些欄位是如何匹配的

.xls

代碼:

findLink = re.compile(r'<a href="(.*?)">')  # 創建正則表達式對象,標售規則   影片詳情鏈接的規則
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)
findTitle = re.compile(r'<span class="title">(.*)</span>')
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
findJudge = re.compile(r'<span>(\d*)人評價</span>')
findInq = re.compile(r'<span class="inq">(.*)</span>')
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)

<img>?<span>? 這不就專業對口了嗎

網站的html:

 將三個"表"都打開,再來看看對比

 

 (誒都對上了)

此處,使用正則表達式去匹配對應標簽

正則表達式 – 簡介 | 菜鳥教程 (runoob.com)

 

 

於是看了這個案例之後,我們就可以大概去分析以下爬蟲到底幹了什麼:

1.發請求,隨後拿到伺服器發過來的.html文件

2.用正則表達式去套對應的,我們需要的數據

3.處理數據,最後把他們以某種方式呈現

 

具體來說,爬蟲通常會執行以下步驟:

  1. 發送HTTP請求:爬蟲通過發送HTTP請求來獲取目標網頁的內容。

  2. 解析HTML頁面:網頁內容一般是HTML格式的,爬蟲需要使用HTML解析器來將頁面內容解析成Python對象。

  3. 提取數據:通過Python編程語言對解析出來的對象進行遍歷和操作,找到需要的數據並保存下來。

  4. 存儲數據:將提取的數據保存到文件中、資料庫中或者記憶體中,以備後續的處理和分析。

  5. 處理異常:爬蟲需要處理異常,例如:請求超時、解析錯誤等,以確保爬蟲的穩定性和可靠性。

開乾

 

2.我的爬蟲

好了,我們自己寫一個爬蟲試試

import requests
from bs4 import BeautifulSoup
import xlwt
import re

# 創建Excel文件
workbook = xlwt.Workbook(encoding='utf-8')
worksheet = workbook.add_sheet('kugou_rank')
# pattern = re.compile(r'(?<=- ).*')

# 構造請求頭
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
} # 定義排行榜頁面的URL url = 'https://www.kugou.com/yy/rank/home/1-6666.html?from=rank' # 發送請求並獲取響應 r = requests.get(url, headers=headers) # 解析HTML soup = BeautifulSoup(r.text, 'html.parser') # 定位歌曲排行榜列表 song_list = soup.find('div', {'class': 'pc_temp_songlist'}).find_all('li') # 將數據寫入Excel文件 worksheet.write(0, 0, '排名') #寫入對應的欄位 worksheet.write(0, 1, '歌名') worksheet.write(0, 2, '歌手') worksheet.write(0, 3, '專輯') worksheet.write(0, 4, '播放時長') worksheet.write(0, 5, '鏈接地址') row = 1 for song in song_list: song_name = song.find('a', {'class': 'pc_temp_songname'}).text.strip() #篩選出歌名 song_title = song.get('title') singer_pattern = re.compile(r'.*(?= - )') song_singer = singer_pattern.findall(song_title) song_title = song.get('title') print(song_title) album_pattern = re.compile(r'(?<=- ).*') song_album = album_pattern.findall(song_title) # song_album = pattern.findall(song) song_time = song.find('span', {'class': 'pc_temp_time'}).text.strip() link_pattern = re.compile(r'href="(.*?)"') worksheet.write(row, 0, song['data-index']) #將排行寫入excel表格 worksheet.write(row, 1, song_name) #將歌名寫入excel表格 worksheet.write(row, 2, song_singer) #將歌手寫入excel表格 worksheet.write(row, 3, song_album) #將歌曲專輯寫入excel表格 worksheet.write(row, 4, song_time) #將歌曲時長寫入excel表格 song =str(song) song = song.split("javascript:")[0] song_link = link_pattern.findall(song) worksheet.write(row, 5, song_link) #將歌曲時長寫入excel表格 row += 1 # 保存Excel文件 workbook.save('C:/Users/10722/Desktop/python答辯/kugou_rank.xls')

說明:

 

# 構造請求頭
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}

 

帶著請求頭去請求,一個簡單的"反爬"機制,模仿瀏覽器去發請求,非常實用

(其實沒什麼亂用,你能想到的,網站的開發者大概也能想到,所以你要是亂來還是會封你IP的)

沒什麼難度

這爬了酷狗的一個音樂榜單

然後記錄了一些音樂數據,還有歌曲的地址。

 

還行,

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Android開發中,有時候出於安全,性能,代碼共用的考慮,需要使用C/C++編寫的庫。雖然在現代化工具鏈的支持下,這個工作的難度已經大大降低,但是畢竟萬事開頭難,初學者往往還是會遇到很多不可預測的問題。本篇就是基於此背景下寫的一份簡陋指南,希望能對剛開始編寫C/C++庫的讀者有所幫助。同時為了盡 ...
  • ### 什麼是JNI開發 JNI的全稱是Java Native Interface,顧名思義,這是一種解決Java和C/C++相互調用的編程方式。**它其實只解決兩個方面的問題,怎麼找到和怎麼訪問。** 弄清楚這兩個話題,我們就學會了JNI開發。**需要註意的是,JNI開發只涉及到一小部分C/C++ ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 在使用vue項目編寫的時候,不可避免的會碰到需要時js api來調用組件進行顯示的情況 例如餓了麽element ui 的 Notification 通知、Message 消息提示等組件 雖然已經提供了,但是由於api的限制,我們只 ...
  • ## 1. 對象的定義與賦值 經常使用的定義與賦值方法`obj.prop =value`或者`obj['prop']=value` ```js let Person = {}; Person.name = "Jack"; Person["gender"] = "female"; console.lo ...
  • 最近得空學習了下uniapp結合vue3搭建跨端項目。之前也有使用uniapp開發過幾款聊天/仿抖音/後臺管理等項目,但都是基於vue2開發。隨著vite.js破局出圈,越來越多的項目偏向於vue3開發,就想著uniapp搭配vite4.x構建項目效果會如何?經過一番嘗試果然真香~ 版本信息 HBu ...
  • ### 迭代器模式(Iterator Pattern) #### 一、定義 提供一種方法順序訪問一個聚合對象中各個元素,而又不需要暴露該對象的內部表示。 #### 二、優缺點 **優點:** 1、它支持以不同的方式遍歷一個聚合對象。 2、迭代器簡化了聚合類。 3、在同一個聚合上可以有多個遍歷。 4、 ...
  • 這是上一篇 [rust 學習 - 構建 mini 命令行工具](https://www.cnblogs.com/dreamHot/p/17467837.html)的續作,擴展增加一些 crate 庫。這些基礎庫在以後的編程工作中會常用到,他們作為基架存在於項目中,解決項目中的某個問題。 項目示例還是 ...
  • #基於回歸分析的波士頓房價分析 項目實現步驟: 1.項目結構 2.處理數據 3.處理繪圖 4.對數據進行分析 5.結果展示 一.項目結構 ![image](https://img2023.cnblogs.com/blog/3047082/202306/3047082-2023061722315431 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...