Python網路爬蟲實戰小專案

愛吃貓的魚101發表於2021-04-12

爬取目標:美女網的相關資訊

實現時需要用到的包:

  • requests庫
  • Beautifulsoup
  • time
  • json

值得注意的是 Beautifulsoup 在bs4裡 ,記得pip install bs4 安裝一下

目標分析:

  1. 從頁面中找出需要資訊的位置
    在這裡插入圖片描述

    很容易找到 class="content-box " 這個屬性就是我們需要資訊的位置,然後注意右下角的箭頭,很明顯這個標籤屬性是唯一的,看得出第一頁就是10張圖片,有了這個資訊,我們就可以進一步分析所需要的具體資料。

  2. 從找到的資訊裡篩選出需要的具體資訊
    在這裡插入圖片描述

    在上一步的基礎上進一步分析,很明顯姓名和圖片地址資訊在img標籤裡的 alt 和 src 中。

    在這裡插入圖片描述

    由圖上箭頭看得出,姓名、生日、和故鄉可以在 class="posts-text"裡找到,現在所需要的資訊就已經都找到了,接下來就是獲取怎麼獲取下一頁的連結。

  3. 分析怎麼獲取下一頁
    在這裡插入圖片描述

    由於下一頁是個按鈕,因此只能分析獲取介面,由圖可知是個POST請求,有form表單,且仔細觀察可知箭頭指的地方 paged 對應的就是頁數,因此我們只需要發起一個POST請求獲取響應物件即可。

    注意 :此處獲取的響應物件有一個坑,並不能直接獲取到html,需要進一步處理! 詳細情況會在程式碼中通過註釋說明!!

程式碼實現:

import json
import time

import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3823.400 QQBrowser/10.7.4307.400',
    'Cookie': 'aQQ_ajkguid=B4D4C2CC-2F46-D252-59D7-83356256A4DC; id58=e87rkGBclxRq9+GOJC4CAg==; _ga=GA1.2.2103255298.1616680725; 58tj_uuid=4b56b6bf-99a3-4dd5-83cf-4db8f2093fcd; wmda_uuid=0f89f6f294d0f974a4e7400c1095354c; wmda_new_uuid=1; wmda_visited_projects=%3B6289197098934; als=0; cmctid=102; ctid=15; sessid=E454865C-BA2D-040D-1158-5E1357DA84BA; twe=2; isp=true; _gid=GA1.2.1192525458.1617078804; new_uv=4; obtain_by=2; xxzl_cid=184e09dc30c74089a533faf230f39099; xzuid=7763438f-82bc-4565-9fe8-c7a4e036c3ee'
}


def get(url):  # 獲取網頁
    resp = requests.get(url, headers=headers)
    if resp.status_code == 200:
        parse(resp.text)
    else:
        print('網頁請求失敗!')


def parse(html):  # 進行資料解析
    items = {}
    root = BeautifulSoup(html, 'lxml')
    content_boxs = root.select('.content-box')
    for content_box in content_boxs:  # 遍歷content_box標籤,以獲得需要的資訊
        img = content_box.find('img')
        items['name'] = img.attrs.get('alt')
        infos = content_box.select('.posts-text')[0].get_text()  # 獲取到的是一個列表,取出該元素並獲取其文字
        try:
            items['birthday'] = infos.split('/')[1].strip()[3:]  # 進行字串切割獲取到生日資訊
            items['city'] = infos.split('/')[2].strip()[3:]
        except:
            items['birthday'] = ''
            items['city'] = ''
        items['cover'] = img.attrs.get('src')
        itempipeline(items)  # 傳給itempipeline()進行資料處理
    # 載入下一頁
    get_next_page('http://www.meinv.hk/wp-admin/admin-ajax.php')


def itempipeline(item):  # 此處沒做任何處理,直接列印
    print(item)


page = 2


def get_next_page(url):
    time.sleep(1)  # 休息一秒,避免請求過於頻繁引起的限制請求
    global page
    resp = requests.post(url, data={
        "total": 4,
        "action": "fa_load_postlist",
        "paged": page,  # 由之前分析可知,此處是頁碼
        "tag": "%e9%9f%a9%e5%9b%bd%e7%be%8e%e5%a5%b3",
        "wowDelay": "0.3s"
    }, headers=headers)
    page += 1
    if page > 5:  # 這次爬取的總共就34個(網頁上有顯示),一頁10個, 5頁足夠
        print('獲取完畢!')
        exit()
    resp.encoding = 'utf-8'  # 指定其編碼方式為utf-8
    if resp.status_code == 200:
        # 此處就是坑!!!!!
        # 獲取到的是json字典,但字典前面有干擾,需要進行切片獲取
        # 進行切片後,其html檔案是在 key為postlist的裡面
        rec = json.loads(resp.text[1:])['postlist']
        parse(rec)  # 將其傳給parse()進行解析
    else:
        print('下一頁連結獲取失敗!')


if __name__ == '__main__':
    get('http://www.meinv.hk/?tag=%e9%9f%a9%e5%9b%bd%e7%be%8e%e5%a5%b3')

爬取結果展示:

在這裡插入圖片描述

相關文章