项目介绍
采用广度优先搜索方法获取一个网站上的所有外链。
首先,我们进入一个网页,获取网页的所有内链和外链,再分别进入内链中,获取该内链的所有内链和外链,直到访问完所有内链未知。
代码大纲
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).netloc
print(a)
print(b)
#-----------------输出结果---------------------#
https
image.baidu.com
请求头
Header来源 用浏览器打开需要访问的网页,按F12,点开network,再按提示按ctr+R,点击name选择网站名,再看到有一个右边框第一个headers,找到request headers,这个就是浏览器的请求头, 复制其中的user-agent,复制内容。
这里的请求头为: