互联网中的网络之间互相连接,构成一个巨大的网络图:
网络爬虫就是从这个巨大复杂的网络体中,根据给定的策略,抓取所需要的内容
实例代码如下:
import requests,re
# import time
# from collections import Counter
count = 20
r = re.compile(r'href=[\'"]?(http[^\'">]+)')
seed = 'https://www.baidu.com/more/'
queue = [seed]
used = set() # 设置一个集合,保存已经抓取过的URL
storage = {}
while len(queue) > 0 and count > 0 :
try:
url = queue.pop(0)
html = requests.get(url).text
storage[url] = html #将已经抓取过的URL存入used集合中
used.add(url)
new_urls = r.findall(html) # 将新发行未抓取的URL添加到queue中
print(url+"下的url数量为:"+str(len(new_urls)))
for new_url in new_urls:
if new_url not in used and new_url not in queue:
queue.append(new_url)
count -= 1
except Exception as e :
print(url)
print(e)
我们可以感受下一个一级网页到下一级网页的链接能有多么多
从网络爬虫的角度来看,整个互联网可以划分为:
PageRank
算法,是一种著名的超链接分析算法,用来进行网页排名,以谷歌创始人Larry Page
命名
PageRank
分数高的网页链接到一个其他的网页,被链接到的网页的PageRank
分数会相应提高
通常来讲,一个网页的PageRank分数计算如下:
OPIC
,是Online Page Importance Computation
的缩写,是一种改进的PageRank
算法
OPIC策略的基本思想
大站优先策略的思路简单明了:
“大战”通常具有以下特点:
如何识别要抓取的目标网站是否为大战?
为了提高抓取网页的速度,常见的选择是增加网络爬虫的数量 如何给这些爬虫分配不同的工作量,确保独立分工,避免重复爬取,这是合作抓取策略的目标 合作抓取策略通常使用以下两种方式:
图的遍历算法主要分成两种:
深度优先从根节点开始,沿着一条路径尽可能深地访问,直到遇到叶节点时才回溯
使用广度优先策略的原因:
广度优先遍历策略地基本思路
广度优先策略从根节点开始,尽可能访问离根节点最近的节点
用list模拟队列,实现BFS算法:
import requests,re
count = 20
r = re.compile(r'href=[\'"]?(http[^\'">]+)')
seed = 'http://httpbin.org/'
queue = [seed]
storage = {}
while len(queue) > 0 and count > 0 :
try:
url = queue.pop(0)
html = requests.get(url).text
storage[url] = html #将已经抓取过的URL存入used集合中
used.add(url)
new_urls = r.findall(html) # 将新发行未抓取的URL添加到queue中
print(url+"下的url数量为:"+str(len(new_urls)))
for new_url in new_urls:
if new_url not in used and new_url not in queue:
queue.append(new_url)
count -= 1
except Exception as e :
print(url)
print(e)
用list模拟队列,实现DFS算法:
import requests,re
count = 20
r = re.compile(r'href=[\'"]?(http[^\'">]+)')
seed = 'http://httpbin.org/'
queue = [seed]
storage = {}
while len(stack) > 0 and count > 0 :
try:
url = stack.pop(-1)
html = requests.get(url).text
new_urls = r.findall(html)
stack.extend(new_urls)
print(url+"下的url数量为:"+str(len(new_urls)))
storage[url] = len(new_urls)
count -= 1
except Exception as e :
print(url)
print(e)
统计:
真的会陷入无限循环吗?
常见的更新策略有以下几种:
聚类策略的基本思路
持久化方法: