主頁 > 後端開發 > [Python從零到壹] 六.網路爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解

[Python從零到壹] 六.網路爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解

2021-02-18 10:45:34 後端開發

歡迎大家來到“Python從零到壹”,在這里我將分享約200篇Python系列文章,帶大家一起去學習和玩耍,看看Python這個有趣的世界,所有文章都將結合案例、代碼和作者的經驗講解,真心想把自己近十年的編程經驗分享給大家,希望對您有所幫助,文章中不足之處也請海涵,Python系列整體框架包括基礎語法10篇、網路爬蟲30篇、可視化分析10篇、機器學習20篇、大資料分析20篇、影像識別30篇、人工智能40篇、Python安全20篇、其他技巧10篇,您的關注、點贊和轉發就是對秀璋最大的支持,知識無價人有情,希望我們都能在人生路上開心快樂、共同成長,

前一篇文章講述了BeautifulSoup技術,它是一個可以從HTML或XML檔案中提取資料的Python庫,一個分析HTML或XML檔案的決議器,包括安裝程序和基礎語法,這篇文章將詳細講解 BeautifulSoup 爬取豆瓣TOP250電影,通過案例的方式讓大家熟悉Python網路爬蟲,同時豆瓣TOP250也是非常適合入門的案例,也能普及簡單的預處理知識, 希望對您有所幫助,本文參考了作者CSDN的文章,鏈接如下:

  • https://blog.csdn.net/Eastmount
  • https://github.com/eastmountyxz/Python-zero2one

同時,作者新開的“娜璋AI安全之家”將專注于Python和安全技術,主要分享Web滲透、系統安全、人工智能、大資料分析、影像識別、惡意代碼檢測、CVE復現、威脅情報分析等文章,雖然作者是一名技術小白,但會保證每一篇文章都會很用心地撰寫,希望這些基礎性文章對你有所幫助,在Python和安全路上與大家一起進步,

文章目錄

  • 一.分析網頁DOM樹結構
    • 1.分析網頁結構及簡單爬取
    • 2.定位節點及網頁翻頁分析
  • 二.爬取豆瓣電影資訊
  • 三.鏈接跳轉分析及詳情頁面爬取
  • 四.總結

前文賞析:

  • [Python從零到壹] 一.為什么我們要學Python及基礎語法詳解
  • [Python從零到壹] 二.語法基礎之條件陳述句、回圈陳述句和函式
  • [Python從零到壹] 三.語法基礎之檔案操作、CSV檔案讀寫及面向物件
  • [Python從零到壹] 四.網路爬蟲之入門基礎及正則運算式抓取博客案例
  • [Python從零到壹] 五.網路爬蟲之BeautifulSoup基礎語法萬字詳解
  • [Python從零到壹] 六.網路爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解


前文作者詳細介紹了BeautifulSoup技術,這篇文章主要結合具體實體進行深入分析,講述一個基于BeautifulSoup技術的爬蟲,爬取豆瓣排名前250部電影的資訊,主要內容包括:

  • 分析網頁DOM樹結構
  • 爬取豆瓣電影資訊串列
  • 鏈接跳轉分析
  • 爬取每部電影對應的詳細資訊

本文從實戰出發,讓讀者初步了解分析網頁結構方法并呼叫BeautifulSoup技術爬取網路資料,后面章節將進一步深入講解,

一.分析網頁DOM樹結構

1.分析網頁結構及簡單爬取

豆瓣(Douban)是一個社區網站,創立于2005年3月6日,該網站以書影音起家,提供關于書籍、電影、音樂等作品的資訊,其作品描述和評論都是由用戶提供(User-Generated Content,簡稱UGC),是Web 2.0網站中具有特色的一個網站,該網站提供了書影音推薦、線下同城活動、小組話題交流等多種服務功能,致力于幫助都市人群發現生活中有用的事物,

