Python3爬蟲之虎撲論壇步行街【requests、Beautiful Soup、MongoDB】

2021-02-18 測試工程師小站
【1x00】循環爬取網頁模塊

觀察虎撲論壇步行街分區,請求地址為:
https://bbs.hupu.com/bxj

第一頁:https://bbs.hupu.com/bxj

第二頁:https://bbs.hupu.com/bxj-2

第三頁:https://bbs.hupu.com/bxj-3

不難發現,每增加一頁,只需要添加 -頁數 參數即可,最後一頁是第 50 頁,因此可以利用 for 循環依次爬取,定義一個 get_pages() 函數,返回初始化 Beautiful Soup 的對象 page_soup,方便後面的解析函數調用

雖然一共有 50 頁,但是當用戶訪問第 10 頁以後的頁面的時候,會要求登錄虎撲,不然就沒法查看,而且登錄時會出現智能驗證,所以程序只爬取前 10 頁的數據

def get_pages(page_url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
    }
    response = requests.get(url=page_url, headers=headers)
    page_soup = BeautifulSoup(response.text, 'lxml')
    return page_soup

if __name__ == '__main__':
    for i in range(1, 11):
        url = 'https://bbs.hupu.com/bxj-' + str(i)
        soup = get_pages(url)

【2x00】解析模塊

使用 Beautiful Soup 對網頁各個信息進行提取,最後將這些信息放進一個列表裡,然後調用列表的 .append() 方法,再將每條帖子的列表依次加到另一個新列表裡,最終返回的是類似於如下形式的列表:

[['帖子1', '作者1'], ['帖子2', '作者2'], ['帖子3', '作者3']]

這樣做的目的是:方便 MongoDB 依次儲存每一條帖子的信息

def parse_pages(page_soup):
    data_list = []
    all_list = page_soup.find('ul', class_='for-list')
    post_list = all_list.find_all('li')
    # print(result_list)
    for post in post_list:
        # 帖子名稱
        post_title = post.find('a', class_='truetit').text
        # print(post_title)
        # 帖子連結
        post_url = 'https://bbs.hupu.com' + post.find('a', class_='truetit')['href']
        # print(post_url)
        # 作者
        author = post.select('.author > a')[0].text
        # print(author)
        # 作者主頁
        author_url = post.select('.author > a')[0]['href']
        # print(author_url)
        # 發布日期
        post_date = post.select('.author > a')[1].text
        # print(post_date)
        reply_view = post.find('span', class_='ansour').text
        # 回複數
        post_reply = reply_view.split('/')[0].strip()
        # print(post_reply)
        # 瀏覽量
        post_view = reply_view.split('/')[1].strip()
        # print(post_view)
        # 最後回復時間
        last_data = post.select('.endreply > a')[0].text
        # print(last_data)
        # 最後回復用戶
        last_user = post.select('.endreply > span')[0].text
        # print(last_user)

        data_list.append([post_title, post_url, author, author_url, post_date, post_reply, post_view, last_data, last_user])

    # print(data_list)
    return data_list

【3x00】MongoDB 數據儲存模塊

首先使用 MongoClient() 方法,向其傳入地址參數 host 和 埠參數 port,指定資料庫為 hupu,集合為 bxj

將解析函數返回的列表傳入到儲存函數,依次循環該列表,對每一條帖子的信息進行提取並儲存

def mongodb(data_list):
    client = MongoClient('localhost', 27017)
    db = client.hupu
    collection = db.bxj
    for data in data_list:
        bxj = {
            '帖子名稱': data[0],
            '帖子連結': data[1],
            '作者': data[2],
            '作者主頁': data[3],
            '發布日期': str(data[4]),
            '回複數': data[5],
            '瀏覽量': data[6],
            '最後回復時間': str(data[7]),
            '最後回復用戶': data[8]
        }
        collection.insert_one(bxj)

【4x00】完整代碼

# =============================================
# --*-- coding: utf-8 --*--
# @Time    : 2019-10-12
# @Author  : TRHX
# @Blog    : www.itrhx.com
# @CSDN    : https://blog.csdn.net/qq_36759224
# @FileName: hupu.py
# @Software: PyCharm
# =============================================

import requests
import time
import random
from pymongo import MongoClient
from bs4 import BeautifulSoup


def get_pages(page_url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
    }
    response = requests.get(url=page_url, headers=headers)
    page_soup = BeautifulSoup(response.text, 'lxml')
    return page_soup


