Python爬取网页的所有内外链的代码

时间:2021-05-23

项目介绍

采用广度优先搜索方法获取一个网站上的所有外链。
首先,我们进入一个网页,获取网页的所有内链和外链,再分别进入内链中,获取该内链的所有内链和外链,直到访问完所有内链未知。

代码大纲

1、用class类定义一个队列,先进先出,队尾入队,队头出队;
2、定义四个函数,分别是爬取网页外链,爬取网页内链,进入内链的函数,以及调函数;
3、爬取百度图片(https://image.baidu.com/),先定义两个队列和两个数组,分别来存储内链和外链;程序开始时,先分别爬取当前网页的内链和外链,再分别入队,对内链外链进行判断,如果在数组中没有存在,这添加到数组中;
4、接着调用deepLinks()函数,采用循环结构,如果当前内链数量不为空时,则对存储内链的队列进行出队,并进入该内链中,再重复调用爬取网页内链和网页外链的函数,进行判断网页链接是否重复, 不重复的话,再分别将内链,外链加入到对应的队列中,不断迭代循环;
5、进入网页内所有的内链,从中搜索出所有的外链并且存储在队列中,再输出。

网站详情


代码详情

队列

队列是一种特殊的线性表,单向队列只能在一端插入数据(后),另一端删除数据(前);
它和栈一样,队列是一种操作受限制的线性表;
进行插入操作的称为队尾,进行删除操作的称为队头;
队列中的数据被称为元素;没有元素的队列称为空队列。

由于只能一端删除或者插入,所以只有最先进入队列的才能被删除,因此又被称为先进先出(FIFO—first in first out)线性表。
这里我们用class类定义一个队列,先进先出,队尾入队,队头出队,该队列要有定义以下功能:出队、入队、判断是否为空、输出队列长度、返回队头元素。

class Queue(object): #初始化队列 def __init__(self): self.items = [] #入队 def enqueue(self, item): self.items.append(item) #出队 def dequeue(self): if self.is_Empty(): print("当前队列为空!!") else: return self.items.pop(0) #判断是否为空 def is_Empty(self): return self.items == [] #队列长度 def size(self): return len(self.items) #返回队头元素,如果队列为空的话,返回None def front(self): if self.is_Empty(): print("当前队列为空!!") else: return self.items[len(self.items) - 1]

内链外链

内链外链的区别:
内链:是指同一网站域名下内容页面之间的互相链接。
外链:是指在别的网站导入自己网站的链接,如友情链接、外链的搭建等。
通俗的讲,内链即为带有相同域名的链接,而外链的域名则不相同。

说到内链外链,那必然离不开urllib库了,首先导入库

from urllib.parse import urlparse

用urlparse模块来解析url链接,urlparse()模块将url拆分为6部分:

scheme (协议)netloc (域名)path (路径)params (可选参数)query (连接键值对)fragment (特殊锚)url='https://image.baidu.com/'a, b = urlparse(url).scheme, urlparse(url).netlocprint(a)print(b)#-----------------输出结果---------------------#httpsimage.baidu.com

请求头

Header来源 用浏览器打开需要访问的网页,按F12,点开network,再按提示按ctr+R,点击name选择网站名,再看到有一个右边框第一个headers,找到request headers,这个就是浏览器的请求头, 复制其中的user-agent,复制内容。

这里的请求头为:

headers_={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36 Edg/89.0.774.68'}html = requests.get(url,headers=headers_)

完整代码

class Queue(object): #初始化队列 def __init__(self): self.items = [] #入队 def enqueue(self, item): self.items.append(item) #出队 def dequeue(self): if self.is_Empty(): print("当前队列为空!!") else: return self.items.pop(0) #判断是否为空 def is_Empty(self): return self.items == [] #队列长度 def size(self): return len(self.items) #返回队头元素,如果队列为空的话,返回None def front(self): if self.is_Empty(): print("当前队列为空!!") else: return self.items[len(self.items) - 1]#导入库from urllib.request import urlopenfrom urllib.parse import urlparsefrom bs4 import BeautifulSoupimport requestsimport reimport urllib.parseimport timeimport randomqueueInt = Queue() #存储内链的队列queueExt = Queue() #存储外链的队列externalLinks = []internalLinks = []#获取页面中所有外链的列表def getExterLinks(bs, exterurl): #找出所有以/search/faq_image.html%2305']

到此这篇关于Python爬取网页的所有内外链的文章就介绍到这了,更多相关Python爬取网页内外链内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章