概述
本例不涉及cookie,即抓取的資源無需登入認證。爬蟲主要做兩件事,一個是抓取請求連結,另一個是分析響應的資料。鑑於扇貝單詞書的詞串頁中的頁碼是通過js動態生成,直接抓取頁面內容是不能獲取,因此程式模擬了它的分頁請求路徑
分析
- 向目標url發請求,拉取響應體
- 分析頁面 爬取指定內容 抓取連結 分析資料
- 資料寫入檔案輸出,需要注意寫入編碼,若未指定
py
會採用作業系統的預設編碼 BeautifulSoup
解析單詞書頁 --> 詞串頁 ,分別拉取章節目錄,詞串頁目錄各自連結
原始碼
getSoup
用bs4
抓取目標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
一些使用技巧