一、作业①
-
要求:用urllib和re库方法定向爬取给定网址(https://www.shanghairanking.cn/rankings/bcsr/2020/0812 )的数据。
-
输出信息:
| 2020排名 | 全部层次 | 大学 | 总分 |
|---|---|---|---|
| 1 | 前2% | 清华大学 | 1661.0 |
| 2 | |||
| ... |
1、思路、代码和实验结果
1.1 思路
- 获取网页文本
首先用urllib.request库发送请求,解析并获取网页的全部内容。
- 逐行获取信息
整个表格是存于tbody里面,所以先用正则表达式提取出tbody的内容。
另外,每条数据都是存在tr里面的,获得tbody的内容后,可以利用正则表达式的finditer()的方法,获取每个tr,并构成列表,列表的每个元素就是一条记录。如下图所示:
- 获取各个属性值
有了30个tr组成的列表之后,可以对tr逐个进行分析,并且用正则表达式匹配我们想要的字段。在此之前,先将换行符和空格进行清除,可以方便正则表达式的匹配。各个字段用到的正则表达式如下:
2020排名:r\'<divclass="ranking"data-v-68e330ae>\d+</div>\'
层次: r\'前\d+%\' 这个字段的属性可以很容易的通过“前”字匹配
学校:r\'[\u4e00-\u9fa5]{2,20}\' 表示2~20字的汉字,至少2个字是为了与“前”分开
得分:r\'\d+.\d+\' 有小数点的数字
2、心得体会
- 运用正则表达式匹配要找到各个字段的规律,用最简单的表达式精准匹配各个字段。
- 使用正则表达式之前可以将空白字符如换行符和空格除掉,这样匹配更方便,结果更准确。
二、作业②:
- 要求:用requests和Beautiful Soup库方法设计爬取https://datacenter.mee.gov.cn/aqiweb2/ AQI实时报。
- 输出信息:
| 序号 | 城市 | AQI | PM2.5 | SO2 | No2 | Co | 首要污染物 |
|---|---|---|---|---|---|---|---|
| 1 | 北京 | 55 | 6 | 5 | 1.0 | 225 | — |
| 2 | |||||||
| ...... |
1、思路、代码和实验结果
思路与作业1大致相同:
- 审查元素寻找规律
通过观察发现每一条记录都存在tobdy的tr标签下,所以只需要获得每个tr的数据,就可以获取我们需要的信息。
-
获取网页文本
用requests库获取网页文本,并将文本用Beautiful解析
soup = BeautifulSoup(data, \'html.parser\') -
用
beautifulsoup的select()方法搜索所有的trlis = soup.select(\'tbody[id="legend_01_table"] tr\')可以发现我们需要的信息都在每个
tr的td里面,所以可以很容易的利用text属性得到我们需要的信息 -
代码:https://gitee.com/ZeLong-yAng/data-acquisition-and-fusion/blob/master/1/homework_2.py
-
结果:
2、心得体会
- 作业1和作业2都比较适合用
Beautifulsoup爬取,方便快捷
三、作业③
-
要求:使用urllib和requests爬取(https://news.fzu.edu.cn/),并爬取该网站下的所有图片
-
输出信息:将网页内的所有图片文件保存在一个文件夹中
1、思路、代码和实验结果
这个作业比较简单,首先进行网页的获取,需要特别注意的是,这个网站是采用http协议,用https是无法打开的。
- 获取图片链接
然后可以用正则表达式匹配所有的图片,由于题目要求爬取的jpg图片,所以可以用以下正则表达式匹配:r\'src=".*.jpg\'。然后用字符串切片得出链接地址,此时是相对地址,所以要加上url得到绝对地址。
- 下载图片
利用get方法可以下载图片
2、心得
相比于作业1和作业2,作业3更适合用re库直接匹配。所以在爬虫的设计过程中,要具体问题具体分析,灵活运用re和BeautifulSoup等各种工具,不能单纯只会用一种工具。