本文主要介紹BeautifulSoup技術爬取豆瓣電影排名前250名的電影資訊,第一部分將介紹分析網頁DOM樹結構,爬取豆瓣的地址為:

  • https://movie.douban.com/top250?format=text

在這里插入圖片描述

上圖中顯示了豆瓣熱門的250部電影的資訊,包括電影中文名稱、英文名稱、導演、主演、評分、評價數等資訊,接下來需要對其進行DOM樹結構分析,HTML網頁是以標簽對的形式出現,如< html >< /html >、< div >< /div >等,這種標簽對呈樹形結構顯示,通常稱為DOM樹結構

在得到一個網頁之后,我們需要結合瀏覽器對其進行元素分析,比如豆瓣電影網站,選中第一部電影《肖申克的救贖》,右鍵滑鼠“檢查”(Chrome瀏覽器稱為“檢查”,其他瀏覽器可能稱為“審查元素”等),如下圖2所示,

在這里插入圖片描述

顯示結果如圖3所示,可以發現它是在< div class=”article” >< /div >路徑下,由很多個< li >< /li >組成,每一個< li >< /li >分別對應一部電影的資訊,其中,電影《肖申克的救贖》HTML中對應內容為:

<li><div class="item">......</div></li>

通過class值為“item”可以定位電影的資訊,呼叫BeautifulSoup擴展包的find_all(attrs={“class”:“item”}) 函式可以獲取其資訊,

在這里插入圖片描述

對應的HTML部分代碼如下:

<li><div class="item">
 <div class="pic">
   <em class="">1</em>
   <a href="https://movie.douban.com/subject/1292052/"> 
    <img alt="肖申克的救贖"src="https://img3.doubanio.com/.../p480747492.webp" >
   </a>
 </div>
 <div class="info">...</div>
</div></li>

下面通過Python3代碼可以獲取電影的資訊,呼叫BeautifulSoup中的find_all()函式獲取< div class=’item’ >的資訊,其結果如圖4所示,

test01.py

# -*- coding:utf-8 -*-
# By:Eastmount CSDN
import urllib.request
import re 
from bs4 import BeautifulSoup

# 爬蟲函式
def crawl(url, headers):
    page = urllib.request.Request(url, headers=headers)
    page = urllib.request.urlopen(page)
    contents = page.read()
    #print(contents)
    
    soup = BeautifulSoup(contents, "html.parser")
    print('豆瓣電影250: 序號 \t影片名\t 評分 \t評價人數')
    for tag in soup.find_all(attrs={"class":"item"}):
        content = tag.get_text()
        content = content.replace('\n','')   #洗掉多余換行
        print(content, '\n')

# 主函式
if __name__ == '__main__':
    url = 'http://movie.douban.com/top250?format=text'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
    crawl(url, headers)

運行結構如圖4所示,爬取了豆瓣Top250的第一頁電影的資訊,包括序號、影片名、導演及主演資訊、評分、評價人數等,

在這里插入圖片描述

注意:urllib.error.HTTPError: HTTP Error 418
如果直接使用urllib.request.urlopen(url)會提示該錯誤,這是因為爬蟲被攔截,需要模擬瀏覽器訪問,這里可以打開瀏覽器按下F12,找到對應Headers內容,然后在Python代碼中設定User-Agent即可模擬該瀏覽器請求,

在這里插入圖片描述

urlopen()函式:

  • Python2:urllib2.urlopen(url)
  • Python3:urllib.request.urlopen(url)
  • urlopen()函式用于創建一個表示遠程url的類檔案物件,然后像操作本地檔案一樣操作這個類檔案物件來獲取遠程資料

read()函式:

  • 呼叫read()讀取網頁內容并賦值給contents變數

BeautifulSoup函式:

  • soup = BeautifulSoup(contents, “html.parser”)
  • 呼叫BeautifulSoup決議所抓取網頁原始碼的DOM樹結構

