20201011做个搜索引擎——网页蜘蛛代码编写

Posted 同福编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20201011做个搜索引擎——网页蜘蛛代码编写相关的知识,希望对你有一定的参考价值。

1. 介绍

1.1 介绍

上一堂课福哥给大家展示了一个半成品的蜘蛛对象Spider,今天我们继续。

做事要有目标,并努力使之达成!

今天我们的目标就是:

  • 实现网页的爬取分析并将内容保存到webpages数据表当中;

  • 将提取出来的子级页面的超链接保存到webpages里面;

2. Spider对象

福哥对Spider对象的功能进行了完善,包括一些新的方法(函数)的定义和一些旧有的方法(函数)的改造,我们来一一把它们贴出来。

2.1 属性

2.1.1 charsets

charsets = {"utf-8":1, "gbk":2, "big5":3}

2.2 方法

2.2.1 analyzePage

 # analyze page def analyzePage(self, url): title = self.chrome.title keywords = "" description = "" charset = "" metas = self.chrome.find_elements_by_tag_name("meta") for meta in metas: myName = meta.get_attribute("name") myContent = meta.get_attribute("content") myHttpEquiv = meta.get_attribute("http-equiv") if myName == "keywords": keywords = myContent elif myName == "description": description = myContent elif myHttpEquiv is not None and myHttpEquiv.lower() == "content-type": charset = myContent
return {"url": url, "title": title, "keywords": keywords, "description": description, "charset": charset}

2.2.2 findAllATags

 # find all A tags def findAllATags(self, domainName): links = self.chrome.find_elements_by_tag_name("a") for link in links: myHref = link.get_attribute("href") myWebPageType = self.isWebPage(myHref, domainName) if myWebPageType == 1: ret = self.saveWebPage(myHref) print ret elif myWebPageType == 2: lnkRE = re.compile("^(http|https)\:\/\/([^\/]+)", re.M) mats = lnkRE.search(myHref) if mats: ret = self.saveDomainPage(mats.group(2)) print ret

2.2.3 findDomainURL

 # fetch a domain URL def fetchDomainURL(self, domainName): # open page of domain url = "http://" + domainName print ("打开网址:" + url) self.chrome.get(url)
# analyze TKD args = self.analyzePage(url) # find all A tags self.findAllATags(domainName)

2.2.4 findWebURL

 def fetchWebURL(self, domainName, url): # open page of url print ("打开网址:" + url) self.chrome.get(url)
# analyze TKD args = self.analyzePage(url) # find all A tags self.findAllATags(domainName)

2.2.5 isWebPage

 def isWebPage(self, url, domainName): lnkRE = re.compile("^(http|https)\:\/\/([^\/]+)", re.M) mats = lnkRE.search(url) if mats: if mats.group(2) == domainName:
return 1 # internal link else:
return 2 # external link
return 3 # none http URL

2.2.6 saveWebPage

 def saveWebPage(self, url): print url # try to insert url into webpages try: self.mysqlCS.execute("SELECT * FROM webpages WHERE url = %s", [url]) row = self.mysqlCS.fetchone() if row is None: self.mysqlCS.execute("INSERT INTO webpages (url, statusCode, charset, createDT) VALUES (%s, %s, %s, now())", [url, 200, 1]) self.mysqlCN.commit() #print ("保存网页: " + url)
return self.mysqlCS.lastrowid else:
return row[0] except Exception as e: print ("Fail to saveWebPage") print e exit()
return None

2.2.7 saveDomainPage

 def saveDomainPage(self, domainName): print domainName # try to insert url into webpages try: self.mysqlCS.execute("SELECT * FROM websites WHERE domainName = %s", [domainName]) row = self.mysqlCS.fetchone() if row is None: self.mysqlCS.execute("INSERT INTO websites (domainName, weight, createDT) VALUES (%s, %s, now())", [domainName, 1]) self.mysqlCN.commit() #print ("保存域名: " + domainName)
return self.mysqlCS.lastrowid else:
return row[0] except Exception as e: print ("Fail to saveDomainPage") print e exit()
return None

3. 讲解

今天更新的代码比较多,我们一点一点的介绍,大家要仔细听清楚了哦!

3.1 属性charsets

增加了一个属性charsets,是一个数据集合,用来将网页编码转换成整数的。

3.2 analyzePage

这个方法用来分析当前打开的页面的信息,将它们提取出来组合成一个数据集合返回给调用的代码使用。

提取的信息包括网页标题(title)、关键字(keywords)、描述(description)、编码(charset)等等信息,这些都是我们写入webpages数据表时候需要的数据。

3.3 findAllATags

这个方法昨天已经实现了,今天进行了一些调整,主要作用就是在当前打开的页面上扫描所有A标签(超链接),并根据超链接的href参数判断链接是内链(internal link)还是外链(external link),如果是内链直接保存到webpages数据表,如果是外链则保存网址的域名到websites数据表。

3.4 findDomainURL

这个方法昨天已经实现了,今天增加了analyzePage环节(暂时没有使用),且将findAllATags方法单独提出来了。

3.5 findWebURL

这个方法是个新方法,功能和findDomainURL方法类型,用来采集普通网页网址的。

3.6 isWebPage

这个方法有声明没有实现,今天福哥将它的业务逻辑实现了,作用就是判断URL里面的域名和传入的域名是否一致,一致就是内链,反之就是外链。

3.7 saveWebPage

这个方法有声明没有实现,今天福哥把它的功能写出来了,简单来说就是判断url是否在webpages数据表里,在了就直接取它的自增列的值,不在的话就先写入webpages数据表,再拿它的自增列的值。

3.8 saveDomainPage

这个方法也有声明也没有实现,今天福哥把它的功能完成了,简单来说就是判断domainName是否在websites数据表里,在了就直接取它的自增列的值,不在的话就先写入websites数据表,再拿它的自增列的值。

4. 总结

写逻辑是福哥最习惯的环节,比码汉字、截图要舒服多了!理科男基本都是和福哥一个类型的吧?我们喜欢逻辑思维,喜欢找规律,喜欢设计规则。写代码满足了我们的这个需求,做一个项目的过程就好像是建立一个系统,指定系统内的规则,有一种造物主的赶脚!

福哥一开始会将代码和设计思路都写出来供童鞋们参考,在后面福哥就会慢慢地逐渐减少现成的代码的提供量了,相对的功能的设计思路会更加详细,这还是为了帮助童鞋们自己开动脑筋去思考为目的!

5. P.S.










免费看文章,自己学技术




文章知识老旧?文章内容看不懂?文章不清晰?点击“阅读原文”查看最新内容







以上是关于20201011做个搜索引擎——网页蜘蛛代码编写的主要内容,如果未能解决你的问题,请参考以下文章

20201009做个搜索引擎——网页蜘蛛之工作原理

SEO禁用蜘蛛(爬虫)搜索收录网页(全)

百度排名的规则

搜索引擎原理SEO优化上首页之蜘蛛Spider

在搜索引擎领域,有哪些常用的网络爬虫?

SEO优化蜘蛛spider的抓取方式-专业SEO技术教程(11)