js 爬虫抓取网页数据(计算机学院大数据专业大三的错误出现,有纰漏恳请各位大佬不吝赐教)
优采云 发布时间: 2022-04-01 17:15js 爬虫抓取网页数据(计算机学院大数据专业大三的错误出现,有纰漏恳请各位大佬不吝赐教)
大家好,我是文部霍,计算机学院大数据专业三年级学生。我的昵称来自成语——不冷不热,意思是希望我有一个温柔的气质。博主作为互联网行业的新手,写博客一方面是为了记录自己的学习过程,另一方面是总结自己的错误,希望能帮助很多和自己一样处于起步阶段的新人。不过由于水平有限,博客难免会出现一些错误。如果有任何错误,请给我您的建议!.
内容
一、爬取策略
爬取策略是指在爬取过程中对从每个页面解析出来的超链接进行排列的方法,即按照什么顺序来爬取这些超链接。
1.1 爬取策略的设计需要考虑以下约束
(1)不要给web服务器压力太大
这些压力主要体现在:
①连接web服务器需要占用其网络带宽
②每请求一个页面,需要从硬盘读取一个文件
③ 对于动态页面,还需要执行脚本。如果启用了Session,大数据访问需要更多的内存消耗
(2)不要使用过多的客户端资源
当爬虫程序与 Web 服务器建立网络连接时,也会消耗本地网络资源和计算资源。如果同时运行的线程过多,特别是存在一些长期连接,或者网络连接的超时参数设置不当,很可能会导致客户端的网络资源消耗受限。
1.2 爬取策略设计的综合考虑
毕竟,不同网站上的网页链接图都有自己独特的特点。因此,在设计爬虫策略时,需要做出一定的权衡,并考虑各种影响因素,包括爬虫的网络连接消耗以及对服务器的影响。影响等等,一个好的爬虫需要不断的结合网页链接的一些特性来优化和调整。
对于爬虫来说,爬取的初始页面一般是比较重要的页面,比如公司首页、新闻首页网站等。
从爬虫管理多页超链接的效率来看,无论是基本的深度优先策略还是广度优先策略都具有较高的效率。
从页面优先级来看,虽然爬虫使用指定的页面作为初始页面进行爬取,但是在确定下一个要爬取的页面时,总是希望优先级较高的页面先被爬取。
因为页面之间的链接结构非常复杂,可能会出现双向链接、环形链接等情况。
爬虫在爬取WEB服务器上的页面时,需要先建立网络连接,占用主机和连接资源。合理分配这种资源占用是非常有必要的。
二、第一次尝试网络爬虫
互联网中的网络相互连接,形成一个巨大的网络图:
网络爬虫根据给定的策略从这个庞大而复杂的网络体中爬取所需的内容
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 = 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)
我们可以感受下下一级页面到下一级页面可以有多少个链接
三、抓取策略
从网络爬虫的角度来看,整个互联网可以分为:
3.1、数据抓取策略不完善 PageRank 策略 OCIP 策略 大站优先策略 合作爬取策略 图遍历算法策略3.1.1、不完整的PageRank 策略
一般来说,一个网页的PageRank得分是这样计算的:
3.1.2、OPIC 政策
OPICOnline Page Importance Computation的缩写的时时时时以时时时彩平台网址OPIC
OPIC策略的基本思路
3.1.3、 大站点优先策略(粗略)
大站优先策略的思路简单明了:
“战斗”通常具有以下特点:
如何识别要抓取的目标网站是否是战争?
3.1.4、合作爬取策略(需要规范的URL地址)
为了提高爬取网页的速度,一个常见的选择是增加网络爬虫的数量
如何给这些爬虫分配不同的工作量,保证独立分工,避免重复爬取,这是协作爬取策略的目标
协作爬取策略通常使用以下两种方法:
3.1.5、图遍历算法策略(★)
图遍历算法主要分为两种:
1、深度优先
深度优先从根节点开始,沿着尽可能深的路径,直到遇到叶节点才回溯
2、广度优先
为什么要使用广度优先策略:
广度优先遍历策略的基本思想
广度优先策略从根节点开始,尽可能访问离根节点最近的节点
3、Python 实现
DFS和BFS具有高度的对称性,所以在实现Python的时候,不需要将两种数据结构分开,只需要构建一个数据结构
4、代码实现
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)
import requests,re
count = 20
r = re.compile(r'href=[\'"]?(http[^\'">]+)')
seed = 'http://httpbin.org/'
stack = [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)
BFS 和 DFS 各有优势,DFS 更容易陷入无限循环,而且通常有价值的网页不会隐藏得太深,因此 BFS 通常是更好的选择。上面的代码使用 list 来模拟堆栈或队列。Python中还有一个Queue模块,包括LifoQueue和PriorityQueue,使用起来比较方便。
3.2、数据更新政策
常见的更新策略如下:
集群策略的基本思想
美好的日子总是短暂的。虽然我想继续和你聊天,但是这篇博文已经结束了。如果还不够好玩,别着急,我们下期再见!
一本好书读一百遍也不厌烦,熟了课才知道自己。而如果我想成为观众中最漂亮的男孩,我必须坚持通过学习获得更多的知识,用知识改变命运,用博客见证我的成长,用行动证明我在努力。
如果我的博客对你有帮助,如果你喜欢我的博客内容,请一键“点赞”“评论”“[url=https://www.ucaiyun.com/]采集”!听说喜欢的人不会倒霉的,每天都精神抖擞!如果你真的想白嫖,那么祝你天天快乐,也欢迎经常光顾我的博客。
码字不易,大家的支持是我坚持下去的动力。喜欢后别忘了关注我哦!