find_all()函式:

  • 呼叫BeautifulSoup的find_all()函式獲取屬性class為“item”的所有值,并呼叫代碼content.replace(’\n’,’’)將換行符替換為空值,從而實作洗掉多余換行,最后回圈輸出結果,

2.定位節點及網頁翻頁分析

通過前一部分我們獲取了電影的簡介資訊,但是這些資訊是融合在一起的,而在資料分析時,通常需要將某些具有使用價值的資訊提取出來,并存盤至陣列、串列或資料庫中,比如電影名稱、演員資訊、電影評分等特征,

作者簡單歸納了兩種常見的方法:

  • (1) 文本分析,從獲取的電影簡介文本資訊中提取某些特定的值,通常采用字串處理方法進行提取,
  • (2) 節點定位,在寫爬蟲程序中定位相關節點,然后進行爬取所需節點操作,最后賦值給變數或存盤到資料庫中,

本部分將結合BeautifulSoup技術,采用節點定位方法獲取具體的值,點開HTML網頁,檢查對應的< li >< /li >節點,可以看到該電影的構成情況,再定位節點內容,如< span class=“title” >節點可以獲取標題,< div class=“star” >節點可以獲取電影評分和評價人數,

在這里插入圖片描述

獲取節點的核心代碼如下,定位class屬性為“item”的div布局后,再呼叫find_all()函式查找class屬性為title的標簽,并獲取第一個值輸出,即title[0],接著呼叫find()函式爬取評分資訊,通過get_text()函式獲取內容,

for tag in soup.find_all(attrs={"class":"item"}): 
    title = tag.find_all(attrs={"class":"title"})           #電影名稱
    info = tag.find(attrs={"class":"star"}).get_text()      #爬取評分和評論數
    print(title[0])
    print(info.replace('\n',''))
# <span class="title">肖申克的救贖</span>
# 9.72279813人評價

在這里插入圖片描述

講到這里,我們第一頁的25部電影資訊就爬取成功了,而該網頁共10頁,每頁顯示25部電影,如何獲取這250部完整的電影資訊呢?這就涉及到鏈接跳轉和網站的翻頁分析,網站的翻頁分析通常有四種方法:

  • 點擊下一頁分析url網址,分析它們之間的規律,這種方法的網站通常采用GET方法進行傳值,而有的網站采用區域重繪技術,翻頁后的url仍然不變,
  • 獲取“下一頁”或頁碼的超鏈接,再依次呼叫urllib2.urlopen(url)函式訪問URL并實作網頁跳轉,
  • 分析網站Networks提交請求的引數,通過Python設定引數實作翻頁,常用于POST表單,
  • 采用網頁自動操作技術,獲取下一頁按鈕或超鏈接進行自動點擊跳轉,如selenium技術中的滑鼠點擊事件,

本文主要采用第一種分析方法,后面講述Selenium技術時,會介紹滑鼠模擬點擊事件操作的跳轉方法,

在這里插入圖片描述

通過點擊圖6中的第2頁、第3頁、第10頁,我們可以看到網頁URL的變化如下,

2頁URL:https://movie.douban.com/top250?start=25&filter=3頁URL:https://movie.douban.com/top250?start=50&filter=10頁URL:https://movie.douban.com/top250?start=225&filter=

它是存在一定規律的,top250?start=25表示獲取第2頁(序號為26到50號)的電影資訊;top250?start=50表示獲取第3頁(序號為51到75號)的電影資訊,依次類推,我們寫一個回圈即可獲取完整的250部電影資訊,核心代碼如下:

i = 0  
while i<10:  
    num = i*25 #每次顯示25部 URL序號按25增加  
    url = 'https://movie.douban.com/top250?start=' + str(num) + '&filter='  
    crawl(url)  
    i = i + 1

注意:當i初始值為0,num值為0,獲取第1頁資訊;當i增加為1,num值為25,獲取第2頁資訊;當i增加為9,num值為225,獲取第10頁的資訊,

