用 Python 爬取作业答案

日期:
分类: Python 2

上高中以來,學校一直訂了一份「報紙」當作業用,叫《學英語》。最近做題時發現報紙與時俱進,多了幾個二維碼,分別是微信公眾號還有「掃一掃 查答案」。

目標網站

透過二維碼掃描出來的結果是上一期的答案。網頁的地址長這樣:

簡直不要太直白。

首先在網站逛了一圈,PC 版風格看起來仍然是很老舊的那種;網站首頁是有專門的答案分割槽,但是點進來的答案很少。顯然,我所需要的答案沒有文章列表,必須要經過掃描二維碼拿到。

然後便是嘗試改地址:稍稍增減 id 引數,可以看到最近發的文章:

image.png
image.png

發現只有幾期的答案是連在一起的,其餘的有很多這家報社的其他產品的內容。這些答案的排布也並不是那麼有規律,比如下一個 id 的是上上期的答案。那麼,只需要爬取附近的每個頁面,然後把符合要求的找出來就行了。

開發環境

Google 提供了免費的 Jupyter Notebook 環境—— Colab,無需配置,開箱即用。進入 後建立一個新的 PYTHON3 筆記本。

或者,你也可以下載 ANACONDA 並安裝。接著執行命令

$ pip install pipenv
$ pipenv shell
$ jupyter notebook

這之後預設瀏覽器會開啟本地的 Jupyter Notebook。

我們需要安裝 requests_html 做爬蟲。

requests-html 是基於現有的框架 PyQuery、Requests、lxml、beautifulsoup4 等庫進行了二次封裝,作者將 Requests 設計的簡單強大的優點帶到了該專案中。

!pip install requests_html

Jupyter Notebook 中,以 ! 開頭的行會被解釋成命令。

爬取和解析

這種 CMS 一般都沒什麼反爬措施,連 X5 瀏覽器 UA 都不需要偽造。所有網頁的標題都是相同的,所以爬取每個頁面內的標題就好。

image.png
image.png
Chrome 內右鍵目標元素,點「檢查」,右鍵 Elements 中高亮的顏色,複製選擇器。

#dummybodyid > div.contentbox > h3

對下面的答案圖片如法炮製,它們的選擇器分別是:

#dummybodyid > div.contentbox > div > p:nth-child(1) > img
#dummybodyid > div.contentbox > div > p:nth-child(2) > img
#dummybodyid > div.contentbox > div > p:nth-child(3) > img
#dummybodyid > div.contentbox > div > p:nth-child(4) > img

頁面最後一般會有 doc 文件可以下載,但是最近沒有了。

然後便是遍歷每個頁面了。

{'34210': '19-20上高三江蘇第9期A版參考答案', '34211': '19-20上高三江蘇第8期A版參考答案', '34212': '19-20上八年級★雲南第10期聽力錄音', '34213': '19-20上八年級邵陽第10期聽力錄音', '34214': "悅聽悅讀 The world's first artificial moon", '34215': '悅聽悅讀Superheroes from Asia', '34216': '19-20上八年級廣東第10期聽力錄音', '34217': '19-20上外研八年級嘉興第9期聽力錄音', '34218': '19-20上外研八年級嘉興第10期聽力錄音', '34219': '19-20上外研八年級嘉興第11期聽力錄音', '34220': '19-20上外研八年級嘉興第12期聽力錄音', '34221': '19-20上八年級★赤峰第1期聽力錄音',
…,(省略一部分)
'34966': '19-20上九年級寧波期末檢測一本通綜合測評(五)聽力錄音', '34967': '悅聽悅讀Real-life Dora', '34968': '19-20上高三江蘇第14期A版參考答案', '34969': '19-20上高三江蘇(N)第15期聽力錄音', '34970': '19-20上高三江蘇(N)第14期B1-B4版參考答案', '34971': '19-20上高一第24期A4版聽力練習錄音', '34972': '19-20上高三江蘇第15期A版參考答案', '34973': '19-20上高三江蘇(N)第16期聽力錄音', '34974': '19-20上高三江蘇(N)第15期B1-B4版參考答案', '34975': 'Jane and Sara want to go skating(I)', '34976': 'Jane and Sara want to go skating(II)', '34977': '19-20上八年級(J)第17期聽力錄音', '34978': '19-20上八年級(J)第18期聽力錄音', '34979': '19-20上八年級(J)第19期聽力錄音', '34980': '19-20上八年級(J)第20期聽力錄音', '34981': '悅聽悅讀 An ancient Chinese story', '34982': '悅聽悅讀 Empty-City Strategy', '34983': '悅聽悅讀Hearing loss, a major problem for teenagers', '34984': '悅聽悅讀FOLLOW ME: Hearing loss, a major problem for teenagers', '34985': '故事樂園 The ice cream', '34986': "故事樂園 It's Mr Green", '34987': '悅聽悅讀A special fashion show', '34988': '悅聽悅讀Two cute girls', '34989': '19-20上八年級曲靖第15期聽力錄音', '34990': '19-20上七年級★福建第15期聽力錄音', '34991': '悅聽悅讀 Max Einstein: The Genius Experiment', '34992': '19-20上九年級(XJ)第9期聽力錄音', '34993': '19-20上九年級(XJ)第10期聽力錄音', '34994': '19-20上九年級(XJ)第11期聽力錄音', '34995': '19-20上九年級(XJ)第12期聽力錄音', '34996': '19-20上七年級★福建第16期聽力錄音', '34997': 'Bill and Kitty', '34998': '19-20上八年級曲靖第16期聽力錄音', '34999': '悅聽悅讀Flying car'}

Demo

learningEnglishFetch.py

版权许可

  1. 本作品 采用 知识共享 署名—非商业性使用 4.0 国际许可协议CC BY-NC 4.0 International)许可,阁下可自由地共享(复制、发行) 和演绎(修改、转换或二次创作) 这一作品,唯须遵守许可协议条款。

评论

评论将在审核后显示,阁下可以在本博客的 Github 仓库的 拉取请求列表 中查看。提交成功后会自动跳转。

本站不支持 Dark Reader 的暗色模式,请对本站关闭后再访问,亮色模式的对比度、亮度等选项不受影响。部分页面右上角提供暗色模式切换按钮,如果你没看到,说明你的浏览器尚不支持此特性。本提示不依赖于 JavaScript,你可自行查找其他用户在本站发表的关于如何关闭此提示的评论。