一.爬虫
1.初识网络爬虫
什么是爬虫?
网络爬虫英文名叨Web Crawler戒Web Spider。
它是一种自动浏览网页并采集所需要信息的程序。
爬虫从初始页面的URL开始,获取初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统给定的停止条件。
网页的抓取策略
通常来说,网页的抓取策略可以分为以下三类:
1.广度优先
2.最佳优先
3.深度优先
深度优先在很多情况下会导致爬虫的陷入(trapped)问题,目前常见的是广度优先和最佳优先方法。
广度优先搜索策略是指在抓取过程中,在完成当前层次的搜索后,才进行下一层次的搜索。
特点是,算法的设计和实现相对简单。在目前为覆盖尽可能多的网页,一般使用广度优先搜索方法。也有很多研究将广度优先搜索策略应用于聚焦爬虫 中。其基本思想是认为与初始URL在一定链接距离内的网页具有主题相关性的概率很大。
最佳优先搜索策略按照一定的网页分析算法,预测候选URL不目标网页的相似度,或与不主题的相关性,并选取评价最好的一个或几个URL迕行抓取。 它只访问经过网页分析算法预测为“有用”的网页。
特点是,最佳优先策略是一种局部最优搜索算法,在爬虫抓取路径上的很多相关网页可能被忽略。
深度优先搜索策略仍起始网页开始,选择一个URL进入,分析这个网页中的URL,选择一个再进入。如此一个链接一个链接地抓取下去,直到处理完 一条路线之后再处理下一条路线。
特点是,深度优先策略算法设计较为简单,但每深入一层,网页价值和 PageRank都会相应地有所下降,相对于其他两种策略而言,此种策略很少被使用。
2.网络爬虫的分类
2.1 通用网络爬虫
通用网络爬虫又称全网爬虫( Scalable Web Crawler)爬行对象从一些种子URL扩充到整个Web,主要为门 站点搜索引擎和大型Web服务提供商采集数据。
通用网络爬虫根据预先设定的一个或若干初始种子URL开始,以此获得初始网页上的URL列表,在爬行过程中不断从URL队列中获一个的URL,进而访问并下载该页面。
2.2 增量爬虫
增式网络吧虫( Incremental Web Crawler)是指对已下载网页采取増量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在定程度上保证所爬行的页面是尽可能新的页面。
增量式吧虫有两个目标:保持本地页面集中存储的页面为最新页面和提高本地页面集中页面的质量。 通用的商业搜索引擎如谷歌,百度等,本质上都属于增量吧虫。
2.3 垂直爬虫
垂直爬虫,又称为聚焦网络爬虫( Focused Crawler),或主题网络爬虫( Topical Crawler)。
是指选择性地爬取那些与预先定义好的主题相关页面的网络爬虫。如Email地址,电子书,商品价格等。
爬行策略实现的关键是评价页面内容和链接的重要性,不同的方法计算出的重要性不同,由此导致链接的访问顺序也不同。
2.4 Deep Web爬虫
Deep Web 是那些大部分内容不能通过静态链接获取的、隐藏在搜索表单后的,只有用户提交一些关键词才能获得的 Web 页面。
Deep Web 爬虫爬行过程中最重要部分就是表单填写,包含两种类型:
-
基亍领域知识的表单填写 -
基亍网页结构分析的表单填写
3.Robots协议
又称机器人协议或爬虫协议, 该协议就搜索引擎抓取网站内容的范围作了约定,包括网站是否希望被搜索引擎抓取,哪些内容不允许被抓取,网络爬虫据此“自觉地”抓取或者不抓取该网页内容。自推出以来 Robots协议已成为网站保护自有敏感数据和网民隐私的国际惯例。
二.创建anaconda虚拟环境
打开Anaconda Prompt,创建虚拟环境(pythonwork是环境名,可自行更改,python=2.7是下载的python版本,也可自行更改)
conda create -n pythonwork python=3.6
激活环境
activate pythonwork
在此虚拟环境中用pip或conda安装requests、beautifulsoup4等必要包。
conda install -n pythonwork requests
conda install -n pythonwork beautifulsoup4
conda install tqdm
打开anaconda可以看见我们刚刚创建的虚拟环境
在该环境下点击下载Spyder。
三.爬取网站 http://www.51mxd.cn/练习题目数据并保存
打开Spyder,新建.py文件
代码:
"""
Created on Sun Nov 14 20:50:12 2021
@author: hp
"""
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')
for pages in tqdm(range(1, 11 + 1)):
r = requests.get(f'http://www.51mxd.cn/problemset.php-page={pages}.htm', Headers)
r.raise_for_status()
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, 'html.parser')
td = soup.find_all('td')
subject = []
for t in td:
if t.string is not None:
subject.append(t.string)
if len(subject) == 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题目信息爬取完成!!!')
点击运行,生成文件NYOJ_Subjects.csv
打开该文件:
成功。
四.爬取网站http://news.cqjtu.edu.cn/xxtz.html中近几年的消息通知的发布日期和标题
打开网址http://news.cqjtu.edu.cn/xxtz.htm爬取新闻
网页底部可以看见所有消息共有66个页面,要爬取所有新闻就要知道这些页面的地址,点击下一页可以看见网页链接中如:http://news.cqjtu.edu.cn/xxtz/1.htm有一个数字根据页面数变化,且除首页外,其余页面中的数字都是67-该页面底部页面数。
我们可以用一个简单的循环得到这些页面链接中的数字
代码:
"""
Created on Sun Nov 14 21:17:21 2021
@author: hp
"""
import requests
from bs4 import BeautifulSoup
import csv
from tqdm import tqdm
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'
}
cqjtu_head=["日期","标题"]
cqjtu_infomation=[]
def get_time_and_title(page_num,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=Headers)
r.raise_for_status()
r.encoding="utf-8"
array={
'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=[]
print('新闻信息爬取中:\n')
for pages in tqdm(range(66, 0,-1)):
get_time_and_title(pages,Headers)
with open('cqjtu_news.csv', 'w', newline='') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(cqjtu_head)
fileWriter.writerows(cqjtu_infomation)
print('\n新闻信息爬取完成!!!')
运行得到文件cqjtu_news.csv
打开该文件:
成功。
五.总结
爬取某静态网页信息时,要查看网页源代码,分析要获取信息在什么标签,从标签中取出信息,通过循环获取所有相关url不断获取信息。利用网络爬虫爬取信息能够让我们从众多信息中找到有用信息,节约时间。
六.参考链接
爬虫爬取学校通知信息(python)
资料: 链接:https://pan.baidu.com/s/1cfbtoz6c8BTP2sKG9EmAJQ 提取码:1234
|