网页的抓取策略:
通常来说,网页的抓取策略可以分为以下三类:
• 广度优先
• 最佳优先
• 深度优先
深度优先在很多情况下会寻致爬虫的陷入(trapped)问题,目前常见的是广度优先和最佳优先方法。
通常来说,网络爬虫可以分为以下几类:
• 通用网络爬虫
• 增量爬虫
• 垂直爬虫
• Deep Web 爬虫
Robots协议
又称机器人协议或爬虫协议, 该协议就搜索引擎抓取网站内容的范围作了约定,包括网站是否希望被搜索引擎抓取,哪些内容不允许被抓取,网络爬虫据此“自觉地”抓取或者不抓取该网页内容。自推出以来 Robots协议已成为网站保护自有敏感数据和网民隐私的国际惯例。
- robots协议通过robots.txt实现
- robots.txt文件应该放置在网站根目录下。
- 当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。
网络爬虫通常包含四个模块:
• URL管理模块
• 下载模块
• 解析模块
• 存储模块
爬虫框架:
打开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
在其中Ctrl + F 搜索该页的某一个题目(此处以最大和为例):
能够搜索到,说明此数据不是动态加载,可直接get该页面以获取。
按F12 打开开发者工具(或者右键选择检查),在元素(有的浏览器是Element)中点击箭头工具(如下图②所示),点击一个题目,可在元素中显示:
可发现,每一行信息都在一个标签中,每个小信息都在一个标签的字符串里面,在Element中Ctrl + F 搜索
分析完成后,开始编写代码。
# 导入相关包
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题目信息爬取完成!!!')
一共1126条数据,与原网页数量相同。
目标地址: http://news.cqjtu.edu.cn/xxtz.htm
第一页url为http://news.cqjtu.edu.cn/xxtz.htm,第二页为http://news.cqjtu.edu.cn/xxtz/65.htm,第三页为http://news.cqjtu.edu.cn/xxtz/64.htm…第66页为http://news.cqjtu.edu.cn/xxtz/1.htm
一共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 搜索该页的某一个题目(此处以交通运输新型智库研究成果征集为例):
能够搜索到,说明此数据不是动态加载,可直接get该页面以获取。
F12 打开开发者工具(或者右键选择检查),在元素(有的浏览器是Element)中点击箭头工具(如下图②所示),点击一个题目,可在元素中显示:
可发现,每一行信息都在一个
分析完成后,开始编写代码。
# 导入相关包
import requests #基于urllib,采用Apache2Licensed开源协议的HTTP库
from bs4 import BeautifulSoup # 可以从HTML或XML文件中提取数据的python库
import csv # 保存为csv文件所需的包
from tqdm import tqdm # 显示下载进度的包
# 获取每页内容
def get_one_page(url):
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'
}
try:
info_list_page = [] # 一页的所有信息
resp = requests.get(url, headers=headers)
resp.encoding = resp.status_code
page_text = resp.text
soup = BeautifulSoup(page_text, 'html.parser')
li_list = soup.select('.left-list > ul > li') # 找到所有li标签
for li in li_list:
divs = li.select('div')
date = divs[0].string.strip()
title = divs[1].a.string
info = [date, title]
info_list_page.append(info)
except Exception as e:
print('爬取' + url + '错误')
print(e)
return None
else:
resp.close()
return info_list_page
# 爬取所有数据
print('信息爬取中:\n')
info_list_all = []
base_url = 'http://news.cqjtu.edu.cn/xxtz/'
for i in tqdm(range(1, 66+1)):
if i == 1:
url = 'http://news.cqjtu.edu.cn/xxtz.htm'
else:
url = base_url + str(67 - i) + '.htm'
info_list_page = get_one_page(url)
info_list_all+= info_list_page
# 存入数据
with open('CQJTU_news.csv', 'w', newline='', encoding='utf-8') as file:
fileWriter = csv.writer(file)
fileWriter.writerow(['日期', '标题']) # 写入表头
fileWriter.writerows(info_list_all) # 写入数据
print('\n信息爬取完成!!!')
截止到运行代码的时间,共有987条新闻。
爬取静态网页信息时,要查看网页源代码,分析要获取信息在什么标签,然后从标签中取出信息。因为信息较多,1页是显示不完的,就会有不同的url,所以要通过循环获取所有相关url不断获取信息才能得到所有的数据。通过爬虫能更快的获取我们想要得到的信息。
爬虫-python入门1.pdf
Python爬虫练习(爬取OJ题目和学校信息通知)