【Python3爬蟲】百度貼吧爬蟲

来源:https://www.cnblogs.com/TM0831/archive/2018/09/17/9645229.html
-Advertisement-
Play Games

先說下我寫這個爬蟲的思路吧:首先是利用selenium模擬瀏覽器,然後搜索貼吧名,如果不存在就提示“沒有找到該貼吧”,然後重新輸入,如果搜到了這個貼吧,就進入該貼吧並且顯示該貼吧首頁上的所有帖子,然後我們可以選擇查看哪一個帖子,程式就會返回該帖子的內容,對於評論較多的帖子,還可以查看下一頁,如果想看 ...


先說下我寫這個爬蟲的思路吧:首先是利用selenium模擬瀏覽器,然後搜索貼吧名,如果不存在就提示“沒有找到該貼吧”,然後重新輸入,如果搜到了這個貼吧,就進入該貼吧並且顯示該貼吧首頁上的所有帖子,然後我們可以選擇查看哪一個帖子,程式就會返回該帖子的內容,對於評論較多的帖子,還可以查看下一頁,如果想看別的帖子,可以退回到首頁重新選擇。

 

環境:Windows7,Python3.5,pycharm

使用到的庫:requests,re,selenium,time

 

具體步驟:

一、搜索貼吧

先搜索一個存在的貼吧(比如python),得到的網頁鏈接是http://tieba.baidu.com/f?ie=utf-8&kw=python&fr=search&red_tag=q3127125854

然後搜索一個不存在的貼吧(比如sad213),得到的網頁鏈接是http://tieba.baidu.com/f/search/res?qw=sad213&sm=2&cf=1&ie=utf-8&red_tag=r3419770693

對比兩個鏈接可知,如果返回的鏈接里包含tieba.baidu.com/f?ie=utf-8,則該貼吧存在。所以我利用selenium模擬瀏覽器,根據返回的結果判斷搜索的貼吧是否存在。

 

二、顯示貼吧首頁的帖子

在搜索到貼吧之後,我們要進入該貼吧並查看該貼吧首頁上的帖子,這部分實現起來不算難。

首先是獲取網頁源碼,用requests.get()方法請求網頁,然後列印出text內容,可以找到如下部分。

要提取發帖人的名字和帖子主題,我選擇用正則表達式來實現,具體代碼如下:

titles = re.findall('<a rel="noreferrer" href="/p/(\w+)" title="(.*?)"', res.text)
authors = re.findall('title="主題作者: (.*?)"', res.text)

 這樣我們就能成功獲取首頁上的帖子信息了。

 

三、查看某一個帖子

要查看一個帖子里的內容,第一步是和上面的步驟一樣的,用get方法請求網頁,然後列印text,再用正則表達式提取回覆人的名字和回覆內容。

接下來的步驟花了我不少時間,因為很多人在評論的時候會發表情,而這些表情我們是無法將它顯示出來的,因此我選擇將表情對應的鏈接顯示出來,如果要看別人發的是什麼表情,直接點鏈接進去就能看到了。對於評論中的圖片,我也是這麼處理的,將圖片的鏈接顯示出來。

 

這一步還有一個坑,就是因為有些人的回覆是帶有回覆框的,也就是說這些人的評論是包裹在div里的,用上面的方法是無法得到他們的回覆的。

通過觀察網頁源碼,我發現可以用正則表達式匹配到這部分回覆,然後對於這些回覆,也要進行處理後再顯示出來。

 

comment_list2 = re.findall('post_bubble_middle_inner">(.*?)<div', res.text, re.DOTALL)
comment = comment_list2[num].replace('<br>', ' ').replace('</div>', ' ')

 

 

 

這樣我們就能夠搜索貼吧並且進入貼吧查看我們想看的帖子了==

 

