来说一下怎么做网站地图sitemap链接地图链接链接
优采云 发布时间: 2021-08-18 22:19来说一下怎么做网站地图sitemap链接地图链接链接
前言
在之前的文章中,我们在一个网站上实现了一个从一个链接到另一个随机的链接,但是如果我们需要将整个网站按类别系统地分类,或者搜索@我们应该怎么做网站上的每一页?我们需要采集整个网站,但那是一个非常消耗内存的过程,尤其是在处理大的网站时,更合适的工具是使用数据库来存储采集资源,正如我之前所说的pass 我们来谈谈怎么做。
网站Mapsitemap
网站Map,也称为站点地图,是一个页面,里面有网站上所有需要搜索引擎抓取的页面的链接(注意:不是所有页面,一般都是文章链接,比如就像我的一样)。当大多数人在网站上找不到他们需要的信息时,他们可能会使用网站map作为补救措施。搜索引擎蜘蛛非常喜欢网站map。
对于 SEO,网站map 的好处:
1.为搜索引擎蜘蛛提供可以浏览整个网站的链接,简单反映了网站的整体框架,供搜索引擎查看;
2.为搜索引擎蜘蛛提供一些链接,指向动态页面或其他方式难以到达的页面;
3.作为潜在的着陆页,可以针对搜索流量进行优化;
4.如果访问者尝试访问网站所在域不存在的URL,访问者将被重定向到“找不到文件”的错误页面,网站map可以作为“准”此页面的内容。
数据采集
采集网站 数据不难,但爬虫需要有足够的深度。我们创建了一个递归遍历每个网站 的爬虫,只采集那些网站 页面上的数据。一般比较耗时的网站采集方法从首页开始(通常是网站home页),然后搜索页面上的所有链接形成一个列表,然后去采集的链接页面@到达,继续采集每个页面的链接组成一个新的列表,重复执行。
显然,这是一个非常复杂的过程。每个页面有10个链接,网站上有5个页面深度。如果采集全网站,则采集的网页总数为105,即10万页。
因为网站的内部链接很多都是重复的,为了避免采集的重复,必须链接去重。在 Python 中,最常用的去重方法是使用内置的集合集合方法。只有“新”链接是采集。看一下代码示例:
从 urllib.request 导入 urlopen
从 bs4 导入 BeautifulSoup
重新导入
页数 = set()
def getLinks(pageurl):
全球页面
html= urlopen("" + pageurl)
soup= BeautifulSoup(html)
soup.findAll("a", href=pile("^(/wiki/)")) 中的链接:
if'href' in link.attrs:
iflink.attrs['href'] 不在页面中:
#这是一个新页面
newPage= link.attrs['href']
打印(新页)
pages.add(newPage)
getLinks(newPage)
getLinks("")
原理说明:程序执行时,使用一个函数处理一个空的URL,其实就是维基百科的首页,然后遍历首页上的每个链接,检查是否已经在全局变量集合页面中,如果没有,打印出来添加到pages集合中,递归处理链接。
递归警告:Python 的默认递归限制是 1000 次。由于维基百科上的链接数量庞大,这个程序会在达到递归限制时停止。如果不想停止,可以设置递归计数器或其他方法。
采集全网站数据
为了有效地使用爬虫,我们在使用爬虫时需要在页面上做一些事情。让我们创建一个爬虫来采集页面标题、正文的第一段和编辑页面的链接(如果有)。
第一步,我们需要先观察网站上的页面,然后制定采集模式,通过F12查看元素(正常情况下)查看页面构成。
观察维基百科页面,包括条目和非术语页面,例如隐私政策页面,我们可以得出以下规则:
调整前面的代码,我们可以构建爬虫和数据采集的组合程序,代码如下:
从 urllib.request 导入 urlopen
从 bs4 导入 BeautifulSoup
重新导入
页数 = set()
def getLinks(pageUrl):
全局页面
html = urlopen("" + pageUrl)
soup = BeautifulSoup(html)
试试:
打印(soup.h1.get_text())
print(soup.find(id="mw-content-text").findAll("p")[0])
print(soup.find(id="ca-edit").find("span").find("a").attrs['href'])
属性错误除外:
print("页面缺少属性")
对于soup.findAll("a", href =pile("^(/wiki/)"))中的链接:
if'href' in link.attrs:
#这是一个新页面
newPage = link.attrs['href']
print("------------------\n"+newPage)
pages.add(newPage)
getLinks(newPage)
getLinks("")
这个for循环和原来的采集程序基本一样,因为不能确定每一页都有所有类型的数据,所以每条打印语句都是根据数据出现在页面上的可能性从高到低排列。
数据存储到 MySQL
我们之前获取过数据,直接打印出来。查看比较麻烦,那我们直接保存在MySQL中。在这里保存链接是没有意义的,所以我们将存储页面的标题和内容。之前有两篇文章已经介绍了如何将数据存储到MySQL,数据表是pages,这里直接上代码:
从 urllib.request 导入 urlopen
从 bs4 导入 BeautifulSoup
重新导入
导入日期时间
随机导入
导入pymysql
conn = pymysql.connect(host = '127.0.0.1',port = 3306, user ='root', passwd = '19930319', db ='wiki', charset =' utf8mb4')
cur = conn.cursor()
cur.execute("使用维基")
#随机数*敏*感*词*
random.seed(datetime.datetime.now())
#数据存储
定义存储(标题,内容):
cur.execute("INSERT INTO pages(title, content)VALUES(\"%s\", \"%s\")", (title, content))
mit()
def getLinks(articleUrl):
html = urlopen("" + articleUrl)
soup = BeautifulSoup(html)
title = soup.find("h1").get_text()
content =soup.find("div",{"id":"mw-content-text"}).find("p").get_text()
商店(标题,内容)
returnsoup.find("div",{"id":"bodyContent"}).findAll("a",href=pile("^(/wiki/)((?!:).)*$" ))
#设置第一页
links =getLinks("/wiki/Kevin_Bacon")
试试:
而 len(links)>0:
newArticle = links[random.randint(0, len(links)-1)].attrs['href']
打印(新文章)
links = getLinks(newArticle)
最后:
cur.close()
conn.close()
总结
今天主要讲在Python中遍历采集一个网站链接,方便后面的学习。
希望以上操作可以帮到大家。如果您有什么好的意见、建议或不同的看法,希望您留言与我们交流讨论。