c 抓取网页数据(【天学网:】25#输出爬到的游戏名)

优采云 发布时间: 2022-03-20 15:27

  c 抓取网页数据(【天学网:】25#输出爬到的游戏名)

  7 头 = {

  8“连接”:“保持活动”,

  9 '接受':'文本/html,应用程序/xhtml+xml,*/*',

  10 '接受语言': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3 ',

  11 '接受编码':'gzip,放气',

  12 '用户代理': 'Mozilla/6.1 (Windows NT 6.3; WOW64; 三叉戟/7.0; rv:11.0)像壁虎'

  13 }

  14 # 待爬取的游戏列表页面

  15 网址 = '#39;

  16

  17 # 不压缩html,最大链接时间为10秒

  18 res = requests.get(url, headers=heads, verify=False, timeout=10)

  19 # 为防止出错,编码为 utf-8

  20 res.encoding = 'utf-8'

  21 # 将 html 构建为 Xpath 模式

  22 根 = etree.HTML(res.content)

  23 # 使用Xpath语法获取游戏名称

  24 gameList = root.xpath("//ul[@class='livelist-mod']//li//p//text()")

  25 # 输出你爬到的游戏名称

  26 打印(游戏列表)

  复制代码

  我们拿到这几十个游戏名之后,接下来就是爬取这几十个游戏的语料库了。这时问题来了,我们要从哪个网站爬取这几十个游戏攻略,taptap?多玩?17173?分析了这些网站,发现这些网站只有一些文章热门游戏的语料库,一些冷门或者低热度的游戏,比如《灵魂芯片》、《奇迹》: Awakening”、“Death iscoming”等,在这些网站上很难找到大量的文章语料库,如图:

  我们可以发现,《奇迹:觉醒》和《灵魂碎片》的文章语料特别少,数量达不到我们的要求。那么有没有更通用的资源站,拥有极其丰富的文章语料库,可以满足我们的需求。

  其实静下心来想想,我们每天都在用这个资源站,那就是百度。我们在百度新闻上搜索了相关游戏,得到了搜索结果列表。这些列表的链接网页内容几乎都与搜索结果有很强的相关性,从而可以轻松解决数据源不足的问题。但是这时候又出现了一个新的问题,也是一个比较难解决的问题——如何爬取任意网页的文章的内容?

  因为不同的网站有不同的页面结构,我们无法预测会爬到哪些网站数据,也不可能为每个网站爬虫写一组数据,工作量是难以想象的!但我们不能简单粗暴地爬下页面中的所有单词。使用这样的语料库进行训练无疑是一场噩梦!

  与每个网站角力,查询资料和思考后,终于找到了一个更通用的解决方案。让我告诉你作者的想法。

  0x3 网站 的任何 文章 语料库爬取

  01|提取方法

  1)基于Dom树文本提取

  2)根据网页切分查找文本块

  3)基于标记窗口的文本提取

  4)基于数据挖掘或机器学习

  5)基于行块分布函数的文本提取

  02|萃取原理

  看到这些类型你是不是有点疑惑,它们是怎么提取出来的呢?让作者慢慢来。

  1)基于Dom树的文本提取:

  该方法主要是通过比较标准的HTML构建Dom树,然后base cabinet遍历Dom,比较识别各种非文本信息,包括广告、链接和非重要节点信息。非文字信息提取出来后,剩下的自然就是文字信息了。

  但是这种方法有两个问题

  ① 尤其依赖于HTML良好的结构。如果我们爬取一个不是按照 W3c 规范编写的网页,这种方法就不是很适合了。

  ②树的建立和遍历的时间复杂度和空间复杂度都很高,树的遍历方式也会因为HTML标签的不同而有不同的差异。

  2) 根据网页切分查找文本块:

  一种方法是在 HTML 标记中使用分隔线以及一些视觉信息(例如文本颜色、字体大小、文本信息等)。

  这种方法有一个问题:

  ①不同的网站HTML样式差别很大,没有办法统一分割,无法保证通用性。

  3) 基于标记窗口的文本提取:

  首先普及一个概念——标签窗口,我们将两个标签和其中收录的文本组合成一个标签窗口(如

  I am h1中的“I am h1”是标记窗口的内容),取出标记窗口的文本。

  该方法首先获取 文章 标题和 HTML 中的所有标记窗口,然后对其进行分词。然后计算标记窗口中标题序列和文本序列之间的单词距离L。如果 L 小于阈值,则标记窗口中的文本被认为是文本。

  这种方法虽然看起来不错,但实际上存在问题:

  ① 页面中的所有文字都需要切分,效率不高。

  ②词距的阈值难以确定,不同的文章阈值不同。

  4)基于数据挖掘或机器学习

  使用大数据进行训练,让机器提取正文。

  这种方法固然优秀,但是在训练之前需要html和body数据。我们不会在这里讨论它。

  5)基于行块分布函数的文本提取

  对于任何网页,它的正文和标签总是混合在一起的。该方法的核心有亮点:①文本区域的密度;②线块的长度;网页的文本区域一定是文本信息分布最密集的区域之一,而且这个区域可能是最大的(长评论信息、短文本),所以同时引入块长法官。

  实施思路:

  ①我们先去掉HTML标签,只留下所有的文字,去掉标签后留下所有空白的位置信息,我们称之为Ctext;

  ②对每个Ctext取周围的k行(k

  ③ 去除Cblock中所有的空白字符,文本的总长度称为Clen;

  ④ 以Ctext为横坐标,每行Clen为纵坐标,建立坐标系。

  从上图可以看出,正确的文本区域是分布函数图上所有收录最高值且连续的区域。该区域通常收录一个膨胀点和一个坍落点。因此,网页文本提取问题转化为线块分布函数上的两个边界点,膨胀点和下降点。这两个边界点所收录的区域收录当前网页的最大行块长度,并且是连续的。.

  经过大量实验,证明该方法对中文网页的文本提取具有较高的准确率。这种算法的优点是行块功能不依赖于HTML代码,与HTML标签无关。实现简单,准确率高。

  主要逻辑代码如下:

  1#假设内容是已经获取到的html

  2

  3# Ctext取周围的k行(k

  4blocksWidth = 3

  5#每个Cblock的长度

  6Ctext_len = []

  7#Ctext

  8lines = content.split('n')

  9#删除空格

  10for i in range(len(lines)):

  11 如果行[i] == ' ' 或行[i] == 'n':

  12 行 [i] = ''

  13#计算纵坐标,每个Ctext的长度

  14for i in range(0, len(lines) - blocksWidth):

  15 个字数 = 0

  16 for j in range(i, i + blocksWidth):

  17 行[j] = 行[j].replace("\s", "")

  18 wordsNum += len(lines[j])

  19 Ctext_len.append(wordsNum)

  20#开始标志

  21开始=-1

  22#结束标记

  23 结束 = -1

  24#是否开始打标

  25boolstart=假

  26#是否结束标记

  27布尔=假

  28#行块长度阈值

  29max_text_len = 88

  30# 文章主要内容

  31main_text = []

  32# Ctext 没有分段

  33if 长度(Ctext_len)

  34返回'没有身体'

  35for i in range(len(Ctext_len) - 3):

  36 # 如果高于这个阈值

  37 if(Ctext_len[i] > max_text_len and (not boolstart)):

  38 # Cblock下面三个不为0,认为是文本

  39 if (Ctext_len[i + 1] != 0 或 Ctext_len[i + 2] != 0 或 Ctext_len[i + 3] != 0):

  40 布尔启动 = 真

  41 开始 = 我

  42 继续

  43 如果(布尔启动):

  44 # 如果Cblock后面3个有0,则结束

  45 if (Ctext_len[i] == 0 或 Ctext_len[i + 1] == 0):

  46 结束 = 我

  47布尔=真

  48 tmp = []

  49

  50 # 判断下面是否有文字

  51 如果(布尔值):

  52 for ii in range(start, end + 1):

  53 if(len(行[ii])

  54 继续

  55 tmp.append(行[ii] + "n")

  56 str = "".join(列表(tmp))

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线