首页 » 产品日记 » 正文

python抓取网站所有URL地址

背景说明:最近在做一个网站推广的项目,想获取这个网站的所有url地址,生成一个网站地图,就拿python练练手。

思路:爬网站所有url,也就是获取网页-》分析网页-》提取所有a标签-》最终获取url,再将获取的url作为源信息来查找新的url。

从网页中提取a标签属性值最快的方法有两个,一个是正则,一个用CSS选择器。
BeautifulSoup非常适合干这个事

import requests
from bs4 import BeautifulSoup

site = "https://www.tianshengdiyi.cn"

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                         'Chrome/60.0.3112.78 Safari/537.36'}


# 第一次遍历首页所有url
def get_url_lists(site_url):
    urla = []
    global headers
    rs = requests.get(site_url, headers=headers)
    soup = BeautifulSoup(rs.text, 'html.parser')
    url_list = soup.select('a')
    for i in url_list:
        if i.has_attr("href"):
            # 只输出带有href属性的a标签url
            if "javascript:" in i["href"]:
                continue
            urla.append(site + i["href"])

    urlb = set(urla)
    # 将列表转换成set集合来实现去重

    # return len(urlb), urlb
    return urlb


def get_sub_url(urlb):
    sub_url = []
    for i in urlb:
        sub_url += list(get_url_lists(i))
    # 把刚抓到的url列表并入新的列表
    sub_url = set(sub_url)
    return len(sub_url), sub_url

print(get_sub_url(get_url_lists(site)))

后面就根据网站地图(sitemap.xml)格式去输出就行了,此处略。
有几个需要注意的是,网页a标签中存在空属性的,也有javascript的,还有#的,这些是需要过滤掉的,不然requests会报错。
写完之后发现还可以优化,优化的点有两个:1、采集的深度;2、采用递归。以后有时间再弄吧。

发表评论