P.S. 刚学点图像处理我又来写爬虫了【稽】
众所周知,我们(初中生)每学期都需要登上一个叫做“综合实践活动”的网站,然后填写一大堆的活动感想。不过有些时候,那个网站上要求我们填写活动项目的感想,然而有时那个活动我们因为种种原因没能参加,那么这时我们可能就只能借鉴一下其他同学的了。
然而同学的数量太多,每个人都需要点开来看,一个一个的点,想要博采众家之长都很麻烦。
如何解放双手呢?索尼爬虫大法好!
震惊的是,这个网站竟然还有反爬虫?!
这个网站的反爬虫所措施主要就是登录时的验证码,其形状之清奇,色彩之古怪,有时连我肉眼都看不出来,更别说ocr识别了。为了解决这个问题,这篇文章就主要介绍爬虫如何处理这种需要手动输入图形验证码的操作。
本篇的代码仅作学习用处,不得实际应用于抄袭他人社会实践感想!
假装正经
分析http请求
爬取该网站较难解决的就是的登录,所以这里我们通过拦截并分析登陆时触发的http请求来将我们的爬虫模拟该操作。
那么我们首先手动在该网站(http://kfsj.bjedu.cn/)上进行一次登录,并进行抓包,发现网站发出的一条用于登录的请求,大致如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Request URL: http://kfsj.bjedu.cn/Public/login
Request Method: POST
Status Code: 200 OK
Remote Address: 211.153.78.231:80
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/x-www-form-urlencoded
DNT: 1
Host: kfsj.bjedu.cn
Origin: http://kfsj.bjedu.cn
Referer: http://kfsj.bjedu.cn/
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
X-Requested-With: XMLHttpRequest
username: 1******1(友情打码)
password: ***************************(友情打码,此处为一堆乱七八糟的字母和字符)
verificationCode: dfzb
verikey: 15
|
经过研究,发现username
这一项的内容就是你的用户名,password
是一堆乱七八糟的字符串加上你的密码,然后再进行Base64加密得到的字符串(没找到规律,不过在程序中可以直接写上m你在浏览器中登录得到的值),而verificationcode
则是你输入的验证码。
验证码以及保持登录状态
不太好整的是验证码,不过我们可以先获取验证码的路径,然后将验证码下到本地,手动输入验证码,再发送登录的请求。
在进行后续的爬取时,由于我们还需要保持登陆状态,所以我们可以通过通过python中的requests库的session功能,而session就能能保留我们每次请求之后留下的从cookie和环境。
实现
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
|
import requests as rq
from bs4 import BeautifulSoup as BS
s=rq.session()
loginpage=s.get("http://kfsj.bjedu.cn/")
lg_bs=BS(loginpage.text,"html.parser")
code_url=lg_bs.find("img",class_="code_img").get("src")
code=s.get("http://kfsj.bjedu.cn"+code_url)
f=open("code.jpg","wb")
f.write(code.content)
f.close()
code_text=input("请打开与本文件同一文件夹下的code.jpg查看验证码,并在此填写:")
url = "http://kfsj.bjedu.cn/Public/login"
payload ={
"password":"你抓包得到的数据",
"username":"你的账号",
"verificationCode":code_text,
"verikey":"20",
}
headers = {
"accept": "application/json, text/javascript, */*; q=0.01",
"origin": "http://kfsj.bjedu.cn",
"x-requested-with": "XMLHttpRequest",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
"dnt": "1",
"content-type": "application/x-www-form-urlencoded",
"cache-control": "no-cache",
}
response = s.post(url, data=payload, headers=headers)
|
抓取页面
剩下的内容就是分析页面元素,抓取页面,然后用BeautifulSoup解析啦!这些都好整。
剩余部分的代码:
1
2
3
4
5
6
7
8
9
10
|
response = s.post(url, data=payload, headers=headers)
print("登陆系统返回代码:\n",response.status_code,"\n登录系统返回json:\n",response.text)
scrap_url=input("\n\n请输入爬取链接:")
scrap_page=s.get(scrap_url,headers=headers)
scrap_bs=BS(scrap_page.text,"html.parser")
cnt=0
for item in scrap_bs.find_all("div",class_="param"):
cnt+=1
print(item.text)
print("\n\n已经爬取",cnt,"名同学的感想")
|
最终实现效果:
1
2
3
4
5
6
7
8
9
10
11
12
|
Ethan@ETHAN-ENHE D:\mycode\py\爬虫 master [00:13]
❯ python '.\综合社会实践登录&批量爬取感想.py'
请打开与本文件同一文件夹下的code.jpg查看验证码,并在此填写:veg8
登陆系统返回代码:
200
登录系统返回json:
{如果验证码填对了且登录成功,那么这里就因该是就是很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西很长的一段东西就有这么长}
请输入爬取链接:http://kfsj.bjedu.cn/Item/OrderDetail/index/id/529693
2018年10月,我们来到了园博园参加建队仪式。同学们神情庄重,即使在炎炎烈日下站着,精神头也依旧十足。随后,我们进行了“最强战队”的比拼。我们小组团结一心,齐心协力,完成了许多任务。虽然这次比拼没有获得很好的奖项,但我们学习到了很多知识,十分受益匪浅。
(...此处440行文字)
2018年10月19日,我们去北京园博园参加了少先队建队 “北达资源中学最强战队”主题定向越野活动,活动以小组的形式来完成,过程中 “Goteaming系统”出现故障。我们不灰心,不放弃,坚持 完成了任务,通过此次活动既锻炼了我的思考问题,分析问题的能力,也增强了我们同学之间的团队合作意识。
已经爬取 359 名同学的感想
|
今天的内容就到这里啦,毕竟博客都快一个月没更了,今天冒个泡【手动滑稽】,等过几天如果有空,就再写篇爬取unsplash壁纸的吧!