具體源碼如下:

  1 import requests
  2 import time
  3 import re
  4 from selenium import webdriver
  5 
  6 headers = {
  7     "user-agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/"
  8                   "53.0.2785.89 Safari/537.36"
  9 }
 10 
 11 
 12 class TieBa:
 13     def __init__(self, name, url):
 14         self.name = name  # 貼吧名
 15         self.url = url  # 貼吧首頁的url
 16 
 17     # 顯示首頁上的帖子作者和標題
 18     def get_homepage(self):
 19         print("\n\t\t\t\t\t\t{}吧".format(self.name))
 20         res = requests.get(self.url, headers=headers)
 21         titles = re.findall('<a rel="noreferrer" href="/p/(\w+)" title="(.*?)"', res.text)
 22         authors = re.findall('title="主題作者: (.*?)"', res.text)
 23         for title, author in zip(titles, authors):
 24             print(str(titles.index(title) + 1) + "--" + author + "" + title[1])
 25         print("\n****************************")
 26         n = int(input("請輸入您想要查看的帖子序號:"))
 27         print("****************************\n")
 28         self.get_page("http://tieba.baidu.com/p/" + titles[n - 1][0])
 29 
 30     # 顯示帖子的具體內容
 31     def get_page(self, page_url):
 32         res = requests.get(page_url, headers=headers)
 33         author_list = re.findall('p_author_name j_user_card.*?>(.*?)<', res.text)
 34         comment_list = re.findall('content  clearfix">(.*?)</div>', res.text, re.DOTALL)
 35         if len(comment_list) == 0:
 36             comment_list = re.findall('d_post_content j_d_post_content ">(.*?)</div>', res.text, re.DOTALL)
 37 
 38         # 帶回覆框的單獨考慮
 39         comment_list2 = re.findall('post_bubble_middle_inner">(.*?)<div', res.text, re.DOTALL)
 40         num = 0
 41 
 42         # 處理圖片和表情,顯示對應的鏈接
 43         for author, comment in zip(author_list, comment_list):
 44             print(author.strip(), end=" : ")
 45             comment = comment.strip().replace('<br>', ' ')
 46             if "<div" in comment:  # 解析有評論框的評論
 47                 comment = comment_list2[num].replace('<br>', ' ').replace('</div>', ' ')
 48                 num += 1
 49             if "src" in comment:  # 處理圖片信息
 50                 src_list = re.findall('src="(.*?)"', comment)
 51                 pattern_list = re.findall('(<img.*?>)', comment)
 52                 for s, p in zip(src_list, pattern_list):
 53                     comment = comment.replace(p, ' ' + s)
 54             if "href" in comment:  # 處理表情信息
 55                 pattern_list = re.findall('(<a .*? >)', comment)
 56                 for p in pattern_list:
 57                     comment = comment.replace(p, ' ').replace("</a>", '')
 58             print(comment)
 59 
 60         while True:
 61             x = int(input("\n輸入1查看下一頁,輸入0回到首頁,輸入-1退出程式:"))
 62             if x == -1:
 63                 exit()
 64             if x == 0:
 65                 self.get_homepage()
 66             if x == 1:
 67                 next_page = re.findall('<a href="(.*?)">下一頁', res.text)
 68                 if len(next_page)>0:
 69                     self.get_page("http://tieba.baidu.com" + next_page[0])
 70                 else:
 71                     print("已經是最後一頁了!")
 72 
 73 
 74 # 利用selenium模擬瀏覽器查找貼吧
 75 def search():
 76     chrome_options = webdriver.ChromeOptions()
 77     chrome_options.add_argument('--headless')
 78     browser = webdriver.Chrome(chrome_options=chrome_options)
 79 
 80     browser.get("https://tieba.baidu.com/")
 81     name = input("請輸入想要進入的貼吧名字:")
 82     browser.find_element_by_xpath('//*[@id="wd1"]').send_keys(name)
 83     browser.find_element_by_xpath('//*[@id="tb_header_search_form"]/span[1]/a').click()
 84     url = browser.current_url
 85     if "tieba.baidu.com/f?ie=utf-8" in url:  # 搜索的貼吧存在
 86         print("正在進入{}吧,請稍等...".format(name))
 87         time.sleep(2)
 88         t = TieBa(name, url)
 89         t.get_homepage()
 90     else:
 91         print("沒有找到{}吧\n".format(name))
 92         main()
 93 
 94 
 95 def main():
 96     x = int(input("輸入1搜索進入貼吧,輸入-1退出程式:"))
 97     if x == 1:
 98         search()
 99     else:
100         exit()
101 
102 
103 if __name__ == '__main__':
104     main()

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

-Advertisement-
Play Games
更多相關文章
  • Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1340 Accepted Submission(s): 891 Problem Des ...
  • 通用的(泛型)演算法 之 只讀演算法,寫演算法,排序演算法 只讀演算法: | 函數名 | 功能描述 | | | | | accumulate | 求容器里元素的和 | | equal | 比較2個容器里的元素 | 寫演算法 | 函數名 | 功能描述 | | | | | fill | 用給定值,覆蓋給定的範圍的元 ...
  • Spring Boot 日誌篇 1、日誌框架(故事引入) 小張;開發一個大型系統; ​ 1、System.out.println("");將關鍵數據列印在控制台;去掉?寫在一個文件? ​ 2、框架來記錄系統的一些運行時信息;日誌框架 ; zhanglogging.jar; ​ 3、高大上的幾個功能? ...
  • 此系列將記錄本人從開始到結束做物料管理系統的過程 登錄界面的設計 此博客將實現如下界面: 當用戶名或密碼沒輸入時將顯示相應的提示信息,採用java swing實現 代碼: ...
  • 數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出0。 兩種方式: 1.定義一個新數組arr,遍曆數組給arr賦值,arr[元素]=出現的次數 ... ...
  • 已經有兩個月沒有寫博客了,也有好幾個月沒有看go相關的內容了,由於工作原因最近在做java以及大數據相關的內容,導致最近工作較忙,博客停止了更新,正好想撿起之前go的東西,所以找了一個源碼學習 這個也是之前用go寫日誌收集的時候用到的一個包 :github.com/hpcloud/tail, 這次就 ...
  • 目前主要功能是完成知乎視頻的下載. 在抓包和網頁分析發現有blob:https://...格式的視頻鏈接, 但是無法訪問, 不過知乎好像是m3u8格式的, 具體的我也不太清楚, 但這並不妨礙我們的下載工作. 其中ts就是被分割後的相對url, 拼接後就可以下載播放了, 不過這裡還要做的就是將所有被分 ...
  • 比賽鏈接 上紫啦hhh,好開心 每個題裡面都有中文翻譯,我就不說題意了。。 A 直接模擬即可 #include<cstdio> #include<algorithm> #define int long long using namespace std; const int MAXN = 1e5 + ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...