講到這里,爬取豆瓣網電影資訊的DOM樹結構分析、網頁鏈接跳轉已經分析完成,下一小節是講解完整的代碼,


二.爬取豆瓣電影資訊

完整代碼為test02.py檔案,如下所示,

test02.py

# -*- coding: utf-8 -*-
# By:Eastmount CSDN
import urllib.request
import re 
from bs4 import BeautifulSoup
import codecs

#-------------------------------------爬蟲函式-------------------------------------
def crawl(url, headers):
    page = urllib.request.Request(url, headers=headers)
    page = urllib.request.urlopen(page)
    contents = page.read()
    
    soup = BeautifulSoup(contents, "html.parser") 
    infofile.write("")
    print('爬取豆瓣電影250: \n')
    
    for tag in soup.find_all(attrs={"class":"item"}):
        #爬取序號
        num = tag.find('em').get_text()
        print(num)
        infofile.write(num + "\r\n")
        
        #電影名稱
        name = tag.find_all(attrs={"class":"title"})
        zwname = name[0].get_text()
        print('[中文名稱]', zwname)
        infofile.write("[中文名稱]" + zwname + "\r\n")
        
        #網頁鏈接
        url_movie = tag.find(attrs={"class":"hd"}).a
        urls = url_movie.attrs['href']
        print('[網頁鏈接]', urls)
        infofile.write("[網頁鏈接]" + urls + "\r\n")
        
        #爬取評分和評論數
        info = tag.find(attrs={"class":"star"}).get_text()
        info = info.replace('\n',' ')
        info = info.lstrip()
        print('[評分評論]', info)
        
        #獲取評語
        info = tag.find(attrs={"class":"inq"})
        if(info): #避免沒有影評呼叫get_text()報錯
            content = info.get_text()
            print('[影評]', content)
            infofile.write(u"[影評]" + content + "\r\n")
        print('')
        
#-------------------------------------主函式-------------------------------------
if __name__ == '__main__':
    #存盤檔案
    infofile = codecs.open("Result_Douban.txt", 'a', 'utf-8')
    
    #訊息頭
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}

    #翻頁
    i = 0
    while i<10:
        print('頁碼', (i+1))
        num = i*25 #每次顯示25部 URL序號按25增加
        url = 'https://movie.douban.com/top250?start=' + str(num) + '&filter='
        crawl(url, headers)
        infofile.write("\r\n\r\n")
        i = i + 1
    infofile.close()

運行結果如圖7所示,爬取了電影名稱、網頁連接、評分評論數和影評等資訊,

在這里插入圖片描述

并且將爬取的250部電影資訊存盤到“Result_Douban.txt”檔案中,如下圖所示,

在這里插入圖片描述

在代碼中,主函式定義回圈依次獲取不同頁碼的URL,然后呼叫crawl(url)函式對每頁的電影資訊進行定向爬取,在crawl(url)函式中,通過urlopen()函式訪問豆瓣電影網址,然后呼叫BeautifulSoup函式進行HTML分析,前面第一部分講解了每部電影都位于< li >< div class=“item” >…< /div >< /li >節點下,故采用如下for回圈依次定位到每部電影,然后再進行定向爬取,

for tag in soup.find_all(attrs={"class":"item"}):
    #分別爬取每部電影具體的資訊

具體方法如下,

(1) 獲取序號
序號對應的HTML原始碼如圖8所示,需要定位到< em class >1< /em >節點,通過find(‘em’)函式獲取具體的內容,

在這里插入圖片描述

對應的代碼如下:

num = tag.find('em').get_text()
print(num)

(2) 獲取電影名稱
電影名稱對應的HTML原始碼如圖9所示,包括class='title’對應中文名稱和英文名稱,class='other’對應電影其他名稱,

在這里插入圖片描述

