最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用Python實(shí)現(xiàn)爬取百度熱搜信息

 更新時(shí)間:2022年01月13日 09:20:55   作者:And_0n3  
大家好,本篇文章主要講的是用Python實(shí)現(xiàn)爬取百度熱搜信息,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下

前言

何為爬蟲(chóng),其實(shí)就是利用計(jì)算機(jī)模擬人對(duì)網(wǎng)頁(yè)的操作

例如 模擬人類(lèi)瀏覽購(gòu)物網(wǎng)站

使用爬蟲(chóng)前一定要看目標(biāo)網(wǎng)站可刑不可刑 :-)

可以在目標(biāo)網(wǎng)站添加/robots.txt 查看網(wǎng)頁(yè)具體信息

例如對(duì)天貓  可輸入  https://brita.tmall.com/robots.txt 進(jìn)行查看

User-agent 代表發(fā)送請(qǐng)求的對(duì)象

星號(hào)*代表任何搜索引擎

Disallow 代表不允許訪問(wèn)的部分

/代表從根目錄開(kāi)始

Allow代表允許訪問(wèn)的部分

在本例中 我爬取的百度熱搜前30的新聞(本人原本打算爬取英雄聯(lián)盟主頁(yè) 數(shù)據(jù)中心 大亂斗勝率前五十的英雄信息 奈何不會(huì)實(shí)現(xiàn)延時(shí)爬取網(wǎng)頁(yè)的操作 無(wú)奈只能爬百度熱搜) 并且其大致信息放到Excel表格以及Flask網(wǎng)頁(yè)中實(shí)現(xiàn)數(shù)據(jù)可視化  感興趣的同學(xué)也可以對(duì)其它內(nèi)容進(jìn)行爬取

由于本人水平有限 本文章中的爬蟲(chóng)都是比較基礎(chǔ)的東西

庫(kù)函數(shù)準(zhǔn)備

Python庫(kù)的安裝方法:

打開(kāi)cmd命令提示符輸入pip install XXX(這個(gè)是你要裝的庫(kù)名稱(chēng))

關(guān)于這些庫(kù)的具體使用 可以接下來(lái)看我的操作 

只需要簡(jiǎn)單掌握幾個(gè)常用的函數(shù)即可

bs4

即BeautifulSoup

用來(lái)解析HTML網(wǎng)頁(yè),提取指定數(shù)據(jù)的。

其中詳細(xì)的用法待會(huì)看我的演示。

re

正則表達(dá)式 用來(lái)匹配字符串中響應(yīng)的字串。

關(guān)于正則表達(dá)式 可以去看菜鳥(niǎo)教程 里邊講的很詳細(xì)

urllib

是一個(gè)Python自帶的HTTP請(qǐng)求庫(kù),可以操作一系列URL。

xlwt/xlrt

用于寫(xiě)入(write) / 讀取(read)Excel表中的數(shù)據(jù)。

flask

這個(gè)庫(kù)是用來(lái)只做一個(gè)簡(jiǎn)單的Web框架即網(wǎng)站,用于數(shù)據(jù)的可視化。

其實(shí)本人對(duì)于數(shù)據(jù)可視化的掌握也很淺薄,只是簡(jiǎn)單的將數(shù)據(jù)導(dǎo)入Web網(wǎng)頁(yè)中。

jinja2

這個(gè)庫(kù)的作用是為了實(shí)現(xiàn)在HTML網(wǎng)頁(yè)中的字符中插入自變量的功能。

后端:
name="HQ"
前端:
<p>{{name}}長(zhǎng)得真帥!</p>
顯示:
HQ長(zhǎng)得真帥!

markupsafe

與Jinja共用 在渲染頁(yè)面時(shí)用于避免不可信的輸入,防止注入攻擊(雖然沒(méi)人會(huì)攻擊你....)

數(shù)據(jù)爬取

數(shù)據(jù)爬取數(shù)據(jù)可視化 兩個(gè)py文件是分開(kāi)的

數(shù)據(jù)爬取需要導(dǎo)入re bs4 urllib xlwt 四個(gè)庫(kù)文件

