成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Python 從零開(kāi)始爬蟲(chóng)(三)——實(shí)戰(zhàn):requests+BeautifulSoup實(shí)現(xiàn)靜態(tài)爬取

Codeing_ls / 1864人閱讀

摘要:前篇全片都是生硬的理論使用,今天就放個(gè)靜態(tài)爬取的實(shí)例讓大家體驗(yàn)一下的使用,了解一些背后的原理。給出網(wǎng)站打開(kāi)右鍵檢查第一個(gè)電影,分析源碼先,發(fā)現(xiàn)每個(gè)標(biāo)簽就對(duì)應(yīng)著一個(gè)電影的信息。

前篇全片都是生硬的理論使用,今天就放個(gè)靜態(tài)爬取的實(shí)例讓大家體驗(yàn)一下BeautifulSoup的使用,了解一些背后的原理。

順便在這引入靜態(tài)網(wǎng)頁(yè)的概念——靜態(tài)網(wǎng)頁(yè)是指一次性加載所有內(nèi)容的網(wǎng)頁(yè),爬蟲(chóng)一次請(qǐng)求便能得到所有信息,對(duì)爬蟲(chóng)非常友好,適合練手

豆瓣top250電影信息爬取

這是一個(gè)老掉牙的經(jīng)典實(shí)例了,但越是經(jīng)典,越有示范性作用,最重要的一點(diǎn)是,它是靜態(tài)的。
給出網(wǎng)站:https://movie.douban.com/top250
打開(kāi)F12/右鍵檢查第一個(gè)電影,分析源碼先,發(fā)現(xiàn)每個(gè)

  • 標(biāo)簽就對(duì)應(yīng)著一個(gè)電影的信息。

    我們來(lái)爬取每部電影的圖片,名稱,導(dǎo)演演員,類型,評(píng)分,和它的一句話總結(jié),繼續(xù)對(duì)

  • 標(biāo)簽進(jìn)行分析,又發(fā)現(xiàn)信息又在
    標(biāo)簽里,而這標(biāo)簽只存在于
  • 標(biāo)簽中,其它地方不存在,這樣可以用find_all()方法把他們?nèi)糠蛛x出來(lái)。這里不選擇
  • 標(biāo)簽是它沒(méi)有唯一性,電影以外的內(nèi)容也有
  • 標(biāo)簽

    布置好偽裝后就可一開(kāi)始根據(jù)每個(gè)

    標(biāo)簽進(jìn)行信息篩選了:

    圖片鏈接是

    的上上個(gè)兄弟標(biāo)簽
    的孫子的src屬性的值

    電影名有多個(gè),都在

    標(biāo)簽里,用get_text()把它們串起來(lái)

    導(dǎo)演演員是

    標(biāo)簽的第一段字符串

    類型是

    標(biāo)簽的第二段字符串

    評(píng)分和評(píng)分人數(shù)都在

    標(biāo)簽里,又用get_text()串起來(lái)

    一句話總結(jié)直屬于標(biāo)簽

    html中的&NBSP(實(shí)際上是小寫(xiě),這里大寫(xiě)避免markdown識(shí)別)對(duì)應(yīng)字符串中的xa0,可用replace方法替換掉

    url = "https://movie.douban.com/top250"
    headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"}
    r=requests.get(url,headers=headers)
    soup = BeautifulSoup(r.text,"lxml")
    
    for each in soup.find_all("div",class_="info"):
        img_url = each.previous_sibling.previous_sibling.a.img["src"]#圖片鏈接
        
        """with open("*.jpg","wb") as img:#還可以順便下載回來(lái),名字自起
        img.write(requests.get(img_url,headers=headers).content)"""
        
        
        title=each.find("div",class_="hd").get_text(strip=True).replace("xa0","")#標(biāo)題
        actor = list(each.find("p",class_="").strings)[0].strip().replace("xa0","")#導(dǎo)演演員
        type_ = list(each.find("p",class_="").strings)[1].strip().replace("xa0","")#類型
        score = each.find("div",class_="star").get_text("/",strip=True)#評(píng)分及人數(shù)
        quote = each.find("span",class_="inq").string#一句話總結(jié)
        print([img_url,title,actor,type_,score,quote])#這里只簡(jiǎn)單打出來(lái)看下,怎樣存儲(chǔ)由你來(lái)決定

    ??但是這樣只有25部電影啊,是的,"https://movie.douban.com/top250"指向第一頁(yè),我們現(xiàn)在只爬了一頁(yè),其實(shí)還有9頁(yè)還沒(méi)爬啊,這是就要構(gòu)造網(wǎng)址了。

    ??我們點(diǎn)到第二頁(yè),發(fā)現(xiàn)網(wǎng)址變成了https://movie.douban.com/top2...,第三頁(yè)start條件值變成50,我們可以得出結(jié)論,每下一頁(yè),start條件值就加25。第一頁(yè)start=0,第二頁(yè)start=25.....第十頁(yè)start=225。這樣就可以循環(huán)構(gòu)造網(wǎng)頁(yè)并爬取了,這交給讀者實(shí)現(xiàn)
    ??下面筆者提供另一種思路:網(wǎng)頁(yè)不是有下一頁(yè)的按鈕嗎,右鍵檢查一下,發(fā)現(xiàn)它已經(jīng)包含了要構(gòu)造的部分了,是一個(gè)屬性值,提取出來(lái)接到原網(wǎng)址上即得到下一頁(yè)的網(wǎng)址,這樣能完全爬取所有頁(yè)數(shù),不用像上面一樣設(shè)置循環(huán)次數(shù)。

    貼上完整代碼

    import requests
    from bs4 import BeautifulSoup
    
    
    url = "https://movie.douban.com/top250"
    with open("douban.txt","w",encoding="utf-8") as f:
        while url :
            headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36"}
    
            r=requests.get(url,headers=headers)
            soup = BeautifulSoup(r.text,"lxml")
    
            for each in soup.find_all("div",class_="info"):
                img_url = each.previous_sibling.previous_sibling.a.img["src"]
                title=each.find("div",class_="hd").get_text(strip=True).replace("xa0","")
                actor = list(each.find("p",class_="").strings)[0].strip().replace("xa0","")
                #將生成器list化后索引,strip()去除兩邊空格再用空字符替換 
                type_ = list(each.find("p",class_="").strings)[1].strip().replace("xa0","")
                score = each.find("div",class_="star").get_text("/",strip=True)
                if each.find("span",class_="inq"):#注意有部電影沒(méi)有總結(jié),也就沒(méi)有標(biāo)簽這里用if檢測(cè)一下防止None使用string方法報(bào)錯(cuò)
                    quote = each.find("span", class_="inq").string
                else:
                    quote = "沒(méi)有總結(jié)哦"
                print([img_url,title,actor,type_,score,quote])
    
                try:#到最后一頁(yè)時(shí)沒(méi)有下一頁(yè)按鈕,會(huì)報(bào)TypeError,這時(shí)用try語(yǔ)句讓url=None使while循環(huán)停止
                    url = "https://movie.douban.com/top250" + soup.find("span",class_="next").a["href"]
                except TypeError:
                    url = None

    本實(shí)例的篩選方法已經(jīng)講的很細(xì)致了,幾乎提及了BeautifulSoup的所有方法,希望大家能通過(guò)此實(shí)例能加深對(duì)BeautifulSoup的理解,然后自己手打一些爬蟲(chóng)出來(lái),小的十幾行多的幾十行都可以,爬貼吧什么的都可以。

    還是那句話“只看不實(shí)踐的程序員不是好程序員

    下一篇應(yīng)該會(huì)將正則表達(dá)式,更加強(qiáng)大也更加難的信息匹配方法
    下下篇了解一下動(dòng)態(tài)爬取?

    文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

    轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/41578.html

    相關(guān)文章

    • Python爬蟲(chóng)基礎(chǔ)

      摘要:爬蟲(chóng)架構(gòu)架構(gòu)組成管理器管理待爬取的集合和已爬取的集合,傳送待爬取的給網(wǎng)頁(yè)下載器。網(wǎng)頁(yè)下載器爬取對(duì)應(yīng)的網(wǎng)頁(yè),存儲(chǔ)成字符串,傳送給網(wǎng)頁(yè)解析器。從文檔中獲取所有文字內(nèi)容正則匹配后記爬蟲(chóng)基礎(chǔ)知識(shí),至此足夠,接下來(lái),在實(shí)戰(zhàn)中學(xué)習(xí)更高級(jí)的知識(shí)。 前言 Python非常適合用來(lái)開(kāi)發(fā)網(wǎng)頁(yè)爬蟲(chóng),理由如下:1、抓取網(wǎng)頁(yè)本身的接口相比與其他靜態(tài)編程語(yǔ)言,如java,c#,c++,python抓取網(wǎng)頁(yè)文檔的接...

      bang590 評(píng)論0 收藏0
    • python爬蟲(chóng)學(xué)習(xí)教程,爬取網(wǎng)易云音樂(lè)!

      摘要:其次,使用后,還需要針對(duì)做特定處理??吹竭@就可以構(gòu)想一下爬蟲(chóng)的爬取邏輯了。 運(yùn)行環(huán)境 我的運(yùn)行環(huán)境如下: 系統(tǒng)版本 Windows10。 Python版本 Python3.5,推薦使用Anaconda 這個(gè)科學(xué)計(jì)算版本,主要是因?yàn)樗詭б粋€(gè)包管理工具,可以解決有些包安裝錯(cuò)誤的問(wèn)題。去Anaconda官網(wǎng),選擇Python3.5版本,然后下載安裝。 IDE 我使用的是PyCharm,是專...

      Olivia 評(píng)論0 收藏0

    發(fā)表評(píng)論

    0條評(píng)論

  • 閱讀需要支付1元查看
    <