對應的代碼如下,因為HTML中包含兩個title,即< span class=‘title’ >< /span >,所以使用下面的函式獲取兩個標題:

  • tag.find_all(attrs={“class”:“title”})

但這里我們僅需要中文標題,則直接通過變數name[0]獲取其第一個值,即為中文名稱,再呼叫get_text()函式獲取其內容,

name = tag.find_all(attrs={"class":"title"})
zwname = name[0].get_text()
print('[中文名稱]', zwname)
infofile.write("[中文名稱]" + zwname + "\r\n")

同時,上述代碼呼叫codecs庫進行了檔案處理,其中檔案操作的核心代碼如下,打開檔案三個引數分別是:檔案名、讀寫方式、編碼方式,此處檔案名為“Result_Douban.txt”,采用檔案寫方式(a),編碼方式是utf-8,

infofile = codecs.open("Result_Douban.txt", 'a', 'utf-8') #打開檔案
infofile.write(num+" "+name+"\r\n") #寫檔案
infofile.close()                    #關閉檔案

3.獲取電影鏈接
電影鏈接對應的HTML原始碼如上圖9所示,定位到< div class=‘hd’ >節點下的< a >< /a >節點,然后獲取屬性位href的值,即:attrs[‘href’],

url_movie = tag.find(attrs={"class":"hd"}).a
urls = url_movie.attrs['href']
print('[網頁鏈接]', urls)

獲取評分和內容的方法一樣,呼叫函式即可獲取:

  • find(attrs={“class”:“star”}).get_text()

但是存在一個問題,它輸出的結果將評分數和評價數放在了一起,如“9.4 783221人評價”,而通常在做分析的時候,我們是將評分數存在一個變數中,評價數存在另一變數中,

這就需要進行簡單的文本處理,這里推薦大家使用前面講述過的正則運算式來處理,將此段代碼修改如下,呼叫re.compile(r’\d+.?\d*’)獲取字串中的數字,第一個數字為電影的分數,第二個數字為評論數,

#爬取評分和評論數
info = tag.find(attrs={"class":"star"}).get_text()
info = info.replace('\n',' ')
info = info.lstrip()
print(info)

mode = re.compile(r'\d+\.?\d*') #正則運算式獲取數字
print(mode.findall(info))

i = 0
for n in mode.findall(info):
    if i==0:
        print('[分數]', n)
        infofile.write("[分數]" + n + "\r\n")
    elif i==1:
        print('[評論]', n)
        infofile.write(u"[評論]" + n + "\r\n")
    i = i + 1

獲取的結果前后對比如圖10所示,

在這里插入圖片描述

這樣,整個豆瓣250部電影資訊就爬取成功了,接下來,我們再繼續深入,去到具體的每個網頁中,爬取詳細資訊及更多的評論,同時,作者更推崇的是本文講解的分析方法,只有知道了具體的方法才能解決具體的問題,


三.鏈接跳轉分析及詳情頁面爬取

在第二部分我們詳細分析了如何爬取豆瓣前250部電影資訊,同時爬取了每部電影對應詳細頁面的超鏈接,本小節主要結合每部電影的超鏈接url網站,定位到具體的電影頁面,進行深一步的詳情頁面爬取,這里作者還是采用電影《肖申克的救贖》舉例,前面爬取了該電影的超鏈接地址為:

  • https://movie.douban.com/subject/1292052/

該網頁打開如圖11所示,

在這里插入圖片描述

作者主要分析如何爬取該部電影的導演資訊、電影簡介資訊以及熱門影評資訊,其中影評資訊如圖12所示,

在這里插入圖片描述

1.爬取詳情頁面基本資訊
下面對詳情頁面進行DOM樹節點分析,其基本資訊位于< div class=‘article’ >…< /div >標簽下,核心內容位于該節點下的子節點中,即< div id=‘info’ >…< /div >,使用如下代碼獲取內容:

info = soup.find(attrs={"id":"info"})
print(info.get_text())

