自动抓取网页数据(南阳理工学院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下

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线