def parse_pages(page_soup):
    data_list = []
    all_list = page_soup.find('ul', class_='for-list')
    post_list = all_list.find_all('li')
    # print(result_list)
    for post in post_list:
        # 帖子名稱
        post_title = post.find('a', class_='truetit').text
        # print(post_title)
        # 帖子連結
        post_url = 'https://bbs.hupu.com' + post.find('a', class_='truetit')['href']
        # print(post_url)
        # 作者
        author = post.select('.author > a')[0].text
        # print(author)
        # 作者主頁
        author_url = post.select('.author > a')[0]['href']
        # print(author_url)
        # 發布日期
        post_date = post.select('.author > a')[1].text
        # print(post_date)
        reply_view = post.find('span', class_='ansour').text
        # 回複數
        post_reply = reply_view.split('/')[0].strip()
        # print(post_reply)
        # 瀏覽量
        post_view = reply_view.split('/')[1].strip()
        # print(post_view)
        # 最後回復時間
        last_data = post.select('.endreply > a')[0].text
        # print(last_data)
        # 最後回復用戶
        last_user = post.select('.endreply > span')[0].text
        # print(last_user)

        data_list.append([post_title, post_url, author, author_url, post_date, post_reply, post_view, last_data, last_user])

    # print(data_list)
    return data_list


def mongodb(data_list):
    client = MongoClient('localhost', 27017)
    db = client.hupu
    collection = db.bxj
    for data in data_list:
        bxj = {
            '帖子名稱': data[0],
            '帖子連結': data[1],
            '作者': data[2],
            '作者主頁': data[3],
            '發布日期': str(data[4]),
            '回複數': data[5],
            '瀏覽量': data[6],
            '最後回復時間': str(data[7]),
            '最後回復用戶': data[8]
        }
        collection.insert_one(bxj)


if __name__ == '__main__':
    for i in range(1, 11):
        url = 'https://bbs.hupu.com/bxj-' + str(i)
        soup = get_pages(url)
        result_list = parse_pages(soup)
        mongodb(result_list)
        print('第', i, '頁數據爬取完畢!')
        time.sleep(random.randint(3, 10))
    print('前10頁所有數據爬取完畢!')

【5x00】數據截圖

一共爬取到 1180 條數據:

【6x00】程序不足的地方

程序只能爬取前 10 頁的數據,因為虎撲論壇要求從第 11 頁開始,必須登錄帳號才能查看,並且登錄時會有智能驗證,可以使用自動化測試工具 Selenium 模擬登錄帳號後再進行爬取。

