我们如何获取《学英语报》的答案(已废弃)

如果你不在乎原理,可以直接前往最后一节

原理

我们如何获得上一期报纸的答案

当我们将报纸翻到中缝的位置,我们就可以看到上一期报纸的答案,当然,这不是最主要的,更重要的是,在报纸的下面,我还可以看到有一个矩形的方框,里面有两个二维码,上面还写了一个6位资源码,还有一堆文字,告诉你,如果你扫描二维码,然后输入这六位资源码你就可以获得对应的资源。
如果你真的这么做了,你就可以获得上一期报纸的答案。

但是,如何获得下一期报纸答案呢

首先我们来分析这个网页的网址

https://www.xyybs.com/index.php?id=77418&m=wap&a=show&ewm=1&catid=152

这个网址非常的有特色,因为其中有一个参数,叫做 id,它的值是一个5位数。当然也不一定是5位数,如果资源多了,它可能会是6位数(这是什么废话
接下来,我们试着把它的值从 77147改成 77148

我们可以合理的猜测,这个ID的值是递增的,并且是稠密的(后来试了一下,发现其实并不是,可能是有的ID被隐藏了,导致获取不了),但总之,我们只需要把它遍历一下,就可以获得全部的报纸答案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import requests,json
from bs4 import BeautifulSoup
import os

####CONFIG####
CONFIG={
from:77999,
to:79000,
fn:"./data-ssa.txt"
}
##############

a=""


for i in range(CONFIG.from,CONFIG.to):
cnt+=1
req=requests.get("https://www.xyybs.com/index.php?m=wap&a=show&ewm=1&catid=152&id="+str(i),headers={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; rv:98.0) Gecko/20100101 Firefox/98.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Upgrade-Insecure-Requests": "1",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Cache-Control": "max-age=0"}
)
soup = BeautifulSoup(req.content,'lxml')
list= soup.find_all(class_="contentbox")
try:
print(str(i)+"-"+list[0].find("h3").text)
a+=str(i)+"-"+list[0].find("h3").text+"\n"
with open(CONFIG.fn,"w+",encoding="utf-8") as f:
f.write(a)
except IndexError:
pass

它将会获取从 CONFIG.fromCONFIG.to的所有资源,并保存到 CONFIG.fn中。

等到用的时候可以查找对应的资源名称。

小丑竟是我自己

Update @ 2022-12-22
刚在尝试各个参数的意思,然后突然发现小丑竟是我自己
先来介绍各参数的意义

https://www.xyybs.com/index.php?<SearchParams>

SearchParams:

Key Value
id INT,资源的唯一标记
m >content,电脑端
>wap,触屏端
a >lists,展示列表,仅对电脑端有效
>show,显示详情
>init,不理解,可能是初始状态
page INT,页面序号
catid INT,栏目ID

所以开始尝试其他方案。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(async()=>{
document.body.style.display="none !important"
let oo=[]
for(let i=1;i<76;i++){
await fetch("https://www.xyybs.com/index.php?m=content&c=index&a=lists&catid=152&page="+i).then(v=>v.text()).then(v=>{
document.body.innerHTML=v
document.querySelectorAll(".list li a").forEach(q=>{
oo.push({
name:q.innerText,
id:parseInt((new URL( q.href)).searchParams.get("id"))
})
})
})
console.log("p",i)
}
var outputfile=new Blob([JSON.stringify(oo)],{ type:'text/plain' })
var a=document.createElement("a")
a.download = "list.json";
a.href = URL.createObjectURL(outputfile);
a.click()
})()

循环次数为页码数,它将会给出一个名称和id的对应。

我只想要答案,原理什么的与我无关

我们会每隔2~3周检查一次江苏高二(N)的答案,进行整理,并合并成一个易于打印的文件。你现在就可以下载它们。

20~25期答案 16~19期答案 1~15期答案

如果你从上面没有找到你想要的答案,那有可能是我们没有整理,或者对应答案没有发出,你可以使用下面的Component

以下Component是对上述得到的map的一个封装