php抓取网页数据插入数据库(持续更新中IRIE系统设计与实现报告(组图))
优采云 发布时间: 2022-01-23 04:21php抓取网页数据插入数据库(持续更新中IRIE系统设计与实现报告(组图))
持续更新IR&IE系统设计与实施报告一、系统设计
“网络蜘蛛”从互联网抓取网页,将网页发送到“网页数据库”,从网页“提取URL”,将URL发送到“URL数据库”,“蜘蛛控制”获取URL网页,控制“网络蜘蛛”爬取其他页面,重复循环,直到所有页面都被爬完。
系统从“网页数据库”中获取文本信息,发送到“文本索引”模块进行索引,形成“索引数据库”。同时进行“链接信息提取”,将链接信息(包括锚文本、链接本身等信息)送入“链接数据库”,为“网页评分”提供依据。
“用户”向“查询服务器”提交查询请求,服务器在“索引数据库”中搜索相关网页,“网页评分”结合查询请求和链接信息来评估搜索的相关性结果。查询服务器”按相关性排序,提取关键词的内容摘要,整理最终页面返回给“用户”。
——万维网自动搜索引擎(技术报告)Johnny Deng 2006.12
图1-1是整个程序的架构图。
图 1-1 程序架构图
二、系统开发工具和平台
开发环境:
三、系统及其功能模块的实现1、网页爬取
简单地说,网络爬虫是一个苦力臭虫,它会嗅探 URL(链接)并爬取数千个网页,并将网页的内容移动到您的计算机上供您使用。
如图(这里有几张图):你给爬虫起始页A的url,它从起始页A开始,读取A的所有内容,从中找到3个url,指向页面B、C、D,然后依次沿着链接爬取页面B、C、D的内容,从中发现新的链接,然后继续沿着链接爬取到新的页面——>爬取内容—— > 分析链接 –> 爬到新页面...直到找不到新链接或满足人为停止条件。您可以继续对爬虫带回的网页内容进行分析和处理,以满足您的需求。
至于bug前进的方式,分为广度优先搜索(BFS)和深度优先搜索(DFS)。在这个图中,BFS的搜索顺序是ABCDEFGHI,深度优先搜索的顺序是ABEICFDGH。
我们使用 BFS 来抓取网页。直接使用python内置的type list来存储url地址。每次从一个页面获取所有链接url地址后,将其从待爬取队列的头部删除,并将所有获取到的链接合并到待爬取队列中。结尾。
网络爬取模块主要包括以下功能。
2、索引
索引就像图书馆每个书架上的一个小标志。如果你想找某本书,比如学习python语言的书,你先搜索“信息与计算机科”,再搜索“编程语言”,这样就可以在网上找到你要找的书了对应的货架。搜索引擎的索引与此类似,不同的是它会为所有网页的每个单词建立一个索引。当你输入一串搜索字符串时,程序会先进行分词,然后根据每个词的索引找到对应的词。网页。例如,在搜索框中输入“从前有座山,庙里有个小和尚”,搜索引擎会首先对字符串进行切分“
当然,这个实验中这个简单引擎的索引功能也很简单。通过分析网页的源代码,我们利用网页中元元素的内容来生成关键词。如图2-1所示:
图 2-1 页面中的关键字
关键字的内容比较简单。我们可以根据书名、作者、出版商、出版时间等信息进行图书搜索。
3、页面排名
这个以谷歌创始人拉里佩奇命名的算法可能是互联网上最著名的算法。当时,这个算法帮助谷歌在搜索质量上击败了当时最流行的雅虎、AltaVista等引擎。科技巨头做出了巨大贡献。
页面排名用于衡量网页的质量。索引找到的页面将使用pagerank算法计算PR值。这个分数在演讲结果的排名中会有一定的权重。得分高的页面会在最前面展示给用户。那么它是如何实现的呢?它是基于这样一个假设:链接到这个网页的网页越多,这个网页在全网的接受度就越高,也就是这个网页的质量越好——相当于所有其他的互联网上给它投票的网页,有一个指向它的链接,说明有人为它投票,票数越高越好。但是所有选票的权重都一样吗?明显不是。链接到这个页面本身的页面的PR值越高,它的投票权重就越大。就好像董事会投票给大股东的投票比小股东的投票更有分量。但有一个问题。要想知道一个页面的PR值,就需要知道链接到它的页面的PR值,而链接到它的页面的PR值需要依赖于其他页面的PR值。它变成了先有鸡还是先有蛋的问题。假设初始条件,互联网上所有页面的PR值初始值为1/N,N为全网页面总数,然后用公式迭代,其中p(j)表示链接到p(i)的网页,Lp(j)表示这个页面的链接数,用它除以页面链接数的原因很好理解。当一个页面有大量链接时,每个链接投票的权重会相应分配。可以证明,每一页i的值都是按照这个公式计算出来的,并且迭代。当迭代多轮时,PRp(i) 的值将趋于稳定值。在应用中,迭代次数一般为10次,10次以上。在此之后 PRp(i) 的值变化很小。
还有一个问题,如果一个页面没有任何外部页面链接到它,那么它的PR值是0吗?为了使 PRp(i) 函数更平滑,我们在公式中添加了阻尼系数 d。这里我们不妨取0.8,公式变成如下形式:
这样,即使一个页面是孤立存在的,它的PR值也不会变为零,而是一个很小的值。我们也可以从另一个角度来理解阻尼系数。PR 值实际上衡量了页面被访问的可能性。链接到它的页面越多,点击这些链接的可能性就越大。但是没有任何外部链接就不可能访问网页吗?当然不是,因为你也可以直接从地址框输入url来访问,而且有些人会想通过搜索引擎找到这个页面,所以我们在公式中加上一个阻尼系数,当然只能取这里的一维数字相对较小。
当然,网页的PR值并不是决定网页排名的唯一因素。页面与用户搜索词(查询)的相关程度也是一个重要的衡量标准。.
4、网页分析
网页提取模块从中提取关键词 和书籍信息。
页面上的信息非常复杂。我们使用xpath提取图书的作者、出版商等主要信息,如图2-2所示。
图 2-2 页簿信息
5、布尔模型
布尔检索法是指利用布尔运算符将每个检索词链接起来,然后在计算机上进行逻辑运算以找到所需信息的检索方法。
在这个程序的search()函数中,我们解析搜索词,判断它们之间的逻辑关系,给出搜索结果。
四、遇到的问题及解决方法1、 在网页解析过程中,获取标签中的完整文本出现问题。
因为一个div标签里面有很多倍的标签,直接用xpath路径通过text()获取文本是有问题的。通过查阅 xpath 手册,使用 string(.) 函数过滤掉标签。
2、 页面中的大量 URL 不是提供书籍信息的页面。
爬虫模块增加了url_valid(url)函数,判断url是否有效,使用正则表达式查找表单中的有效地址。
3、 网页的广度优先搜索实现,以及抓取次数的限制。
使用python的list类型存储url,每次爬取url,将新值存储在队列末尾to_crawl待爬取,爬取队列头部的url页面,然后使用pop()函数出队操作。
将抓取的 url 提供给抓取的列表。通过判断列表的长度来限制爬虫的爬取过程。
五、系统测试
简单测试,爬取页面数超过10个就停止爬虫。
1、索引结果
混入了一个奇怪的东西,可能是页面结构不一致造成的。
2、进行搜索
print 'ordered_search', ordered_search(index, ranks, u'杨绛')
print index[u'杨绛']
结果如下
打印列表的内容:
3、搜索作者可能会得到独特的结果。让我们再次搜索“used”以查看结果。
部分结果如图所示。
4、 同时搜索多个词的结果
结果如下:
六、改进
感谢北优的两位童鞋提供完成本次实验的机会
具体代码可以参考我的github-douban_book_search