網(wǎng)頁(yè)爬取

使用一下的方法調(diào)用函數(shù)可以使函數(shù)調(diào)用關(guān)系更加清晰

if __name__=="__main__":  #當(dāng)程序執(zhí)行時(shí) 調(diào)用一下函數(shù)
    main()
 
def askurl(url):
    head={
        "User-Agent":'''Mozilla/5.0 (Windows NT 10.0; Win64; x64)
         AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.55'''
    }
    #用戶(hù)代理 告訴服務(wù)器我只是一個(gè)普普通通的瀏覽器
    requset=urllib.request.Request(url)
    #發(fā)送請(qǐng)求
    response=urllib.request.urlopen(requset)
    #響應(yīng)的為一個(gè)request對(duì)象 
    #通過(guò)read()轉(zhuǎn)化為 bytes類(lèi)型字符串
    #再通過(guò)decode()轉(zhuǎn)化為 str類(lèi)型的字符串
 
    #接受響應(yīng)
    html=response.read().decode('utf-8')
    
    將抓取到的網(wǎng)頁(yè)存入文檔中 方便觀察
    path=r"C:\Users\XXX\Desktop\Python\text.txt"   
    #這里在字符串前加入r 防止字符串中的\發(fā)生轉(zhuǎn)義
 
    f=open(r"path",'w',encoding='utf-8')
    f.write(html)
    f.close()
    #這樣在txt文件中就可以查看網(wǎng)頁(yè)的源碼
 
    return html

headers的值可以在網(wǎng)頁(yè)中按F12

然后點(diǎn)擊網(wǎng)絡(luò)變化 對(duì)于任意一個(gè)請(qǐng)求標(biāo)頭 下拉到最下方即為 user-agent 代理信息

值得注意的是  請(qǐng)求中如果不設(shè)置headers 則服務(wù)器會(huì)返回一個(gè)418的狀態(tài)碼

代表服務(wù)器識(shí)別出來(lái)你是一個(gè)爬蟲(chóng) 并且表示:“ I'm a teapot ”

表明服務(wù)器拒絕沖煮咖啡,因?yàn)樗肋h(yuǎn)是一個(gè)茶壺(這是一個(gè)梗)

數(shù)據(jù)解析

將抓取的txt文件后綴改為html后打開(kāi)即為一個(gè)本地的網(wǎng)頁(yè)

如果在vscode中因?yàn)樾羞^(guò)長(zhǎng)而產(chǎn)生報(bào)錯(cuò) 可以參考以下博客

 打開(kāi)后的網(wǎng)頁(yè)如圖所示

使用這個(gè)功能查看需要爬取信息的位置

在本項(xiàng)目中 我們抓取目標(biāo)信息的標(biāo)題 內(nèi)容 熱度 以及鏈接

我們可以發(fā)現(xiàn) 我們需要的信息全部在class為以下類(lèi)型的表中

 于是我們用Beautifulsoup對(duì)網(wǎng)頁(yè)進(jìn)行解析

def getData(html):
    datalist=[]
    soup=BeautifulSoup(html,"html.parser")   #定義一個(gè)解析對(duì)象
    
    #soup.find_all(a,b) 其中a為標(biāo)簽的類(lèi)型 class_ 對(duì)div的class進(jìn)行匹配 
    #返回的是所有class為category-wrap_iQLoo horizontal_1eKyQ的列表
    
    for item in soup.find_all('div',class_="category-wrap_iQLoo horizontal_1eKyQ"):
        item=str(item)
        #將列表中每一個(gè)子標(biāo)簽轉(zhuǎn)換為字符串用于re匹配

接下來(lái)對(duì)每一個(gè)item進(jìn)行re匹配

首先使用re.compile()創(chuàng)建匹配規(guī)則 然后用findall進(jìn)行匹配

 匹配規(guī)則的創(chuàng)建方式為在HTML文件中查看目標(biāo)信息前后的特殊字符

而(.*?)即為要匹配的字符串 其中*后加?代表非貪婪匹配

例如

