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

Posted 同福编程

tags:

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

1. 介绍

1.1 介绍

昨天我们明白了网页蜘蛛的工作原理,今天就可以开始根据这个原理进行代码的编写了。

2. Spider对象

首先,福哥先祭出Spider对象,这个对象就是网页蜘蛛这个对象的抽象类了。这个对象要实现网页蜘蛛的全部功能(当然仅仅是我们需要的功能),里面包含了建立爬取任务队列、爬取网页内容、分析网页内容、保存增量网页等等功能。

2.1 代码

这是Spider对象的代码(未完成),保存在 lib/Spider.py 里面,作为一个自定义的软件包使用。

import pymysqlfrom selenium import webdriverimport timeimport re
class Spider: mysqlCN = None mysqlCS = None chrome = None chromeOpts = webdriver.ChromeOptions() chromeOpts.add_argument("--headless") chromeOpts.add_argument("--disable-gpu") chromeOpts.add_argument("--no-sandbox") chrome = webdriver.Chrome(options=chromeOpts)
# open mysql def open(self): try: self.mysqlCN = pymysql.connect("192.168.1.168","tfse","abcdef") self.mysqlCS = self.mysqlCN.cursor() self.mysqlCN.select_db("tfse") except Exception as e: print e exit()
# get pending domains def getPendingDomains(self, nums): try: self.mysqlCS.execute("SELECT * FROM websites ORDER BY nextFetchDT ASC, lastFetchDT DESC LIMIT " + str(nums)) rows = self.mysqlCS.fetchall() return rows except Exception as e: print e self.mysqlCN.rollback()
return None
# fetch a domain URL def fetchDomainURL(self, domainName): # open page of domain url = "http://www." + domainName print ("打开网址:" + url) self.chrome.get(url)
# find all a tags links = self.chrome.find_elements_by_tag_name("a") for link in links: myHref = link.get_attribute("href") if self.isWebPage(myHref): self.saveWebPage(myHref) else: self.saveDomainPage(myHref)
def isWebPage(self, url, domainName):
def saveWebPage(self, url): print ("WebPage: " + url)
def saveDomainPage(self, url): print ("DomainPage: " + url)
# close def close(self): try: self.mysqlCS.close() self.mysqlCN.close() except Exception as e: print e exit()

2.2 调用

这里给出蜘蛛的主程序,主程序通过上面的Spider对象实现爬取网页的功能,保存在 Spider.py 里面。

from lib.Spider import *
mySpider = Spider()mySpider.open()domains = mySpider.getPendingDomains(10)for domain in domains: mySpider.fetchDomainURL(domain[1])
mySpider.close()

3. 讲解

下面福哥来讲解一下这个代码的逻辑,大家可以跟着福哥的思路一起读这段代码,了解其中的设计和功能。

3.1 主程序

主程序首先是通过from和import将Spider软件包里的对象导入进来了。

接着初始化Spider对象到mySpider变量里面。

通过Spider对象的open方法建立MySQL数据库的连接以及初始化工作。

使用Spider对象的getPendingDomains方法从MySQL数据库里查询出10个待处理的域名。

通过for循环对10个域名逐个进行单独的处理,使用Spider对象的fetchDomainURL方法对单独的一个域名进行爬取操作

最后使用Spider对象的close方法关闭MySQL数据库的连接。

3.2 Spider对象

接着福哥来对Spider对象的每个方法进行一个简单的介绍,大家可以了解一下。

3.2.1 open

这个方法里面对属性mysqlCN和mysqlCS进行了初始化,主要就是要建立MySQL数据库的连接和选择tfse数据库。

一般情况下,需要初始化的操作都会单独放到一个对象的方法里面进行处理。

3.2.2 getPendingDomains

这个方法里面通过查询tfse库的websites数据表得到了最前面的若干条网站域名信息。这里面有个小问题,就是如果我们后面不去更新nextFetchDT字段和lastFetchDT字段的值,则这个方法会始终返回相同的若干条网站域名信息了。所以,在后面我们一定要合理的设计如何去更新nextFetchDT和lastFetchDT字段的值来保证爬取的过程是雨露均沾的。

3.2.3 fetchDomainURL

这个方法是蜘蛛程序的关键了,在这个方法里面我们会尝试去访问一个网址(URL),然后分析这个网址的网页信息,并且会去提取更多的子级网址以备今后进行采集分析处理。

这个方法目前只是实现了采集网页的链接这个基础功能,后面我们会逐步对它进行完善。

3.2.4 isWebPage

这个方法福哥没有实现它,它的作用是判断采集到的链接是内部链接还是外部链接,如果是外部链接就意味着这会是另外的一个网站的网页了,我们就需要区别处理了。

3.2.5 saveWebPage

这个方法福哥也没有实现它,它的作用很容易理解,就是要把网页网址保存到webpages数据表里面。

3.2.6 saveDomainPage

这个方法福哥也没有实现它,它的作用也很容易理解,就是要把网址域名保存到websites数据表里面。

3.2.7 close

这个方法需要在全部逻辑执行完毕之后运行,它的作用就是关闭MySQL数据连接,释放资源。

3.3 输出

执行主程序会打印爬取网站后得到的域名信息

4. 总结

大家可以看出来福哥给出的这个Spider对象还很不完善,很多方法根本没有去实现它的逻辑。在这里福哥想告诉大家,编写代码就是这样一步一步的推进的,不会有那个程序员可以在一开始就设计好全部需要的对象和函数,进而一一实现它们,最后运行时候还没有任何问题一次通过的,都是需要在推荐的过程中一步一步的磨合才能完成的。

另外,福哥会保留一部分关键函数的实现的代码,这些就留给童鞋们自己动脑筋去实现了。还是那句话,完全的代码贴出来,会造成有些童鞋的惰性,直接复制粘贴过来,没有任何营养,这样是无法学好编程的。

5. P.S.









免费看文章,自己学技术




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







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

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

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

百度排名的规则

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

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

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