在爬取网站的数据时,遇到数据通过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()