BeautifulSoup + requests 爬取扇貝 python 單詞書

pardon110發表於2019-07-11

概述

本例不涉及cookie,即抓取的資源無需登入認證。爬蟲主要做兩件事,一個是抓取請求連結,另一個是分析響應的資料。鑑於扇貝單詞書的詞串頁中的頁碼是通過js動態生成,直接抓取頁面內容是不能獲取,因此程式模擬了它的分頁請求路徑

分析

  1. 向目標url發請求,拉取響應體
  2. 分析頁面 爬取指定內容 抓取連結 分析資料
  3. 資料寫入檔案輸出,需要注意寫入編碼,若未指定 py 會採用作業系統的預設編碼
  4. BeautifulSoup 解析單詞書頁 --> 詞串頁 ,分別拉取章節目錄,詞串頁目錄各自連結

原始碼

  • getSoupbs4 抓取目標url頁內容,返回一個soup物件
  • getChapterLinks getWordLinks 先提取章節的入口連結,後提取第該章每一頁的連結
  • getWords 真正獲取目標資料,隨後持久化
from bs4 import BeautifulSoup
import requests
import math

baseurl =  'https://www.shanbay.com'
pyBookUrl =  'https://www.shanbay.com/wordbook/187711/'

def  getSoup(url):
    rsp = requests.get(url)
    if rsp.status_code ==  200:
        return BeautifulSoup(rsp.content, "lxml")
    return  None

def  getChapterLinks(pyBookUrl):
    chapters = getSoup(pyBookUrl).select('td.wordbook-wordlist-name > a')
    return [(chapter.get_text(), chapter['href']) for chapter in chapters]

def  getWordLinks(startUrl):
    entryUrl =  '%s%s'  % (baseurl, startUrl)
    numVocab = getSoup(entryUrl).find('span', {'id': 'wordlist-num-vocab'}).get_text()
    pages = math.ceil(int(numVocab)/20)
    return [(page, '%s?page=%d'  % (entryUrl, page))for page in  range(1, pages+1)]

def  getWords(wordPage):
    wordList = getSoup(wordPage).select('td.span2 > strong')
    return [" "+word.get_text() for word in wordList]

with  open("pyWord.txt", "w", encoding="utf8") as f:
    for chapter, chapterLink in getChapterLinks(pyBookUrl):
        f.write(chapter+"\n")
        for page, link in getWordLinks(chapterLink):
            f.write('第%d頁'  % page)
            f.writelines(getWords(link))
            f.write('\n')
        f.write('\n')

小結

  • 本例更多的是分析頁面結構,bs一些使用技巧

相關文章