介绍

介绍

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

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

今天我们的目标就是:实现网页的爬取分析并将内容保存到webpages数据表当中;

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

Spider对象

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

属性

charsets

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

方法

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}

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

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)

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)

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

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

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

讲解

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

属性charsets

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

analyzePage

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

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

findAllATags

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

findDomainURL

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

findWebURL

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

isWebPage

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

saveWebPage

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

saveDomainPage

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

总结

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

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

P.S.

微信公众号的文章发出去之后是不能编辑的,但是福哥偶尔会修复一些描述不到位、示例不正确、结构不清晰等等的文章错误,这些只能在网站上才能看到最新版本内容,望大家知晓~~【20201011】做个搜索引擎(6)--网页蜘蛛代码编写(二) 第 1 页​m.tongfu.net

mysql web搜索系统_【20201011】做个搜索引擎(6)——网页蜘蛛代码编写(二)相关推荐

  1. 用python写搜索引擎_用python做一个搜索引擎(Pylucene)的实例代码

    1.什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信 ...

  2. 在哪里能收到python实例代码-用python做一个搜索引擎(Pylucene)的实例代码

    1.什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信 ...

  3. 基于MySQL的调度系统_仓储调度系统的设计与实现(SSH,MySQL)

    仓储调度系统的设计与实现(SSH,MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文14000字,程序代码,MySQL数据库) 仓储调度系统使用了目前主流的Struts框架模型, ...

  4. jsp mysql火车票预定系统_火车票网络订票售票系统的设计与实现(NetBeans,MySQL)

    火车票网络预订售票系统的设计与实现(NetBeans,MySQL)(任务书,开题报告,中期检查表,文献综述,毕业论文16000字,程序代码,MySQL数据库) 本文针对火车站的售票实际情况,按照软件工 ...

  5. jsp mysql 博客系统_个人博客系统的设计与实现(JSP,MySQL)

    个人博客系统的设计与实现(JSP,MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文15000字,程序代码,MySQL数据库) 本系统利用JSP开发技术,以MySQL作为后台数据 ...

  6. mysql设计预约系统_医院网上预约挂号系统的设计与实现(SSH,MySQL)

    医院网上预约挂号系统的设计与实现(SSH,MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文15000字,程序代码,MySQL数据库) 本系统基于广域网的B/S结构平台,具有生动 ...

  7. mysql校园购物系统_校园网上购物系统的设计与实现(SSH,MySQL)

    校园网上购物系统的设计与实现(SSH,MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文17000字,程序代码,MySQL数据库) 该校园网上购物系统以MVC分层思想为原则,使用 ...

  8. MySQL长途售票系统_基于SSH的长途汽车票务售票系统的设计(Struts2,MySQL)(含录像)...

    基于SSH的长途汽车票务售票系统的设计(Struts2,MySQL)(含录像)(毕业论文说明书14000字,程序代码,MySQL数据库)摘  要 随着科学技术的不断提高,计算机科学日渐成熟,其强大的功 ...

  9. MySQL长途售票系统_客车网上售票系统(Java源码+sql脚本)

    本实例为Java语言实现的客车网上售票系统, 系统提供了源码, 数据库脚本和相应的文档说明,文档经过修改可以做为论文使用,系统经过修改可以进行商用 点击右侧[下载实例]进行实例下载:下载实例​ 环境配 ...

最新文章

  1. 引入css的四种方式
  2. Flume Sinks官网剖析(博主推荐)
  3. Oracle闪回技术(笔记)
  4. java mvc返回js_Java的学习(39)springboot
  5. 分布式数字签名令牌TokenProvider
  6. Baseline管理
  7. 实现2个整形变量的交换
  8. Python机器学习:梯度下降法006随机梯度下降法
  9. Navicat 教程:排序、查找或替换记录
  10. PX4 vision_to_mavros定位
  11. MySQL 入门(三)—— MySQL数据类型
  12. Visio连接线相关问题
  13. 【IDE】Intellij IDEA启动正常,但是任务栏不显示图标
  14. 数字传感器:新兴的应用
  15. 西人应该骄傲,全国对不起山西
  16. 常用计算机视觉应用与简介,浅谈计算机视觉的应用与发展
  17. 微信公众平台开发接口配置URL index.php和token
  18. 搞定机械工程专业毕业设计选题推荐
  19. 关于透明、半透明winform的实现
  20. 思考与总结:社交获客

热门文章

  1. 90%的开发都不太考虑这个,但只要出问题直接公司完蛋!
  2. AWS回应Elastic修改开源协议:创建“真正”开源的Elasticsearch分支
  3. 开源模式反击之后,白嫖服务商竟然大叫“你不讲武德!”
  4. 判断一个数是不是2的指数幂
  5. c++ topk问题
  6. CheXNet 肺炎
  7. 10013: An attempt was made to access a socket in a way forbidden by its access permissions
  8. type torch.cuda.FloatTensor but found type torch.cuda.ByteTensor
  9. Can not get new positive sample
  10. java 写文件的三种方法比较