自动抓取网页数据(南阳理工学院ACM的基本架构网络爬虫练习题目数据的保存)
优采云 发布时间: 2021-11-18 22:09自动抓取网页数据(南阳理工学院ACM的基本架构网络爬虫练习题目数据的保存)
内容
一、相关原理1.什么是爬虫
网络图:
网页抓取策略:
一般来说,网络爬取策略可以分为以下三类:
• 广度优先
• 最佳优先
• 深度优先
深度优先在很多情况下会导致爬虫被困。目前,广度优先和最佳优先方法很常见。
2. 网络爬虫的分类
一般来说,网络爬虫可以分为以下几类:
• 通用网络爬虫
• 增量爬虫
• 垂直履带
• 深网爬虫
3.网络爬虫的使用范围
机器人协议
又称机器人协议或爬虫协议,该协议规定了搜索引擎抓取的内容范围,包括网站是否希望被搜索引擎抓取,哪些内容不允许抓取,以及互联网基于此,爬虫“有意识地”抓取或不抓取网页内容。自推出以来,机器人协议已成为网站保护自身敏感数据和网民隐私的国际惯例。
4.爬虫的基本结构
一个网络爬虫通常收录四个模块:
• URL 管理模块
• 下载模块
• 分析模块
• 存储模块
爬虫框架:
二、代码实现1.环境配置
打开Anaconda Prompt,创建一个虚拟环境
conda create -n crawler python=3.7
crawler 是虚拟环境的名称,python=3.7 是python版本。
激活环境:
activate crawler
使用 pip 或 conda 命令下载将要使用的包:
pip install requests
pip install beautifulsoup4
pip install tqdm
pip install csv
2.南洋理工ACM题的爬取和保存网站练习题数据2.1分析网址
目标地址:
查看源代码:
找到目标爬取内容:
其中,Ctrl+F在页面上搜索某个主题(这里以最大和为例):
可以搜索到,说明这个数据不是动态加载的,可以直接到页面获取。
按F12打开开发者工具(或右键选择勾选),点击元素中的箭头工具(部分浏览器是Element)(如下图②所示),点击标题,即可显示元素:
可以发现,每行信息在一个标签中,每个小信息在一个标签串中。在Element中,Ctrl + F在一个页面上搜索100个问题,一排有7个,正好是700个。因此只需获取所有标签:
分析完成后,开始编写代码。
2.2 代码编写
# 导入相关包
import requests #基于urllib,采用Apache2Licensed开源协议的HTTP库
from bs4 import BeautifulSoup # 可以从HTML或XML文件中提取数据的python库
import csv # 保存为csv文件所需的包
from tqdm import tqdm # 显示下载进度的包
# 模拟浏览器访问
Headers = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400'
# 表头,根据网页数据来定
csvHeaders = ['题号', '难度', '标题', '通过率', '通过数/总提交数']
# 题目数据
subjects = []
# 爬取题目
print('题目信息爬取中:\n')
#进度显示,爬取该网站的所有题目信息11页
for pages in tqdm(range(1, 11 + 1)):
r = requests.get(f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers) # get请求第pages页
r.raise_for_status() # 判断异常
r.encoding = 'utf-8' # 编码格式
soup = BeautifulSoup(r.text, 'html.parser') # 创建BeautifulSoup对象,用于解析该html页面数据
td = soup.find_all('td') # 获取所有td标签
subject = [] # 存放某一个题目的所有信息
# 遍历所有td
for t in td:
if t.string is not None:
subject.append(t.string) # 获取td中的字符串
if len(subject) == 5: # 每5个为一个题目的信息
subjects.append(subject)
subject = []
# 存放题目
with open('NYOJ_Subjects.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders) #写入表头
fileWriter.writerows(subjects) #写入数据
print('\n题目信息爬取完成!!!')
运行中:
运行完毕:
查看生成的csv文件:
共1126条数据,与原网页数量相同。
3.爬取重庆交大新闻网站近年所有信息公告的发布日期和标题均为3.1个分析页
目标地址:
第一页的url是,第二页是,第三页是...第66页是
一共66页,可以表示为:
base_url = "http://news.cqjtu.edu.cn/xxtz/"
for i in range(1, 67):
if(i == 1):
url = 'http://news.cqjtu.edu.cn/xxtz.htm'
else:
url ='http://news.cqjtu.edu.cn/xxtz/' + str(67 - i) + '.htm'
查看源码,找到目标爬取内容:
用Ctrl+F搜索页面主题(这里以征集新型交通智库研究成果为例):
可以搜索到,说明这个数据不是动态加载的,可以直接到页面获取。
F12 打开开发者工具(或右键选择勾选),点击元素中的箭头工具(部分浏览器是Element)(如下图②所示),点击一个标题在元素中显示:
可以发现,每一行信息都在一个标签中,都在class="left-list"的div下