在這里插入圖片描述

2.爬取詳情頁面電影簡介
同樣,通過瀏覽器審查元素,可以得到如圖14所示的電影簡介HTML原始碼,其電影簡介位于< div class=‘related-info’ >…< /div >節點下,它包括簡短版(short)的簡介和隱藏的詳細版簡介(all_hidden),這里作者通過下列函式獲取,代碼replace(’\n’,’’).replace(’ ‘,’’)用于過濾所爬取HTML中多余的空格和換行符號,

other = soup.find(attrs={"class":"related-info"}).get_text()
print other.replace('\n','').replace(' ','')  #過濾空格和換行

在這里插入圖片描述

3.爬取詳情頁面電影熱門評論資訊
熱門評論資訊位于< div id=‘hot-comments’ >…< /div >節點下,然后獲取節點下的多個class屬性為“comment-item”的div布局,如下圖所示,在使用find()或find_all()函式進行爬取時,需要注意標簽屬性是class還是id,或是其它,必須與之對應一致,才能正確爬取,

#評論
print('\n評論資訊:')
for tag in soup.find_all(attrs={"id":"hot-comments"}):
    for comment in tag.find_all(attrs={"class":"comment-item"}):
        com = comment.find("p").get_text()   #爬取段落p
        print com.replace('\n','').replace(' ','')

在這里插入圖片描述

完整代碼如下:

test03.py

# -*- coding: utf-8 -*-
# By:Eastmount CSDN
import urllib.request
import re 
from bs4 import BeautifulSoup
import codecs

#-----------------------------------爬取詳細資訊-------------------------------------
def getInfo(url, headers):
    page = urllib.request.Request(url, headers=headers)
    page = urllib.request.urlopen(page)
    content = page.read()
    soup = BeautifulSoup(content, "html.parser")
    
    #電影簡介
    print('電影簡介:')
    info = soup.find(attrs={"id":"info"})
    print(info.get_text())
    other = soup.find(attrs={"class":"related-info"}).get_text()
    print(other.replace('\n','').replace(' ',''))
    
    #評論
    print('\n評論資訊:')
    for tag in soup.find_all(attrs={"id":"hot-comments"}):
        for comment in tag.find_all(attrs={"class":"comment-item"}):
            com = comment.find("p").get_text()
            print(com.replace('\n','').replace(' ',''))
    print("\n\n\n----------------------------------------------------------------")
            
#-------------------------------------爬蟲函式-------------------------------------
def crawl(url, headers):
    page = urllib.request.Request(url, headers=headers)
    page = urllib.request.urlopen(page)
    contents = page.read()
    soup = BeautifulSoup(contents, "html.parser") 
    
    for tag in soup.find_all(attrs={"class":"item"}):
        #爬取序號
        num = tag.find('em').get_text()
        print(num)
        
        #電影名稱
        name = tag.find_all(attrs={"class":"title"})
        zwname = name[0].get_text()
        print('[中文名稱]', zwname)
        
        #網頁鏈接
        url_movie = tag.find(attrs={"class":"hd"}).a
        urls = url_movie.attrs['href']
        print('[網頁鏈接]', urls)
        
        #爬取評分和評論數
        info = tag.find(attrs={"class":"star"}).get_text()
        info = info.replace('\n',' ')
        info = info.lstrip()
        
        #正則運算式獲取數字
        mode = re.compile(r'\d+\.?\d*')
        i = 0
        for n in mode.findall(info):
            if i==0:
                print('[電影分數]', n)
            elif i==1:
                print('[電影評論]', n)
            i = i + 1
        
        #獲取評語
        getInfo(urls, headers)
        
#-------------------------------------主函式-------------------------------------
if __name__ == '__main__':
    #訊息頭
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
               AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}

    #翻頁
    i = 0
    while i<10:
        print('頁碼', (i+1))
        num = i*25 #每次顯示25部 URL序號按25增加
        url = 'https://movie.douban.com/top250?start=' + str(num) + '&filter='
        crawl(url, headers)
        i = i + 1

