【20201013】做个搜索引擎(7)网页蜘蛛代码编写(三)
gaoyangw 2024-11-05 10:30 16 浏览 0 评论
介绍
介绍
福哥更新了Spider对象,实现了爬取网页内容,分析网页数据,写入数据库这些功能。实现了这些功能之后网页蜘蛛的基本功能也就差不多完成了!后面就可以开始编写搜索引擎的前端UI功能了,相对网页蜘蛛来说,搜索引擎前端UI就比较简单了!
但是,网页蜘蛛是搜索引擎的基础,只有采集到足够多的数据,搜索引擎才可以在也会查询的时候返回用户想看到的结果内容。所以,今天这一课童鞋们一定要好好学习了!
增加字段
在前面设计数据表的时候出了一个纰漏,福哥没有在webpages数据表里建立与websites数据表的关联键,这样就无法在webpages里提取一个域名下的所有网页信息了。
新增字段
我们需要在webpages数据表里增加关联键字段websiteId用来关联websites数据表的主键字段。
SQL
SQL语句如下
mysql> alter table webpages add column websiteId int not null after webpageId, add key websiteId (websiteId);
Query OK, 0 rows affected (0.18 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql>
Spider对象
方法
getPendingPages
def getPendingPages(self, domainName, nums):
try:
self.mysqlCS.execute("SELECT * FROM websites WHERE domainName = %s", [domainName])
row = self.mysqlCS.fetchone()
if row is not None:
websiteId = row[0]
self.mysqlCS.execute("SELECT * FROM webpages WHERE websiteId = %s ORDER BY lastFetchDT DESC LIMIT %s", [websiteId, nums])
rows = self.mysqlCS.fetchall()
return rows
except Exception as e:
print ("Fail to getPendingPages")
print e
self.mysqlCN.rollback()
return None
analyzePage
def analyzePage(self, url):
title = self.chrome.title
keywords = ""
description = ""
charset = ""
pageSource = self.chrome.page_source
stRE = re.compile("<\/?[a-z0-9]+[^\>]*>", re.M | re.I)
scriptRE = re.compile("<(script).*?>[\s\S]*?<\/\1>", re.M | re.I)
bcRE = re.compile("[\s\t\r\n]+", re.M | re.I)
pageText = self.chrome.page_source.encode("gbk", "ignore")
pageText = re.sub(stRE, " ", pageText)
pageText = re.sub(scriptRE, " ", pageText)
pageText = re.sub(bcRE, " ", pageText)
pageText = pageText.decode("gbk")
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":
myCharset = myContent
csRE = re.compile("charset\=([^\;]+)", re.M | re.I)
mats = csRE.search(myCharset)
if mats:
charset=mats.group(1).lower()
return {"url": url, "title": title, "keywords": keywords, "description": description, "charset": charset, "pageText":pageText}
findAllATags
def findAllATags(self, websiteId, domainName):
links = self.chrome.find_elements_by_tag_name("a")
for link in links:
try:
myHref = link.get_attribute("href").encode("gbk")
myWebPageType = self.isWebPage(myHref, domainName)
if myWebPageType == 1:
ret = self.saveWebPage(websiteId, myHref)
elif myWebPageType == 2:
lnkRE = re.compile("^(http|https)\:\/\/([^\/]+)", re.M | re.I)
mats = lnkRE.search(myHref)
if mats:
ret = self.saveDomainPage(mats.group(2).lower())
except Exception as e:
doNothing = e
fetchDomainURL
def fetchDomainURL(self, websiteId, domainName):
# open page of domain
url = "http://" + domainName
print ("打开网址:" + url)
self.chrome.get(url)
# find all A tags
self.findAllATags(websiteId, domainName)
fetchWebURL
def fetchWebURL(self, websiteId, domainName, url):
# open page of url
print ("打开网址:" + url)
self.chrome.get(url)
# find all A tags
self.findAllATags(websiteId, domainName)
fetchDomainPageURL
def fetchDomainPageURL(self, websiteId, domainName, webpageId, url):
# open page of url
print ("打开网页: " + url)
self.chrome.get(url)
# analyze page
print ("分析网页: " + url)
args = self.analyzePage(url)
# save web page full data
self.updateWebPage(webpageId, args)
# find all A tags
self.findAllATags(websiteId, domainName)
saveWebPage
def saveWebPage(self, websiteId, 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 (websiteId, url, statusCode, charset, createDT) VALUES (%s, %s, %s, %s, now())", [websiteId, 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
return None
updateWebPage
def updateWebPage(self, webpageId, args):
try:
self.mysqlCS.execute("UPDATE webpages SET title = %s, keywords = %s, description = %s, lastFetchDT = now() WHERE webpageId = %s",
[args["title"], args["keywords"].encode("utf-8"), args["description"].encode("utf-8"), webpageId])
self.mysqlCN.commit()
print ("更新网页: " + args["url"])
return webpageId
except Exception as e:
print ("Failed to updateWebPage")
print e
return None
主程序
主程序代码也有所更新,除了之前进行的域名爬取处理之外,还增加了对域名下面的网页的爬取处理。
from lib.Spider import *
mySpider = Spider()
mySpider.open()
domains = mySpider.getPendingDomains(10)
if domains is not None:
for domain in domains:
mySpider.fetchDomainURL(domain[0], domain[1])
pages = mySpider.getPendingPages(domain[1], 100)
if pages is not None:
for page in pages:
mySpider.fetchDomainPageURL(domain[0], domain[1], page[0], page[2])
mySpider.close()
讲解
getPendingPages
通过域名获取到websites数据表的相关记录
通过websites.websiteId字段的值在webpages表里查询出指定数量的该域名所属的网页信息
analyzePage
使用正则表达式将meta信息里面的charset信息提取出来了
findAllATags
增加了websiteId参数,传递给saveWebPage方法
fetchDomainURL
增加了websiteId参数,传递给findAllATags方法
fetchWebURL
增加了websiteId参数,传递给findAllATags方法
fetchDomainPageURL
打开指定的url的网页
分析网页的信息,包括标题、关键字、描述等等信息
将网页的信息更新到webpages数据表里面
扫描网页的超链接,提取子级页面网址
saveWebPage
增加了websiteId参数,在写入webpages数据表的时候传递websiteId参数
updateWebPage
根据webpageId更新webpages数据表的相关字段的值
总结
我们的网页蜘蛛已经完成80%以上了,剩下的就是把网页的文字数据提取出来写入到数据库当中,同时将数据库当中的网页数据同步到ElasticSearch搜索引擎里面,采集的工作就算基本完成了!
下一节课,福哥将带着大家完成网页蜘蛛的最后一部分代码的编写,大家要好好学习哦~~
P.S.
微信公众号的文章发出去之后是不能编辑的,但是福哥偶尔会修复一些描述不到位、示例不正确、结构不清晰等等的文章错误,这些只能在网站上才能看到最新版本内容,望大家知晓~~
https://m.tongfu.net/home/35/blog/512811.html
相关推荐
- 庄氏建设构建精准获客的 “数字护城河”
-
在单仁牛商湖北牛商汇的扒皮会上,牛遇草同志提出的“5库建设”理论,为庄氏建设破解“流量获取难、客户信任弱”的行业痛点提供了落地路径。结合餐饮行业特性,我们正将这一理论转化为可执行的“五库联...
- 抖音关键词的搜索量「官方数据」查询办法详情(点击)
-
我们想做抖音,客户都是线下成交,线上线索收集。开户推广之前,我想了解我们行业在抖音上的月度搜索量如何?爬爬客小编本期内容直接给您安利上。...
- 一、账号定位与冷启动(0-1阶段)(什么叫做账号定位)
-
1.精准定位赛道选择:优先选择平台流量红利赛道(如抖音的「泛知识」「剧情号」,快手的「三农」「手工」),避开红海领域(如颜值、搞笑)。...
- 头条如何快速涨1000粉,听听DeepSeek怎么说
-
——全网首发,手把手教你避开“割韭菜”陷阱在信息爆炸的时代,今日头条创作者们既享受着流量红利,也面临着激烈的竞争。如何快速突破涨粉瓶颈?AI大模型DeepSeek的爆火,不仅掀起了技术革命,也为内容...
- 暖通EI陷阱!关键词排列术(陷阱致命的诱惑韩剧电影未删减版)
-
推荐EI会议:国际建筑环境与能源工程会议(ICBEEE2025),会议号CFP25HVAC截稿时间:2025年4月20日会议时间与地点:2025年8月15日-17日·新加坡论文集与检索:...
- 向AI电商领域进军,ChatGPT搜索上线购物推荐功能
-
据4月29日消息,当地时间周一(4月28日),人工智能公司OpenAI宣布正在更新网络搜索工具ChatGPTSearch,增加购物推荐功能,以改善用户的在线购物体验。根据功能介绍,当用户搜索产品时...
- 从“猫爷”爆火看抖音正能量:如何用内容撬动用户点赞与粘性?
-
一、开篇即“王炸”:用3秒法则抢占注意力“猫爷”的视频以#盘点系列#为核心,开场往往以极具冲击力的画面或金句抓住眼球——这正是抖音流量密码的底层逻辑。据研究,抖音用户平均停留时间仅1.7秒,因此前3秒...
- 警惕!当你刷到“打字兼职”,可能已踏入精心设计的骗局陷阱
-
警惕!当你刷到“打字兼职”,可能已踏入精心设计的骗局陷阱在网络飞速发展的时代,我们刷手机时,常常会被各类“高薪兼职”的广告吸引。其中,“打字兼职”“文章录入员”这类看似轻松又能赚钱的工作,就像一个个...
- 警惕!刷广告赚钱APP暗藏陷阱,这些真相你必须知道
-
最近,你的朋友圈是不是也被这样的广告刷屏了?“每天花10分钟刷广告,轻松日赚100元”,如此诱人的宣传语,让人忍不住心动。但先别急着行动,这看似轻松的赚钱方式,背后可能隐藏着巨大的风险!刷广告赚钱类A...
- 西安大雁塔售票窗口诚实提示:里面没啥。差点笑死在网友的评论区
-
友友们大家来啦!今天来和大家一起分享精彩话题老规矩先点赞再看文!...
- 仙女小仙女媒体又开始训龟了(小仙女1)
-
仙女小仙女媒体又开始训龟了你们发现没?这届媒体越来越会"训龟"了!我昨天随手搜了下"仙女"关键词,好家伙,全网通稿像复制粘贴似的——"小仙女创业三个月月入百...
- 展现知识产权司法保护成效,最高检发布典型案例
-
最高人民检察院日前发布9件检察机关知识产权保护典型案例,展现知识产权检察综合履职的工作成效。最高检经济犯罪检察厅(知识产权检察厅)副厅长刘太宗介绍,本次发布的典型案例涉及领域广泛、类型多样,涵盖先进制...
- 广弘控股:公司积极开拓直接触达消费者的创新销售模式
-
证券日报网讯广弘控股5月7日在互动平台回答投资者提问时表示,目前,公司在传统的批发及配送业务的基础上,积极开拓直接触达消费者的创新销售模式,先后开通弘品生活、广食臻味馆两大预制菜网络销售平台,实现了...
- 早起,阳光,好业绩:朋友圈营销的八种打开方式,客户主动找上门
-
一天之计在于晨,这话对销售也适用。朋友圈是个好地方,能展现你的状态,传递专业形象。想过吗?一条简单的早安,就能让客户主动联系你?专业的早安,比早安更有效文案一:“早安!新的一天,新开始,新机遇!继续...
- 普通人如何靠AI工具年赚10%(ai 工具)
-
普通人利用AI工具实现年收益10%的目标(假设初始本金10万元,年赚1万元),核心在于“低风险套利+自动化执行”...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- 网站建设 (107)
- 网站开发 (47)
- 网络推广哪个平台好 (47)
- 百度收录 (50)
- 搜索引擎排名优化 (49)
- 关键词优化工具 (51)
- 外贸网站建设 (56)
- seo整站优化吧 (50)
- 广州seo (47)
- 苏州网站建设 (59)
- 百度搜索推广 (61)
- 关键词优化公司 (51)
- 网页制作 (47)
- 广州网站建设 (48)
- 电商网站建设 (49)
- 百度站长平台 (48)
- 网站模板 (51)
- 厦门网站建设 (52)
- 百度快照推广 (51)
- 免费网页在线客服系统 (53)
- 雷神代刷网站推广 (53)
- 长尾关键词 (47)
- 手机网站建设 (53)
- 网站维护 (53)
- 网页制作教程 (66)