標(biāo)題前后信息即為ellipsis"></div> <div cla 

其它同理

#匹配規(guī)則
#鏈接
findlink=re.compile(r' href="(.*?)" rel="external nofollow"  target="_blank') 
#標(biāo)題
findtitle=re.compile(r'ellipsis"> (.*?) </div> <div cla') 
#內(nèi)容
findcontent1=re.compile(r'ellipsis_DupbZ"> (.*?) <a class=')
findcontent2=re.compile(r'small_Uvkd3"> (.*?) <a class=')
#熱度
findnumber=re.compile(r'ex_1Bl1a"> (.*?) </div>')

而內(nèi)容部分 我在后續(xù)運(yùn)行的時(shí)候發(fā)現(xiàn)報(bào)錯(cuò) 原因是

部分內(nèi)容前綴為'ellipsis_DupbZ">   部分內(nèi)容前綴為small_Uvkd3">

因此我編寫(xiě)了兩種匹配方式

具體代碼如下

def getData(html):
    datalist=[]
    soup=BeautifulSoup(html,"html.parser")   #定義一個(gè)解析對(duì)象
    
    #soup.find_all(a,b) 其中a為標(biāo)簽的類(lèi)型 class_ 對(duì)div的class進(jìn)行匹配 
    #返回的是所有class為category-wrap_iQLoo horizontal_1eKyQ的列表
    
    for item in soup.find_all('div',class_="category-wrap_iQLoo horizontal_1eKyQ"):
        item=str(item)
        #將列表中每一個(gè)子標(biāo)簽轉(zhuǎn)換為字符串用于re匹配
        data=[]
        #標(biāo)題
        title=re.findall(findtitle,item)[0]
        #簡(jiǎn)介
        #判斷是否對(duì)第一種匹配 如果不是的話(huà)返回為空列表 此時(shí)應(yīng)采用第二種匹配
 
        if (len(re.findall(findcontent1,item))!=0):
            content=re.findall(findcontent1,item)[0]
        else:
            content=re.findall(findcontent2,item)[0]
        #熱度
        number=re.findall(findnumber,item)[0]
        #鏈接
        link=re.findall(findlink,item)[0]
 
        #將數(shù)據(jù)存入數(shù)組
        data.append(title)
        data.append(number)
        data.append(content)
        data.append(link)
        datalist.append(data)
        
    print(datalist)
    return datalist

數(shù)據(jù)保存

def Savedata(datalist):
    #存入數(shù)據(jù)的目標(biāo)路徑
    path=r'C:\Users\XXX\Desktop\Python\爬蟲(chóng)\data.xls'
    workbook=xlwt.Workbook(encoding='utf-8')
    #創(chuàng)建工作表對(duì)象
    worksheet=workbook.add_sheet('sheet1')
    #創(chuàng)建表單 
    col=("標(biāo)題","熱度","內(nèi)容","鏈接")
    #定義表含有的屬性
 
    for i in range(4):
        worksheet.write(0,i,col[i])
    #write(i,j,value) 向 表單的 [i][j] 位置寫(xiě)入value
    for i in range(30):
        for j in range(4):
            worksheet.write(i+1,j,datalist[i][j]) 
    #將excel表保存
    workbook.save(path)

總結(jié)

到此這篇關(guān)于用Python實(shí)現(xiàn)爬取百度熱搜信息的文章就介紹到這了,更多相關(guān)Python爬取百度熱搜內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

最新評(píng)論

太原市| 新乡市| 东至县| 贵德县| 白沙| 巴东县| 荣昌县| 凌云县| 苏州市| 瑞丽市| 保康县| 牟定县| 康平县| 班戈县| 新昌县| 贵州省| 托克托县| 南阳市| 分宜县| 鲁山县| 红原县| 新丰县| 西林县| 通辽市| 同江市| 旅游| 静宁县| 梓潼县| 阆中市| 墨竹工卡县| 霸州市| 杂多县| 喀喇| 四川省| 日照市| 沽源县| 新巴尔虎右旗| 吉木乃县| 策勒县| 龙口市| 安塞县|