主頁 > 前端設計 > Python 爬蟲小課 1-9 寶媽程式媛福利-育兒網問答資料抓取

Python 爬蟲小課 1-9 寶媽程式媛福利-育兒網問答資料抓取

2020-11-02 11:08:12 前端設計

爬蟲百例專欄連載已經結束,歡迎訂閱 🙈100 篇爬蟲文章合計 29.9 元,每篇只需 2.9 毛錢 🙈

🌹 橡皮擦 叨叨 🌹
本專欄為爬蟲小課系列,周更 3+篇,專欄合計 9 篇文章,本專欄所有案例都將采用 requests 庫撰寫,通過 9 個案例,讓你深入理解 requests 庫,
以上就是本系列專欄的核心目標,

本系列課程需要一定的 Python 語法基礎,資料匹配將采用 Python 自帶的 re 模塊,故對正則運算式有一定的基礎要求,
關于爬取環境的需求,Python3.5 以上版本,安裝 requests 模塊,

爬蟲前的分析

類別頁面分析

本次爬蟲小課要爬取的的網站為育兒網(http://ask.ci123.com/) 的問答模塊,我們要采集一下紅框內的資料,

Python 爬蟲小課 1-12 寶媽程式媛福利-育兒網問答資料抓取

對于該網站涉及的問題型別非常多,具體分類可以通過上述鏈接左側的選單獲取到,如下圖所示區域:

Python 爬蟲小課 1-12 寶媽程式媛福利-育兒網問答資料抓取

在這里需要略微分析一下,分類地址的規律,如果沒有規律,那第一步就先獲取一下所有的分類地址,滑鼠點擊各鏈接發現,分類串列頁鏈接如下:

http://ask.ci123.com/categories/show/2
http://ask.ci123.com/categories/show/3
http://ask.ci123.com/categories/show/4
http://ask.ci123.com/categories/show/{類別ID}

在這里先不要下結論,說 ID 是依次遞增的,寫爬蟲程式如果過早的假定一定的規則,很容易出現資料丟失的情況,所以盡量都嘗試一遍,

在這里也可以直接通過查看網頁原始碼,看一下所有的地址,當然看完之后還是為了我們可以爬取到,最終查閱到所有的地址都為http://ask.ci123.com/categories/show/{類別ID} 形式,只是最后的類別 ID 不是連續的,到這里問題分類分析完畢,

Python 爬蟲小課 1-12 寶媽程式媛福利-育兒網問答資料抓取

問題串列頁面分析

下面需要尋找串列頁相關規律,點擊任意類別之后,可以查閱到,頁面資料樣式都如下圖所示:

Python 爬蟲小課 1-12 寶媽程式媛福利-育兒網問答資料抓取

首先要做的第一件事請,就是查找分頁規律,找到分頁區域,滑鼠依次點擊分頁,獲取不同的分頁地址,

Python 爬蟲小課 1-12 寶媽程式媛福利-育兒網問答資料抓取

最后找到其規律鏈接地址如下:

http://ask.ci123.com/categories/show/4/all?p={頁碼}

有頁碼規律還不夠,還需要找到末頁,在原始碼中簡單檢索,找到末頁對應的頁碼即可,

Python 爬蟲小課 1-12 寶媽程式媛福利-育兒網問答資料抓取

到此爬蟲前的分析分析完畢了,下面開始進行爬蟲邏輯編碼環節,也就是整理自己的思路,

邏輯編碼(偽代碼)

育兒網爬蟲分為如下步驟:

  1. 通過 http://ask.ci123.com/ 頁面,獲取所有的分類頁面地址
  2. 回圈所有的分類頁面地址
  3. 獲取每個分類對應的串列頁面,并獲取總頁碼
  4. 從一開始回圈到總頁碼
  5. 上一步回圈程序中過去每一頁待爬取的資料

思路整理完畢,編碼環節其實就是一個簡單的實作程序,

爬蟲正式編碼

request 庫 get 方法說明

對于 requests 庫來說,匯入并快速應用是非常容易的,先通過抓取分類頁面原始碼來看一下基本使用,

import requests

url = "http://ask.ci123.com/"

# 抓取分類頁面
def get_category():
    res = requests.get("http://ask.ci123.com/")
    print(res.text)


if __name__ == "__main__":
    get_category()

以上代碼中最核心的方法就是 requests.get()了,該方法為 requests 模塊通過 get 方式獲取網站原始碼,該方法中的引數說明如下:

必選引數 url

requests.get(url="http://ask.ci123.com/")

傳遞 URL 引數

通過該引數可以構造出如下格式 https://www.baidu.com/s?wd=你好&rsv_spt=1&rsv_iqid=0x8dd347e100002e04
格式如下:

import requests
payload = {'key1': 'value1', 'key2': 'value2'}
res = requests.get(url="http://ask.ci123.com/", params=payload)
print(res.url)

key1 為鍵名,value1 為鍵值,

定制請求頭

在爬蟲爬取的程序中,我們將盡量將爬蟲模擬成真實的用戶通過瀏覽器訪問網站,所以很多時候需要定制瀏覽器請求頭,格式如下:

import requests
payload = {'key1': 'value1', 'key2': 'value2'}
headers = {
    'user-agent': 'Baiduspider-image+(+http://www.baidu.com/search/spider.htm)'
}
res = requests.get(url="http://ask.ci123.com/",
                   params=payload, headers=headers)
print(res.url)

其中 headers 中可以配置更多的內容,本篇博客不做展開,只需要先記住 headers 引數即可,

Cookie

Cookie 在很多爬蟲程式中屬于必備內容,這里有時會存盤加密資訊,有時會存盤用戶資訊,格式如下:

import requests
payload = {'key1': 'value1', 'key2': 'value2'}
headers = {
    'user-agent': 'Baiduspider-image+(+http://www.baidu.com/search/spider.htm)'
}
cookies = dict(my_cookies='nodream')
res = requests.get(url="http://ask.ci123.com/",
                   params=payload, headers=headers, cookies=cookies)
print(res.text)

禁用重定向處理

有些網站會攜帶重定向原始碼,在爬取的時候需要禁止網格員自動跳轉,代碼如下:

r = requests.get('http://github.com', allow_redirects=False)

超時

對于一個網路請求,有時會出現無法請求到的情況,這部分在官方手冊高級部分有相應的說明,不過對于初學者可以先進行忽略超時的高級用法,

為防止服務器不能及時回應,大部分發至外部服務器的請求都應該帶著 timeout 引數,在默認情況下,除非顯式指定了 timeout 值,requests 是不會自動進行超時處理的,如果沒有 timeout,你的代碼可能會掛起若干分鐘甚至更長時間,

常規代碼如下:

import requests
payload = {'key1': 'value1', 'key2': 'value2'}
headers = {
    'user-agent': 'Baiduspider-image+(+http://www.baidu.com/search/spider.htm)'
}
cookies = dict(my_cookies='nodream')
res = requests.get(url="http://ask.ci123.com/",
                   params=payload, headers=headers, cookies=cookies, timeout=3)
print(res.text)

高級部分引數

對于 get 方法,還有一些引數,在后續的博客中我們可能會用到,例如:

  • SSL 證書驗證 (verify)
  • 客戶端證書(cert)
  • 事件鉤子(hooks)
  • 自定義身份驗證(auth)
  • 流式請求(stream)
  • 代理(proxies)

以上引數都會出現在 get 方法中,所以 requests 庫是一個非常非常強大的庫,

獲取所有的分類頁面地址

有了上述詳細的說明,在使用 requests 庫去獲取網頁中的內容就變得簡單一些了,這里需要有 Python 基礎知識中 re 模塊的使用與正則運算式的基礎,具體的爬取代碼如下:

import requests
import re

url = "http://ask.ci123.com/"
headers = {
    'user-agent': 'Baiduspider-image+(+http://www.baidu.com/search/spider.htm)'
}
# 抓取分類頁面
def get_category():
    res = requests.get("http://ask.ci123.com/", headers=headers)
    pattern = re.compile(
        r'<li><a href="/categories/show/(\d+)">', re.S)
    categories_ids = pattern.findall(res.text)
    print(f"獲取到的分類ID如下:",categories_ids)

if __name__ == "__main__":
    get_category()

回圈所有的分類頁面地址

在上述代碼中通過re庫的 findall 方法獲取了所有的分類編號,用來拼接后續的待爬取頁面,獲取到 IDS 之后,就可以通過回圈的方式獲取到所有的串列頁面了,具體如下:

# 抓取分類頁面
def get_category():
    res = requests.get("http://ask.ci123.com/", headers=headers)
    pattern = re.compile(
        r'<li><a href="/categories/show/(\d+)">', re.S)
    categories_ids = pattern.findall(res.text)
    print(f"獲取到的分類ID如下:", categories_ids)
    for cate in categories_ids:
		# 下述代碼中有get_list()函式對應的代碼
        get_list(cate)
        time.sleep(1)

上述代碼為了防止被反爬,需要增加一個延時處理,time.sleep()

獲取每個分類對應的串列頁面,并獲取總頁碼

打開串列頁面,首要目的先獲取到總頁碼,本次實作的案例獲取的頁碼途徑比較簡單,在串列頁存在一項,資料直接在原始碼中可以看到,故直接抓取即可,

def get_list(cate):
    # 獲取總頁碼,回圈抓取所有頁

    res = requests.get(
        f"http://ask.ci123.com/categories/show/{cate}", headers=headers)

    pattern = re.compile(
        r'<a class="list_last_page" href="/categories/show/\d+/all\?p=(\d+)"', re.S)
    totle = pattern.search(res.text).group(1)
    for page in range(1, int(totle)):
        print(f"http://ask.ci123.com/categories/show/{cate}/all?p={page}")
        time.sleep(0.2)

從 1 開始回圈到總頁碼

本部分代碼比較容易,已經在上述代碼實作,結果如圖所示:

Python 爬蟲小課 1-12 寶媽程式媛福利-育兒網問答資料抓取

本案例收尾環節

后續的內容就變得非常容易了,對每頁資料進行分析,并進行存盤資料操作,下述代碼未撰寫存盤部分,抓取部分代碼已經填寫完整,其中存在一個非常大的正則運算式,可以參考一下,如果爬取資料不是很嚴格,大量的使用.*\s這些常見元字符即可,

import requests
import re
import time

url = "http://ask.ci123.com/"
headers = {
    'user-agent': 'Baiduspider-image+(+http://www.baidu.com/search/spider.htm)'
}


def get_detail(text):
    # 該函式實作決議頁面資料,之后存盤資料
    pattern = re.compile(r'<li>[.\s]*<a href="/questions/show/(\d+)/" title="(.*?)" class="list_title" target="_blank" >.*?</a>\s*<span class="list_asw">(\d+)<font>.*?</font></span>\s*<a class="list_author"  href="/users/show/\d+" title=".*?">(.*?)</a>\s*<span class="list_time">(.*?)</span>\s*</li>')
    data = pattern.findall(text)
    print(data)
    # 資料存盤代碼不在撰寫


def get_list(cate):
    # 獲取總頁碼,回圈抓取所有頁

    res = requests.get(
        f"http://ask.ci123.com/categories/show/{cate}", headers=headers)

    pattern = re.compile(
        r'<a class="list_last_page" href="/categories/show/\d+/all\?p=(\d+)"', re.S)
    totle = pattern.search(res.text).group(1)
    for page in range(1, int(totle)):
        print(f"http://ask.ci123.com/categories/show/{cate}/all?p={page}")
        res = requests.get(
            f"http://ask.ci123.com/categories/show/{cate}/all?p={page}", headers=headers)

        time.sleep(0.2)
        # 調取串列頁資料提取函式
        get_detail(res.text)


# 抓取分類頁面
def get_category():
    res = requests.get("http://ask.ci123.com/", headers=headers)
    pattern = re.compile(
        r'<li><a href="/categories/show/(\d+)">', re.S)
    categories_ids = pattern.findall(res.text)
    print(f"獲取到的分類ID如下:", categories_ids)
    for cate in categories_ids:
        get_list(cate)
        time.sleep(1)


if __name__ == "__main__":
    get_category()

廣宣時間

如果你想跟博主建立親密關系,可以關注博主,或者關注博主公眾號“非本科程式員”,了解一個非本科程式員是如何成長的,
博主 ID:夢想橡皮擦,希望大家點贊、評論、收藏

Python 爬蟲小課 1-12 寶媽程式媛福利-育兒網問答資料抓取
爬蟲百例教程導航鏈接 : https://blog.csdn.net/hihell/article/details/86106916

夢想橡皮擦 CSDN認證博客專家 大學老師 高級產品經理 互聯網從業者
6年產品經理+教學經驗,3年互聯網專案管理經驗;互聯網資深愛好者;
沉迷各種技術無法自拔,導致年齡被困在25歲;CSDN爬蟲百例作者,
個人公眾號“非本科程式員”,

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

標籤:其他

上一篇:【設計模式系列23】設計模式的終極BOSS:訪問者模式

下一篇:CSDN個人主頁下如何添加微信公眾號?

標籤雲
其他(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)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more