爬取帆软FCRA题库__2019/8/12
通过缓存解决登陆机制
- 帆软很多页面只有登陆后才有查看权限,直接爬取只能返回 http://bbs.fanruan.com/ 主页面内容,先通过登陆账号后的缓存来解决爬虫登陆问题。
- 缓存目录通过打开浏览器调试模式查看:
通过BeautifulSoup和正则表达式处理数据
1.每一个题目分类的后面地址的ptid不一样,可以通过修改ptid的值来改变获取地址
2. 直接爬下来 FCRA题库发现模块在被选择时class会变为 blue_selected ,没有选择的则是blue_unselected ,可以通过这个判定题目分类
3. 每一题存在于<p><span></p></span>
中,也可以通过调试模式中的Elements查看
代码
# coding=utf-8
from urllib import request
import json
import time
from datetime import datetime
from datetime import timedelta
import re
from urllib.request import urlopen
from bs4 import BeautifulSoup
# 获取数据,根据url获取
def get_data(url):
headers = {
#缓存获取的相关信息
'Content-Type': 'text/html; charset=gbk',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36',
'Cookie': '获取到的cookie'
}
req = request.Request(url, headers=headers)
response = request.urlopen(req)
if response.getcode() == 200:
return response.read()
return None
#处理数据
def parse_data(url):
html = get_data(url)
comments =str(html,'gbk')
soup = BeautifulSoup(comments,'lxml')
soup=str(soup)
#匹配爬取的对应分类,用作标题
pattern2 = re.compile(r'<li.*?class=\"blue_selected\"><a.*?href=\"plugin.php\?id=threed_index:timulist&ptid=(.*?)</a></li>',re.S)
title=re.findall(pattern2,soup)
#匹配试题
pattern1 = re.compile(r'<p><span>(.*?)</span></p>',re.S)
content=re.findall(pattern1,soup)
#将获取到的数据写入文档
with open('E:/PycharmProjects/cshiti.txt', 'a+', encoding='utf-8') as f:
f.write('\n'+str(title)+'\n')
m=0
for item in content:
m=m+1
f.write(str(m)+'.'+item+'\n')
if __name__ == '__main__':
for i in range(2,16):
url = 'http://bbs.fanruan.com/plugin.php?id=threed_index:timulist&ptid='+str(i)
parse_data(url)
#还有一个直接重新爬吧,暂时不知道怎么加到循环语句中去
url2= 'http://bbs.fanruan.com/plugin.php?id=threed_index:timulist&ptid=27'
parse_data(url)
爬取结果