在爬取网站的数据时,遇到数据通过iframe脚本加载,如何抓取到此数据。可以通过以下方法抓取在iframe中加载的数据:

1.查看iframe的src属性,获取到它指向的页面地址。
2,使用Selenium模块打开此地址,然后查找iframe元素并切换到iframe上下文中,再次使用Selenium模块查找相应的数据元素,并利用xpath等方式进行解析。

而此代码针对第一种方式进行讲解。
首先需要导入一些库,可以自行搜索如何导入:

import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
from urllib.parse import urljoin
import re

get_page函数用于下载指定URL的网页内容,并返回其HTML代码。
在这个函数中,我们使用requests库向指定URL发送HTTP请求,通过判断响应状态码是否为200来检查是否成功获取到了网页。

def get_page(url):
    headers = {'User-Agent': UserAgent().random}
    resp = requests.get(url, headers=headers)
    if resp.status_code == 200:
        resp.encoding = resp.apparent_encoding
        return resp.text
    else:
        return None

get_links函数用于从网页HTML代码中提取所有iframe标签的src属性值,并将它们拼接成完整的URL链接。 在这里,我们使用BeautifulSoup库解析HTML代码,然后从中查找所有iframe标签,使用get方法获取每个标签的src属性值,并将其与原始页面URL拼接为完整的链接,最后返回所有链接列表。

def get_links(page_url, soup):
    links = []
    iframe_tags = soup.find_all('iframe')
    for iframe_tag in iframe_tags:
        link = iframe_tag.get('src', '')
        if link:
            full_url = urljoin(page_url, link)
            links.append(full_url)
    return links

get_beianhao函数用于从给定的URL链接中获取备案号信息。
在这里,我们首先调用get_page方法获取给定URL对应的HTML代码,
然后使用正则表达式从HTML代码中查找备案号信息.
这个为想获取一个网站的备案号写的,如果想找别的,直接修改正则表达式即可

def get_beianhao(url):
    headers = {'User-Agent': UserAgent().random}
    html = get_page(url)
    if html:
        try:
            compile_rule = re.compile(r'(ICP证[\d]+|[\u4e00-\u9fa5]?ICP备[\d]+)', re.I)
            beianhao = re.findall(compile_rule, html)[0]
            return beianhao
        except IndexError:
            pass
    else:
        print(f"获取网页 {url} 失败")

main函数是程序的主要逻辑,它首先使用get_page函数获取起始页面HTML代码, 然后使用get_links函数从起始页面中提取所有的iframe链接,并依次使用get_beianhao函数获取每个链接中的(通过正则表达式想获取)信息, 最后输出可找到此iframe的链接及其对应的(通过正则表达式想获取)信息。如果无法获取或者获取网页失败,会在控制台输出提示信息。

def main():
    start_url = 'http://www.hngy.gov.cn/'
    html = get_page(start_url)
    if html:
        soup = BeautifulSoup(html, 'lxml')
        links = get_links(start_url, soup)
        for link in links:
            beianhao = get_beianhao(link)
            if beianhao:
                cleared_str = link.replace(start_url, "")
                print(f"ICP备案链接: {cleared_str} 其备案号为: {beianhao}")
            else:
                pass
    else:
        print(f"获取网页 {start_url} 失败")

最后看完整代码:

import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
from urllib.parse import urljoin
import re
#get_page函数用于下载指定URL的网页内容,并返回其HTML代码。
# 在这个函数中,我们使用requests库向指定URL发送HTTP请求,通过判断响应状态码是否为200来检查是否成功获取到了网页。
def get_page(url):
    headers = {'User-Agent': UserAgent().random}
    resp = requests.get(url, headers=headers)
    if resp.status_code == 200:
        resp.encoding = resp.apparent_encoding
        return resp.text
    else:
        return None
# get_links函数用于从网页HTML代码中提取所有iframe标签的src属性值,并将它们拼接成完整的URL链接。
# 在这里,我们使用BeautifulSoup库解析HTML代码,然后从中查找所有iframe标签,使用get方法获取每个标签的src属性值,
# 并将其与原始页面URL拼接为完整的链接,最后返回所有链接列表。

def get_links(page_url, soup):
    links = []
    iframe_tags = soup.find_all('iframe')
    for iframe_tag in iframe_tags:
        link = iframe_tag.get('src', '')
        if link:
            full_url = urljoin(page_url, link)
            links.append(full_url)
    return links
# get_beianhao函数用于从给定的URL链接中获取信息。
# 在这里,我们首先调用get_page方法获取给定URL对应的HTML代码,
# 然后使用正则表达式从HTML代码中查找信息.
def get_beianhao(url):
    headers = {'User-Agent': UserAgent().random}
    html = get_page(url)
    if html:
        try:
            compile_rule = re.compile(r'(ICP证[\d]+|[\u4e00-\u9fa5]?ICP备[\d]+)', re.I)
            beianhao = re.findall(compile_rule, html)[0]
            return beianhao
        except IndexError:
            pass
    else:
        print(f"获取网页 {url} 失败")
# main函数是程序的主要逻辑,它首先使用get_page函数获取起始页面HTML代码,
# 然后使用get_links函数从起始页面中提取所有的iframe链接,并依次使用get_beianhao函数获取每个链接中的备案号信息,
# 最后输出可找到备案号的链接及其对应的备案号信息。如果无法获取备案号或者获取网页失败,会在控制台输出提示信息。
def main():
    start_url = ' '#输入自己想爬取的url
    html = get_page(start_url)
    if html:
        soup = BeautifulSoup(html, 'lxml')
        links = get_links(start_url, soup)
        for link in links:
            beianhao = get_beianhao(link)
            if beianhao:
                cleared_str = link.replace(start_url, "")
                print(f"链接: {cleared_str} 其内容为: {beianhao}")
            else:
                pass
    else:
        print(f"获取网页 {start_url} 失败")
if __name__ == '__main__':
    main()