相關焦點

  • Requests的好基友BeautifulSoup4
    為什麼說是好基友呢,因為python爬蟲入門就要學bs4, 他是一個解析html的庫,非常好用.requests請求 bs4解析妥妥的.1.我們來看一下基本使用苦逼的博主沒有人給充值,想拿廣告當測試頁面有沒有,所以我們就拿北京居住證辦理平臺當測試頁面吧.測試頁面是張這個樣子的:
  • Python爬蟲從入門到精通(3): BeautifulSoup用法總結及多線程爬蟲爬取糗事百科
    我們還會利用requests庫和BeauitfulSoup來爬取糗事百科上的段子, 並對比下單線程爬蟲和多線程爬蟲的爬取效率。什麼是BeautifulSoup及如何安裝BeautifulSoup是一個解析HTML或XML文件的第三方庫。
  • 技術分享|利用Python和BeautifulSoup進行網頁爬取(新手教程)
    使用Python與BeautifulSoup可以很容易的進行網頁爬取,通過網站爬蟲獲取信息可以幫助企業或個人節省很多的時間和金錢。學習本文之後,我相信大部分新手都能根據自己的需求來開發出相應的網頁爬蟲。
  • Python3長徵路第004天--BeautifulSoup庫你也報錯的時候!
    文/愛琳玩python今天是python長徵之路的第四天了,感覺時間過得還是挺快的,在這裡還是先感謝你的點擊加閱讀,對我python3長徵之路的支持,在做這個python3長徵之路時,我有想過放棄,因為我畢竟學歷很低,不怕各位朋友笑話,我就一個高中生,而且還是個讀了4年的高中生,到最後都沒有考起大學的這麼一個人,當我在出生社會後,換過很多工作,心中卻依然放不下高中時的一個夢想
  • python爬蟲常用庫之BeautifulSoup詳解
    因為是第三方庫所以我們需要下載,在命令行敲下以下代碼進行下載pip install beautifulsoup4安裝第三方解析庫如果不知道有什麼用請往下看1.相關解析庫的介紹這裡官方推薦解析庫為lxml,因為它的效率高。
  • python程序媛BeautifulSoup快速入門
    爬蟲最常用就是要在response回的html文件中獲取我們想要的資源,而常用方法除了正則就是BeautifulSoup庫了。其實,媛媛本人呢,是習慣使用正則的,不過經常聽到很多同學表示正則太複雜,想要使用BeautifulSoup庫,今天呢,就滿足大家,帶著大家超級簡單案例,快速入門。
  • Python爬蟲教學(寫給入門的新手)
    前言剛學完python基礎,想學習爬蟲的新手,這裡有你想要的東西。
  • BeautifulSoup 詳細知識(一)
    beautifulsoup4Beautiful Soup提供一些簡單的、python
  • BeautifulSoup解析html介紹
    爬蟲抓取的數據以html數據為主。有時也是xml數據,xml數據對標籤的解析和html是一樣的道理,兩者都是<tag>來區分數據的。這種格式的數據結構可以說是一個頁面一個樣子,解析起來很麻煩。BeautifulSoup提供了強大的解析功能,可以幫助我們省去不少麻煩。使用之前安裝BeautifulSoup和lxml。
  • Python爬蟲html解析,還在用BeautifulSoup嗎?試試PyQuery吧
    在初學python時,大家都喜歡寫些小腳本來爬些網頁,因為這能在最短的時間讓我們達到一種小小的滿足感,通常我們解析網頁時有幾種方法:正則表達式匹配 - 比較低級用beautifulsoup、pyquery等包解析用scrapy、pyspider等框架來解析其實,方法
  • 「小白學爬蟲連載(5)」——Beautiful Soup庫詳解
    Beautiful Soup安裝與測試對於Windows平臺:首先介紹一種簡單的安裝包的方法,打開cmd,執行pip installbeautifulsoup4,這裡千萬不要忘記最後的數字4。</p>"""from bs4 import BeautifulSoupsoup = BeautifulSoup(html_doc, 'lxml')print(soup.prettify())print(soup.title.string)基礎知識介紹HTML是由一系列有著層級關係的各式各樣的標籤構成的,我們所要提取的信息都位於對應的標籤中。
  • Python爬蟲基礎教學(寫給入門的新手)
    前言剛學完python基礎,想學習爬蟲的新手,這裡有你想要的東西。本文著重點在於教新手如何學習爬蟲,並且會以外行人的思維進行形象地講解。最近我一兄弟想學,我就想寫個教學給他,然後想不如分享到網絡上,給熱愛學習的人們一起學習探討。
  • Python3中BeautifulSoup的使用方法
    廢話不多說,接下來我們就來感受一下BeautifulSoup的強大之處吧。BeautifulSoup簡介簡單來說,BeautifulSoup就是Python的一個HTML或XML的解析庫,我們可以用它來方便地從網頁中提取數據,官方的解釋如下:BeautifulSoup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。
  • 網絡爬蟲(一)
    有朋自遠方來,不亦樂乎,並誠邀入群,以達相互學習和進步之美好心願。爬蟲是按照一定規則,自動地提取並保存網頁中信息的程序。通過向網站發起請求獲取資源,提取其中有用的信息。爬蟲在獲取信息、整理數據等方面應用廣泛。
  • 爬蟲入門到放棄01:什麼是爬蟲
    不論網上怎麼介紹爬蟲,是spider、crawler也好,是robots也罷。我的理解就是:「模擬人的行為從網頁上獲取的數據的程序」。更具象一些:在Java中爬蟲是Jsoup.jar,在Python中爬蟲是requests模塊,甚至Shell中的curl命令也可以看做是爬蟲。爬蟲庫可以分為兩個部分。
  • 5分鐘快速學習掌握python爬蟲Beautifulsoup解析網頁
    python爬蟲用Beatifulsoup庫解析網頁提取所需元素新手看懂個人觀點:之前我們有講過爬蟲和網頁的一些聯繫,網頁的一些組成部分,爬蟲就是對網頁裡面的數據進行提取然後對其進行數據處理,篩選出所需部分,供需要者使用。
  • [Python從零到壹] 五.網絡爬蟲之BeautifulSoup基礎語法萬字詳解
    所有文章都將結合案例、代碼和作者的經驗講解,真心想把自己近十年的編程經驗分享給大家,希望對您有所幫助,文章中不足之處也請海涵。Python系列整體框架包括基礎語法10篇、網絡爬蟲30篇、可視化分析10篇、機器學習20篇、大數據分析20篇、圖像識別30篇、人工智慧40篇、Python安全20篇、其他技巧10篇。
  • BeautifulSoup
    # <title>The Dormouse's story</title>soup.title.name# u'title'soup.title.string# u'The Dormouse's story'soup.title.parent.name# u'head'soup.p# <p class="title"><b>The Dormouse's
  • Python中爬蟲框架或模塊的區別
    Python中爬蟲框架或模塊的區別 (1)爬蟲框架或模塊 Python自帶爬蟲模塊:urllib、urllib2 ; 第三方爬蟲模塊:requests,aiohttp;
  • Python爬蟲利器一之Requests庫的用法
    註:Python 版本依然基於 2.7前言之前我們用了 urllib 庫,這個作為入門的工具還是不錯的,對了解一些爬蟲的基本理念,掌握爬蟲爬取的流程有所幫助。入門之後,我們就需要學習一些更加高級的內容和工具來方便我們的爬取。那麼這一節來簡單介紹一下 requests 庫的基本用法。