题目如下:

  请分析作业页面(https://edu.cnblogs.com/campus/hbu/Python2018Fall/homework/2420),
   爬取已提交作业信息,并生成已提交作业名单,保存为英文逗号分隔的csv文件。文件名为:hwlist.csv 。
  文件内容范例如下形式:
   学号,姓名,作业标题,作业提交时间,作业URL
  20194010101,张三,羊车门作业,2018-11-13 23:47:36.8,http://www.cnblogs.com/sninius/p/12345678.html
  20194010102,李四,羊车门,2018-11-14 9:38:27.03,http://www.cnblogs.com/sninius/p/87654321.html
 
分析与解决:
  作业很好地反映出一个问题:熟练度太低
  1.拒绝花里胡哨,打开IE——目标网页——显示网页源代码
   搜索已提交作业信息表格中某一学号,发现搜索不到。
  
  
  2.既然源代码看不到,说明这一部分信息不属于静态元素。应该是属于js/xhr等静态网页元素了。还好之前学过几天js,有点思路。
  F12开发者工具——网络——F5/点击绿色三角,然后:
  可以看到,实现网页的js函数等动态元素全被解析了出来。不过JS是无法保存信息的。我们点击一下内容类型,给这些元素所属类型分个类。
  结果在一堆JS中突然出现三个json类型的元素。
  
  点进去看一下其响应报文主体,发现其中一个json元素就是我们要的数据。
  
  看一下Header,ok,url到手了。那么我们现在只要把他爬取下来并且解析成csv文件就行了。
  
 
   接下来问题就来了,……我们先看一下这个json文件内容是什么。
  
  没错,是个字典,有data,recordTotal,recordFilter三个索引。
  结果我就有了“用re把"data:"到“,recordtotal”之间中括号中的内容全扒下来”的奇怪想法。
  于是又反映了自己re库也用不好的事实…
  事实上,直接获取data索引的key值,不就是我们要的信息了吗?
  字典的概念还得强化。
 
  至此应该已经有了一个可行的解决方案:
  1.爬目标url
  2.爬完后的json文本内容是字符串类型,用json.loads转换成字典格式
  3.取出data索引的key值,把其变为一个列表。而列表的索引便是每个学生的各项信息。
  
  [37]是json.loads后,[39]是json.loads['data']后:
  
  
  4.遍历,写到文件,保存成csv格式。
 
  代码如下:
  

import requests as r
import json

url="https://edu.cnblogs.com/Homework/GetAnswers?homeworkId=2420&_=1543832146743"

try:
    myhead = {'user-agent':'Mozilla/5.0'}
    wb = r.get(url,headers=myhead,timeout=100)
    wb.raise_for_status() #状态码不为200,引发HTttpERROR异常
    wb.encoding = wb.apparent_encoding
    key1 = wb.text
except:
    print ("ERROR!")

#json.load返回字典类型,获取data索引后的信息,即目标json信息
json1=json.loads(key1)['data']
#现在json1是列表了,开始逐行取信息,写到文件中
#注意学号用字符串保存,否则在excel中会按数字处理,即用科学计数法表示
#提交时间中,日期和时间中有个‘T’,用replace替换掉
keydata=' '
with open('hwlist.csv','w') as keyfile:
    for index in json1:
        keyfile.write(str(index['StudentNo'])+','+index['RealName']+','+index['DateAdded'].replace('T',' ')+','+index['Title']+','+index['Url']+'\n')
#有毒,明明IDE上缩进是对的

  hwlist.csv打开后如下:好像是我excel设置的问题,日期无法好好显示,不过看单元格值应该是正确的

  

附:

  其实上面的方法并不是我的本意…

  我一开始看到目标文件是csv,就想到了解析大数据的神器——panda库。

  panda库里的read_json可以把json字符串文件解析为panda自带的数据类型——Series或者Dataframe(直观的看上去就是一维数组与二维数组)

  然后利用to_csv可以直接实现把数据转为csv文件格式。(当然也有to_txt,to_excel等等,很强大的库)

  先看下我的代码:

import requests as r
import json
import pandas as pd

url="https://edu.cnblogs.com/Homework/GetAnswers?homeworkId=2420&_=1543832146743"

keyweb = r.get(url)
json1= json.loads(keyweb.text)['data']

keyjson = json.dumps(json1)
keytable = pd.read_json(keyjson)
#keytable.to_csv('pre1.csv')
keytable.to_csv('pre2.csv',columns=['StudentNo', 'RealName','Title','DateAdded','Url'],index=False,header=True)

  处理源数据的手法都类似。不同的是,我们处理完json数据之后。再用json.dumps把处理好的数据转回为json字符串格式。

  然后调用panda库的read_json方法,把这个json字符串转为panda库的dataframe格式。

  可以type一下,一目了然。

  

  看上去万事俱备了,我们直接to_csv一波。

keytable.to_csv('pre1.csv')

  问题出现了:是解析成了一个csv表不错,但是好多列都是我们不需要的。(包括莫名其妙的索引)

  

  还好,to_csv方法给我们提供了参数来解决这些问题。

keytable.to_csv('pre2.csv',columns=['StudentNo', 'RealName','Title','DateAdded','Url'],index=False,header=True)

  columns=['1’,'2'…]:只保留某些列的内容,这里我们保存学号,姓名,标题,提交时间,网址这些列

  index=False:不写默认是true,会在第一列添加一列索引。且默认从0开始,我们用excel浏览,不太需要。X掉。

  header=True:保留表头,位置在全表第一行。不写默认是true.

  于是处理后的pre2.csv如下:

  

   看上去问题解决了?不然:

   我在其中遇到最大的问题就是:提交时间中那个“T”到底怎么处理掉?

   有一位仁兄也用的panda库完成的作业,我参考了一下:是先把json数据处理好后,用panda库的DataFrame()将其转换成dataframe格式,并用colums给每个列命名,之后再用to_csv解析成csv格式。

   这不失为一种很好的解决方案。

   那么,可以不可以对我这种“暴力”转换的dataframe格式中的数据直接进行查值替换这类的操作呢?

     研究了半天,最后也没有解决,可能是对panda库操作还是太少。希望有人能指点一下,不胜感激。

  

  总结:

    爬虫对我来说并不新鲜,但我却一直没有多加应用。

    爬虫并不是get个url,直接.text这么简单的。

    对于requests库的掌握都有些生疏。更不要提bs4和re这些了,对于信安专业的学生,不客气的说,这是不可原谅的。

    努力弥补吧。

Python爬虫作业的更多相关文章

  1. 【Python】:简单爬虫作业

    使用Python编写的图片爬虫作业: #coding=utf-8 import urllib import re def getPage(url): #urllib.urlopen(url[, dat ...

  2. Python爬虫之12306-分析请求总概述

    python爬虫也学了一段时间了.也爬过不少网站,最后我想用12306抢票器这个项目做一个对之前的学习的效果成见也是一个目标(开始学爬虫的时候,看到说,会爬12306,就会爬80%的网站),本人纯自学 ...

  3. 路飞学城Python爬虫课第一章笔记

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...

  4. 从零起步 系统入门Python爬虫工程师 ✌✌

    从零起步 系统入门Python爬虫工程师 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 大数据时代,python爬虫工程师人才猛增,本课程专为爬虫工程师打造, ...

  5. 路飞学城-Python爬虫集训-第三章

    这个爬虫集训课第三章的作业讲得是Scrapy 课程主要是使用Scrapy + Redis实现分布式爬虫 惯例贴一下作业: Python爬虫可以使用Requests库来进行简单爬虫的编写,但是Reque ...

  6. 风变编程笔记(二)-Python爬虫精进

    第0关  认识爬虫 1. 浏览器的工作原理首先,我们在浏览器输入网址(也可以叫URL),然后浏览器向服务器传达了我们想访问某个网页的需求,这个过程就叫做[请求]紧接着,服务器把你想要的网站数据发送给浏 ...

  7. Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

  8. python爬虫成长之路(一):抓取证券之星的股票数据

    获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇使用的版本为python3.5,意在抓取证券之星上当天所 ...

  9. python爬虫学习(7) —— 爬取你的AC代码

    上一篇文章中,我们介绍了python爬虫利器--requests,并且拿HDU做了小测试. 这篇文章,我们来爬取一下自己AC的代码. 1 确定ac代码对应的页面 如下图所示,我们一般情况可以通过该顺序 ...

随机推荐

  1. UVA 340 Master-Mind Hints 猜密码游戏(水)

    题意: 给一串密码(第一行),接着再给你很多行猜测,针对每行猜测,输出两个数字,分表代表:同一列上匹配的个数,不同列上匹配的个数.注:匹配指的是一次,一旦配对,不能再与其他配对. 思路: 每接受一行猜 ...

  2. LeetCode 4Sum 4个数之和

    题意:这是继2sum和3sum之后的4sum,同理,也是找到所有4个元素序列,满足他们之和为target.以vector<vector<int>>来返回,也就是二维的,列长为4 ...

  3. 详细步骤教你安装yii高级应用程序和配置composer环境

    现在开始工作,应公司的要求,要开始接触yii了,作为一个没有碰过yii的小白,首先一个问题就是怎么去安装高级程序应用,过程不麻烦,但是也需要细心和耐心,百度资料里面的教程都不太全,漏这漏那的,所以在这 ...

  4. Dynamic typing 动态类型

    https://developer.apple.com/library/content/documentation/General/Conceptual/DevPedia-CocoaCore/Dyna ...

  5. Solaris&&QNX® Neutrino®&&OpenVMS&&FreeBSD&&AIX

    原文链接Solaris (读作 /se'laris:/ 或者 /so'le:ris/ 或者 '梭拉瑞斯' )是Sun Microsystems研发的计算机 操作系统.它被认为是UNIX操作系统的衍生版 ...

  6. Python 一行代码输出心形图案

    Python3 >>> print('\n'.join([''.join([('Love'[(x-y)%4]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0. ...

  7. mybatis的环境搭建

    mybatis是一个持久层框架,其主要思想就是想将程序中大量的SQL语句剥离出来,配置在配置文件中,实现SQL的灵活配置. 使得SQL与程序代码分离,即在不修改程序代码的情况下,直接在配置文件中修改S ...

  8. Android 性能篇 -- 带你领略Android内存泄漏的前世今生

    基础了解 什么是内存泄漏? 内存泄漏是当程序不再使用到的内存时,释放内存失败而产生了无用的内存消耗.内存泄漏并不是指物理上的内存消失,这里的内存泄漏是指由程序分配的内存但是由于程序逻辑错误而导致程序失 ...

  9. html下拉菜单栏代码

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. BootStrap下拉框搜索功能

    <!DOCTYPE html> <html> <head> <title>jQuery bootstrap-select可搜索多选下拉列表插件-www. ...