如何抓取网页数据(计算机学院大数据专业大三的错误出现,你中招了吗?)
优采云 发布时间: 2021-09-10 17:11如何抓取网页数据(计算机学院大数据专业大三的错误出现,你中招了吗?)
大家好,我不温柔,我是计算机学院大数据专业的大三学生。我的外号来自一个成语——不温柔,希望我有温柔的气质。博主作为互联网行业的新手,写博客一方面记录自己的学习过程,另一方面总结自己犯过的错误,希望能帮助到很多刚入门的年轻人他是。不过由于水平有限,博客难免会出现一些错误。如有疏漏,希望大家多多指教!暂时只会在csdn平台更新,
PS:随着越来越多的人未经本人同意直接爬到博主文章,博主特此声明:未经本人许可禁止转载! ! !
内容
一、爬行策略
爬取策略是指在爬取过程中对从每个页面解析出的超链接进行排列的方法,即按照什么顺序来爬取这些超链接。
1.1 爬取策略的设计需要考虑以下限制
(1)不要给web服务器太大压力
这些压力主要体现在:
①与网络服务器的连接需要占用其网络带宽
②每次请求一个页面,都需要从硬盘中读取一个文件
③对于动态页面,还需要执行脚本。如果开启Session,大数据访问需要更多内存
(2)不要占用太多客户端资源
爬虫程序在与Web服务器建立网络连接时,也会消耗本地网络资源和计算资源。如果同时运行的线程过多,特别是一些长期连接存在,或者网络连接的超时参数设置不当,很可能客户端消耗的网络资源有限。
1.2 爬取策略设计的综合考虑
毕竟不同网站上的网页链接图都有自己独特的特点。因此,在设计爬虫策略时,需要做出一定的权衡,并考虑各种影响因素,包括爬虫的网络连接消耗和服务器端的影响等,一个好的爬虫需要不断结合一些特性网页链接进行优化和调整。
对于爬虫来说,爬取的初始页面一般都是比较重要的页面,比如某个公司的首页,news网站的首页等
从爬虫管理多个页面超链接的效率来看,基本的深度优先策略和广度优先策略的效率更高。
从页面优先级的角度来看,虽然爬虫使用指定的页面作为初始页面进行爬取,但在确定下一个要爬取的页面时,总是希望优先级高的页面先被爬取。
由于页面之间的链接结构非常复杂,可能存在双向链接、循环链接等
爬虫在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[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)
我们可以感觉到从下一级网页到下一级网页的链接有多少
三、抢夺策略
从网络爬虫的角度来看,整个互联网可以分为:
3.1、Data Capture Strategy Incomplete PageRank Strategy OCIP Strategy Big Site Priority Strategy Collaboration Capture Strategy Graph Traversal Algorithm Strategy3.1.1、Incomplete PageRank Strategy
一般来说,网页的PageRank分数计算如下:
3.1.2、OPICStrategy
OPIC 是 Online Page Importance Computation 的缩写,是一种改进的 PageRank 算法
OPIC策略的基本思路
3.1.3、大站优先策略(粗略)
大站优先策略思路简单明了:
“战争”通常具有以下特点:
如何识别目标网站是否是一场大战?
3.1.4、协同爬取策略(需要标准化的URL地址)
为了提高网络爬虫的速度,一个常见的选择是增加网络爬虫的数量
如何给这些爬虫分配不同的工作量,保证独立分工,避免重复爬取。这就是协同爬取策略的目标
合作爬取策略通常采用以下两种方式:
3.1.5、图遍历算法策略(★)
图遍历算法主要分为两种:
1、depth 优先
深度优先从根节点开始,沿着路径尽可能深地访问,直到遇到叶节点。
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通常是更好的选择。上面的代码使用列表来模拟堆栈或队列。 Python中还有一个Queue模块,里面收录了LifoQueue和PriorityQueue,使用起来会更方便。
3.2、数据更新策略
常见的更新策略如下:
聚类策略的基本思路
美好的日子总是短暂的。虽然我还想继续和你谈谈,但这篇博文现在已经结束了。如果还不够,别着急,我们下篇文章见!
我从不厌倦阅读一本好书数百遍。而如果我想成为全场最漂亮的男孩子,我必须坚持通过学习获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
如果我的博客对你有帮助,如果你喜欢我的博客内容,听说喜欢的人不会太幸运,每天都精力充沛!如果你真的想当妓女,祝你天天开心,欢迎访问我的博客。
码字不易,大家的支持是我坚持下去的动力。