c爬虫抓取网页数据(4.网络爬虫的合法性Robots协议:又称机器人协议或爬虫协议)
优采云 发布时间: 2021-12-26 05:07c爬虫抓取网页数据(4.网络爬虫的合法性Robots协议:又称机器人协议或爬虫协议)
内容
一、爬虫简介
1.什么是网络爬虫?
网络爬虫(也称为网络蜘蛛、网络机器人,在 FOAF 社区中,更常见的是网络追逐者)是按照一定的规则自动抓取万维网上信息的程序或脚本。其他不太常用的名称包括蚂蚁、自动索引、模拟器或蠕虫。
2.爬虫类型
根据系统结构和实现技术,网络爬虫大致可以分为以下几类:通用网络爬虫、聚焦网络爬虫、增量网络爬虫、深网爬虫(Deep Web Crawler)。实际的网络爬虫系统通常是通过多种爬虫技术的组合来实现的。
3.网络爬虫的使用范围
① 作为搜索引擎的网页采集器,抓取整个互联网,如谷歌、百度等。
②作为垂直搜索引擎,抓取特定主题信息,如视频网站、招聘网站等。
③作为测试网站前端的检测工具,用于评估网站前端代码的健壮性。
4.网络爬虫的合法性
机器人协议:又称机器人协议或爬虫协议,该协议规定了搜索引擎抓取网站内容的范围,包括网站是否希望被搜索引擎抓取,哪些内容不允许被抓取。网络爬虫“有意识地”在本地抓取或不抓取网页内容。自推出以来,机器人协议已成为网站保护自身敏感数据和网民隐私的国际惯例。
5.网络搜索策略
网络爬取策略可分为深度优先、广度优先和最佳优先。在很多情况下,深度优先会导致爬虫被困。目前,广度优先和最佳优先的方法很常见。
6.爬虫的基本结构
一个网络爬虫通常收录
四个模块:
• URL 管理模块
• 下载模块
• 分析模块
• 存储模块
二、环境准备(一)创建python虚拟环境
使用 conda 创建一个名为 crawler 的 python 虚拟环境。在这个虚拟环境下,使用pip或者conda安装requests、beautifulsoup4等必要的包(如果网络问题请切换国内镜像网站或国外网站仓库,注意使用这两个安装工具不同的仓库)。使用jupyter、pycharm、spyder、vscoder等IDE编程环境时,需要选择设置IDE后端使用的python版本或虚拟环境。比如使用jupyter notebook时,参考(),在jupyter运行的web界面选择对应的python kernel Kernel(带虚拟环境列表);如果使用pycharm,参考()选择对应的现有虚拟环境。
使用 conda create -n crawler python=3.8 命令新建一个名为 crawlerpython version 3.8 的虚拟环境
你开始创造
已创建
使用命令conda env list查看已经存在的虚拟环境,爬虫已经存在,base是conda自带的环境,uuu是我之前创建的
Activate crawler 进入爬虫环境,conda activate 退出当前环境,activate 是进入基础环境
conda remove --name 环境名称 --all 卸载环境
Jupyter notebook 本身不支持选择虚拟环境,每次有新项目时都需要重新配置所有插件。使用nb_conda插件将jupyter notebook变成pycharm一样可选择的运行环境。
在基础环境中使用conda install nb_conda命令安装nb_conda
在conda虚拟环境中使用conda install -n environment name ipykernel命令安装ipykernel
可以在jupyter notebook中显示
(二)安装库
环境准备
Python安装,这部分可以参考我之前的文章Python环境配置&Pycharm安装,到官网下载对应的安装包,安装一路Next;
pip安装,pip是Python的包管理器,目前的Python安装包一般都自带pip,不需要自己安装;
安装requests,beautifulsoup库,通过如下语句完成安装:
pip 安装请求
pip 安装 beautifulsoup4
谷歌浏览器(铬);
pip 安装请求
pip 安装 beautifulsoup4
pip 安装 html5lib
三、 爬取南洋理工ACM主题网站
学习样例代码,对关键代码句写详细注释,编写程序完成南洋理工ACM题库练习题数据的采集和存储;
(一)查看页面源码
点击进入南洋理工ACM专题网站,
右键->查看页面源代码
(二)代码运行
import requests
from bs4 import BeautifulSoup
import 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')
# tqdm作业:以进度条方式显示爬取进度
# 爬取11页所有题目信息
for pages in tqdm(range(1, 11 + 1)):
# get请求第pages页
r = requests.get(f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
# 判断异常
r.raise_for_status()
# 设置编码
r.encoding = 'utf-8'
# 创建BeautifulSoup对象,用于解析该html页面数据
soup = BeautifulSoup(r.text, 'html.parser')
# 获取所有td标签
td = soup.find_all('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('D:/jupyter/package/1.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(csvHeaders) # 写入表头
fileWriter.writerows(subjects) # 写入数据
print('\n题目信息爬取完成!!!')
运行,报错ModuleNotFoundError: No module named'tqdm',tqdm文件丢失,使用命令pip install tqdm安装
错误 FeatureNotFound:找不到具有您请求的功能的树*敏*感*词*:lxml。需要安装解析器库吗,用pip install lxml安装,然后还是不行,自动安装最新版本,更换刚刚下载的版本删除:pip卸载lxml,下载指定版本试试: pip install lxml==3.7.0. 或不!!
然后第二种方法,把参数lxml改成html.parser
soup = BeautifulSoup(r.text, 'html.parser')
没关系!激动的心和握手~
(三)结果
四、 爬上重庆交通大学新闻网站
重写爬虫示例代码,爬取重庆交通大学新闻网站近年所有信息公告()的发布日期和标题,写入CSV电子表格。
(一)查看网页源码
重庆交通大学新闻网
右键->查看网页源代码
(二)代码运行
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
# 模拟浏览器访问
cqjtu_Headers ={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44'
}
#csv的表头
cqjtu_head=["日期","标题"]
#存放内容
cqjtu_infomation=[]
def get_page_number():
r=requests.get(f"http://news.cqjtu.edu.cn/xxtz.htm",headers=cqjtu_Headers)
r.raise_for_status()
r.encoding="utf-8"
page_array={
'type':'text/javascript'
}
soup = BeautifulSoup(r.text, 'html5lib')
page_num=soup.find_all('script',page_array)
page_number=page_num[4].string#只靠标签这些定位好像不是唯一,只能手动定位了
page_number=page_number.strip('function a204111_gopage_fun(){_simple_list_gotopage_fun(')#删掉除页数以外的其他内容
page_number=page_number.strip(',\'a204111GOPAGE\',2)}')
page_number=int(page_number)#转为数字
return page_number
def get_time_and_title(page_num,cqjtu_Headers):#页数,请求头
if page_num==66 :
url='http://news.cqjtu.edu.cn/xxtz.htm'
else :
url=f'http://news.cqjtu.edu.cn/xxtz/{page_num}.htm'
r=requests.get(url,headers=cqjtu_Headers)
r.raise_for_status()
r.encoding="utf-8"
array={#根据class来选择
'class':'time',
}
title_array={
'target':'_blank'
}
page_array={
'type':'text/javascript'
}
soup = BeautifulSoup(r.text, 'html.parser')
time=soup.find_all('div',array)
title=soup.find_all('a',title_array)
temp=[]
for i in range(0,len(time)):
time_s=time[i].string
time_s=time_s.strip('\n ')
time_s=time_s.strip('\n ')
#清除空格
temp.append(time_s)
temp.append(title[i+1].string)
cqjtu_infomation.append(temp)
temp=[]
def write_csv(cqjtu_info):
with open('D:/jupyter/package/2.csv', 'w', newline='',encoding='utf-8') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(cqjtu_head)
fileWriter.writerows(cqjtu_info)
print('爬取信息成功')
page_num=get_page_number()#获得页数
for i in tqdm(range(page_num,0,-1)):
get_time_and_title(i,cqjtu_Headers)
write_csv(cqjtu_infomation)
跑
(三)结果
像这样打开
记事本打开
参考
Jupyter notebook 选择虚拟环境运行代码
Anaconda安装教程,管理虚拟环境
Python爬虫练习(爬取OJ题和学校信息通知)