其中爬取的《龍貓》電影資訊輸出如圖16所示,

在這里插入圖片描述

講到這里,使用BeautifulSoup技術分析爬取豆瓣電影前250部電影資訊的實體已經講解完畢,但在實際爬取程序中可能由于某些頁面不存在會導致爬蟲停止,這時需要使用例外陳述句“try-except-finally”進行處理,

同時,爬取程序中需要結合自己所需資料進行定位節點,存盤至本地檔案中,也需要結合字串處理過濾一些多余的空格或換行,


四.總結

在學習網路爬蟲之前,讀者首先要掌握分析網頁節點、審查元素定位標簽,甚至是翻頁跳轉、URL分析等知識,然后才是通過Python、Java或C#實作爬蟲的代碼,本文作者結合自己多年的網路爬蟲開發經驗,深入講解了BeautifulSoup技術網頁分析并爬取了豆瓣電影資訊,讀者可以借用本章的分析方法,結合BeautifulSoup庫爬取所需的網頁資訊,并學會分析網頁跳轉,盡可能爬取完整的資料集,

同時,本章所爬取的內容是存盤至TXT檔案中的,讀者也可以嘗試著存盤至Excel、CSV、Json檔案中,甚至存盤至資料庫,這將為您后面的資料分析提供強大的資料支撐,資料處理起來更為方便,那么,Python究竟怎么將所爬取的文本存盤至資料庫呢?后續作者將帶給您答案,

該系列所有代碼下載地址:

  • https://github.com/eastmountyxz/Python-zero2one

2020年在github的綠瓷磚終于貼完了第一年提交2100余次,獲得1500多+stars,開源93個倉庫,300個粉絲,挺開心的,希望自己能堅持在github打卡五年,督促自己不斷前行,簡單總結下,最滿意的資源是YQ爆發時,去年2月分享的輿情分析和情感分析,用這系列有溫度的代碼為武漢加油;最高贊的是Python影像識別系列,也獲得了第一位來自國外開發者的貢獻補充;最花時間的是Wannacry逆向系列,花了我兩月逆向分析,幾乎成為了全網最詳細的該蠕蟲分析;還有AI系列、知識圖譜實戰、CVE復現、APT報告等等,當然也存在很多不足之處,希望來年分享更高質量的資源,也希望能將安全和AI頂會論文系列總結進來,真誠的希望它們能幫助到大家,感恩有你,一起加油~

在這里插入圖片描述

最后,真誠地感謝您關注“娜璋之家”公眾號,感謝CSDN這么多年的陪伴,會一直堅持分享,希望我的文章能陪伴你成長,也希望在技術路上不斷前行,文章如果對你有幫助、有感悟,就是對我最好的回報,且看且珍惜!2020年8月18日建立的公眾號,再次感謝您的關注,也請幫忙宣傳下“娜璋之家”,哈哈~初來乍到,還請多多指教,

在這里插入圖片描述

(By:娜璋之家 Eastmount 2021-02-17 夜于貴陽 https://blog.csdn.net/Eastmount )


參考文獻如下:

  • 作者書籍《Python網路資料爬取及分析從入門到精通》
  • 作者博客:https://blog.csdn.net/Eastmount
  • 北京豆網科技有限公司——豆瓣
  • [python爬蟲] BeautifulSoup和Selenium對比爬取豆瓣Top250電影資訊 - Eastmount
  • Crummy.com網站. BeautifulSoup 4.2.0檔案
  • [python知識] 爬蟲知識之BeautifulSoup庫安裝及簡單介紹 - Eastmount

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260594.html

標籤:python

上一篇:爬蟲實戰:爬取相親網站,看看當下年輕小姐姐的擇偶觀。

下一篇:day16 階段總結

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more