用 Python 爬取作业答案

日期:
分类: Python

上高中以来,学校一直订了一份「报纸」当作业用,叫《学英语》。最近做题时发现报纸与时俱进,多了几个二维码,分别是微信公众号还有「扫一扫 查答案」。

目标网站

通过二维码扫描出来的结果是上一期的答案。网页的地址长这样:

简直不要太直白。

首先在网站逛了一圈,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

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

评论

评论将在审核后显示,阁下可以在本博客的 Github 仓库的 拉取请求列表 中查看。
本表单无 JavaScript,请勿重复提交。

本站不支持 Dark Reader 的暗色模式,请对本站关闭后再访问。
(亮色模式的对比度、亮度等选项不受影响)


This site does not support dark mode by Dark Reader, please turn it off before visiting.
(Contrast, brightness, etc. of light mode are not affected)