path语法我们可以在使用爬虫的时候,更准确地找到我们想找的页面元素,因此在使用爬虫时我们需要了解一下Xpath语法。
首先,这里有一个简单页面代码,然后我们使用Xpath语法来定位页面元素。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>XPath Practice Page</title>
</head>
<body>
<div id="content">
<h1>Welcome to XPath Practice</h1>
<ul class="fruits">
<li class="apple">Apple</li>
<li class="banana">Banana</li>
<li class="orange">Orange</li>
</ul>
<div id="details">
<p>Some details about the fruits:</p>
<ul>
<li class="info">Apples are rich in fiber.</li>
<li class="info">Bananas are a good source of potassium.</li>
<li class="info">Oranges are high in vitamin C.</li>
</ul>
</div>
</div>
</body>
</html>
nodename | 选取此节点的所有子节点 |
/ | 从根节点开始选取 |
// | 从当前匹配的节点开始选取 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
首先我们尝试寻找<h1>标签
from lxml import etree
if __name__=='__main__':
tree=etree.parse('test.html', etree.HTMLParser())
#e=tree.xpath('/html/body/div/h1') #从根节点开始一层一层找
#e=tree.xpath('/html//h1') #它找的则是根目录下所有的h1,即使有一个时子孙节点也能找到
print(e)
e=tree.xpath('/html//li') 它可以找到所有的<li>
#e=tree.xpath('//li') 同等效果
如果我们想要更加具体的获取到某一个li,我们可以使用’@‘
e=tree.xpath('/html//li[@class="apple"]') 定义到class属性为apple的节点
我们想要获取节点中的文本内容,可以使用text()
e=tree.xpath('/html//li[@class="apple"]/text()') #可以获取一个包含“Apple”的列表,可以使用索引
如果我们要获取id属性,比如第一个div标签的id属性值content
e=tree.xpath('//div')[0].xpath("@id")
家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!
高级前端?进阶
今天给大家带来的主题是盘点2023年全网最火的 markdown 解析器和编译器,话不多说,直接进入正题。
marked.js是markdown解析器和编译器,其具有以下明显优势:
在浏览器中可以通过如下方法使用:
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>Marked in the browser</title>
</head>
<body>
<div id="content"></div>
<script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script>
// 引入CDN
<script>
document.getElementById('content').innerHTML=marked.parse('# Marked in browser\n\nRendered by **marked**.');
</script>
</body>
</html>
如果是Node等服务端环境中需要先导入marked.js库才能使用:
import { marked } from 'marked';
// or const { marked }=require('marked');
const html=marked.parse('# Marked in Node.js\n\nRendered by **marked**.');
需要注意的是, Marked 不会清理输出的 HTML。 如果需要处理可能不安全的字符串,过滤可能的 XSS 攻击很重要。 一些过滤选项包括 DOMPurify(推荐)、js-xss、sanitize-html 和输出 HTML 上的 insane!
DOMPurify.sanitize(marked.parse(`<img src="x" onerror="alert('not happening')">`));
目前marked.js在Github上有超过29.5k的star、3.3k的fork、超过950k的项目依赖量,代码贡献者160+,是妥妥的前端明星项目。
markdown-it 是前端明星项目 Markdoc 的解析器, Markdoc 使用 markdown-it 作为标记器,从 markdown-it 输出的标记数组构建抽象语法树 (AST)。
Markdown-it 解析器的特性包括:
可以使用下面的示例快速使用 markdown-it:
// node.js经典方式
var MarkdownIt=require('markdown-it'),
md=new MarkdownIt();
var result=md.render('# markdown-it rulezz!');
// node.js的语法糖
var md=require('markdown-it')();
var result=md.render('# markdown-it rulezz!');
// 没有 AMD 的浏览器,在脚本加载时添加到 window
// 注意,“markdownit”中没有破折号。
var md=window.markdownit();
var result=md.render('# markdown-it rulezz!');
单行渲染,没有段落换行的情况下可以使用如下方式:
var md=require('markdown-it')();
var result=md.renderInline('__markdown-it__ rulezz!');
markdown-it 是贡献了 99% Remarkable 代码的作者,其决定转移到一个具有相同作者身份但有新领导的项目(Vitaly 和 Alex)的结果,不是对Remarkable的简单fork。
目前 Markdown-it 在 Github 上有 15.2k 的 star、1.6k 的 fork、433k 的项目依赖它,代码贡献者76+,妥妥的前端明星项目。
remarkable具有以下明显特点:
npm下载remarkable并导入代码后就可以直接使用,比如下面的代码示例:
import { Remarkable } from 'remarkable';
var md=new Remarkable();
console.log(md.render('# Remarkable rulezz!'));
//=> <h1>Remarkable rulezz!</h1>
默认情况下,remarkable的配置类似于 GFM,但禁用了 HTML。如果需要不同的设置,也很容易更改, 有两种定义选项的方法。第一种就是在构造函数中使用:
// Actual default values
var md=new Remarkable({
html: false, // Enable HTML tags in source
xhtmlOut: false, // Use '/' to close single tags (<br />)
breaks: false, // Convert '\n' in paragraphs into <br>
langPrefix: 'language-', // CSS language prefix for fenced blocks
// Enable some language-neutral replacement + quotes beautification
typographer: false,
// Double + single quotes replacement pairs, when typographer enabled,
// and smartquotes on. Set doubles to '??' for Russian, '?“' for German.
quotes: '“”‘’',
// Highlighter function. Should return escaped HTML,
// or '' if the source string is not changed
highlight: function (/*str, lang*/) { return ''; }
});
console.log(md.render('# Remarkable rulezz!'));
//=> <h1>Remarkable rulezz!</h1>
或者通过 .set() 方法定义选项:
import { Remarkable } from 'remarkable';
var md=new Remarkable();
md.set({
html: true,
breaks: true
});
目前 remarkable 在 Github 上有 5.5k 的 star、400+ 的 fork、49.9k 的项目依赖它,代码贡献者40+,是一个值得关注的前端项目。
Showdown 是一个 Javascript Markdown 到 HTML 转换器,基于 John Gruber 的原创作品。Showdown可以用于客户端(在浏览器中)或服务器端(使用 NodeJs)环境。
ShowdownJS 是一个永远免费的库。ShowdownJS v 2.0 在 MIT 版本下发布,而以前的版本是在 BSD 下发布的。
ShowdownJS已成功通过大多数浏览器的测试:
理论上,Showdown 可以在任何支持 ECMA 262 第三版 (JavaScript 1.5) 的浏览器中运行。 转换器本身甚至可以在非网络浏览器的环境中工作,例如 Acrobat。
Showdown 支持Current、Active和Maintenance阶段的 Node 版本。 目前包括 Node 12.x、14.x、16.x 和 17.x。
可以使用下面代码将Markdown转化为HTML:
var showdown=require('showdown'),
converter=new showdown.Converter(),
text='# hello, markdown!',
html=converter.makeHtml(text);
如果需要将HTML转化为Markdown也是可以的:
var showdown=require('showdown'),
converter=new showdown.Converter(),
html='<a href="https://patreon.com/showdownjs">Please Support us!</a>',
md=converter.makeMarkdown(text);
目前 Showdown 在 Github 上有 13.2k 的 star、1.6k+ 的 fork、55.2k 的项目依赖它,代码贡献者78+,是一个值得长期关注的前端明星项目。
CommonMark 是 Markdown 语法的版本,具有规范和 BSD 许可的 C 和 JavaScript 参考实现。有关详细信息,可以参阅 http://commonmark.org。
CommonMark 存储库包含了 JavaScript 参考实现,它提供了一个库,其中包含将 CommonMark 文档解析为抽象语法树 (AST)、操作 AST 以及将文档渲染为 HTML 或 AST 的 XML 表示的函数。
要在不安装该库的情况下使用它,请参阅 http://try.commonmark.org/ 上的实时 dingus。
commonmark.js 不像大多数转换器那样将 Markdown 直接转换为 HTML,而是将 Markdown 解析为 AST(抽象语法树),然后将此 AST 渲染为 HTML。 这开启了在解析和渲染之间操纵 AST 的可能性。 例如,可以将字母全部转换为大写。
下面是一个基本的用法示例:
var reader=new commonmark.Parser();
var writer=new commonmark.HtmlRenderer();
var parsed=reader.parse("Hello *world*"); // parsed is a 'Node' tree
// transform parsed if you like...
var result=writer.render(parsed); // result is a String
Parser 和 HtmlRenderer 的构造函数可以采用不同的可选项参数来进一步扩展能力,比如下面的smart和sourcepos,关于参数的具体含义可以进一步查看文末资料。
var reader=new commonmark.Parser({smart: true});
var writer=new commonmark.HtmlRenderer({sourcepos: true});
commonmark.js 性能非常好,与marked大致相当。 在转换一个 11 MB Markdown 文件的基准测试中,该文件是通过命令行工具 Scott Chacon 将 Pro Git 第一版的所有本地化的 Markdown 源串联起来构建的,commonmark 仅比 C 程序折扣慢一点, 比 PHP Markdown 快大约十倍,比 Python Markdown 快一百倍,比 Markdown.pl 快一千多倍。
以下是四个 JavaScript 库的一些重点基准测试(使用 2015 年 1 月 24 日可用的版本)。 他们测试了不同种类的 Markdown 文本的性能。 (这些样本中的大部分都取自 markdown-it 存储库。)结果显示了 ops/second(越高越好)与 showdown(通常是最慢的实现)的比率。 版本:showdown 1.3.0,marked 0.3.5,commonmark.js 0.22.1,markdown-it 5.0.2,node 5.3.0。 硬件:1.6GHz Intel Core i5,Mac OSX。
目前 commonmark.js 在 Github 上有 1.3k 的 star、230+ 的 fork、12.5k 的项目依赖它,代码贡献者40+,是一个值得长期关注的前端项目。
本文主要和大家盘点2023年全网最火的 markdown 解析器和编译器,如:marked.js、markdown-it 、remarkable等。因为篇幅原因,本文并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!
https://github.com/markedjs/marked
https://marked.js.org/
https://github.com/markdown-it/markdown-it
https://github.com/remarkjs/remark/tree/main
https://www.91temaichang.com/2023/03/18/the-marked-and-markdownit/
https://github.com/jonschlinkert/remarkable
https://github.com/commonmark/commonmark.js
https://github.com/showdownjs/showdown
https://www.npmjs.com/package/showdown
https://www.markdownguide.org/getting-started/
在互联网这个浩瀚的信息海洋里,数据如同珍珠般散落各处。爬虫 ,便是那寻珠的巧匠,它能自动化地探索、收集并整理这些宝贵的信息。本章将带领您深入了解Python爬虫的基础概念,从理论到实践,揭开网络数据采集的神秘面纱。
想象一下,当你在浏览器中输入网址并按下回车键时 ,幕后发生了一系列魔法般的交流——HTTP或HTTPS请求。爬虫正是模拟了这一过程,通过发送请求到服务器 ,并接收响应数据,从而获取网页内容。例如,使用Python的requests库可以轻松完成这一步骤。简言之 ,一个典型的请求包括了URL、HTTP方法(如GET或POST)、头信息等。
import requests
response=requests.get('https://example.com')
print(response.text)
网络爬虫的行动并非总是一帆风顺。网站为了保护资源和防止滥用,会设置各种反爬机制,如IP封禁、验证码验证、动态加载数据等。因此,制定合理的抓取策略至关重要,如设置合理的请求间隔、使用代理IP池、分析JavaScript渲染的内容等。同时,尊重网站的robots.txt规则,保持合法合规的抓取行为。
requests是Python中最受欢迎的HTTP库,以其简洁的API和强大的功能著称。通过它,您可以轻松发送HTTP请求 ,并处理响应数据。结合定制的头信息或POST数据,可以应对大多数网页的抓取需求。
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response=requests.get('http://example.com', headers=headers)
网页的结构由HTML构建 ,而BeautifulSoup则是Python中解析HTML的利器。它能够把复杂的HTML文档转换成一棵树形结构,让您能够以自然的方式查找、提取所需数据。结合requests ,提取信息变得轻而易举。
from bs4 import BeautifulSoup
soup=BeautifulSoup(response.text, 'html.parser')
title=soup.find('title').text
print(title)
通过上述内容 ,我们不仅了解了爬虫的基本原理 ,还掌握了利用Python进行网页数据获取与解析的核心技能。记住,技术虽强 ,但应始终秉持合法、道德的原则进行数据采集,让数据的力量为知识的海洋增添更多光彩。
要在项目中使用BeautifulSoup,首先确保您已安装Python环境。借助Python的包管理工具pip ,安装BeautifulSoup及其依赖库lxml或html5lib十分便捷。执行以下命令进行安装:
pip install beautifulsoup4
pip install lxml # 或者 html5lib
对于版本选择,通常推荐使用最新稳定版 ,以确保兼容性和性能。但在一些情况下,根据目标网站的HTML特性,可能需要指定某个版本以保证最佳解析效果。
导入BeautifulSoup后,需要配合一个解析器一起使用。下面是如何导入库并创建解析器的示例:
from bs4 import BeautifulSoup
# 假设已经有一个网页内容存储在变量html_content中
html_content="<html>...</html>"
# 使用lxml作为解析器
soup=BeautifulSoup(html_content, 'lxml')
# 或者使用html.parser内置解析器
soup=BeautifulSoup(html_content, 'html.parser')
HTML文档由一系列标签构成,每个标签代表页面上的一个结构或内容块。标签有开始标签(如 <div>)和结束标签(如 </div>) ,以及自闭合标签(如 <img />)。标签之间可能存在属性 ,如<a href="example.com">链接文本</a>中的href属性;标签内的文本称为文本节点。
BeautifulSoup支持CSS选择器和部分XPath语法来定位HTML元素。CSS选择器便于根据类名、ID、标签名等属性找到元素:
link_element=soup.select_one('a[href="example.com"]') # 使用CSS选择器选取第一个匹配的链接元素
XPath则是一种更强大的路径表达式语言,尽管BeautifulSoup对XPath的支持有限,但在一些场景下仍然可用。对于复杂的DOM查询,可考虑结合lxml库使用XPath。
BeautifulSoup将HTML文档转化为一棵可遍历的树状结构。您可以从根节点出发,逐层访问子节点:
for child in soup.children:
print(child)
查找特定元素可通过标签名、类名、ID等多种方式。比如 ,提取所有<p>标签下的文本内容:
paragraphs=soup.find_all('p')
for p in paragraphs:
text=p.get_text()
print(text)
除了获取元素文本内容,还可以提取元素的属性值:
image_elements=soup.find_all('img')
for img in image_elements:
src=img.get('src') # 获取图片src属性
alt_text=img.get('alt') # 获取图片alt属性
print(f'Source: {src}, Alt Text: {alt_text}')
以上内容详尽介绍了如何安装、引入BeautifulSoup,剖析了HTML文档结构,并展示了如何运用BeautifulSoup进行基本的HTML解析和元素操作。掌握这些技能,您就能更高效地从网页中抽取出所需信息。接下来 ,请继续深入学习如何解决实际爬虫项目中遇到的复杂场景及问题。
实战是检验真理的唯一标准,让我们从一个简单的网页数据抓取示例入手,逐步深入。
一切的开始 ,都是从获取网页数据开始。使用Python的requests库发送GET请求到指定URL,就像你轻轻敲开一扇信息的大门。
import requests
url='https://example.com'
response=requests.get(url)
# 确保请求成功
if response.status_code==200:
html_content=response.text
else:
print("请求失败 ,状态码:", response.status_code)
拿到网页的HTML内容后,下一步是使用BeautifulSoup解析这些内容,从中抽丝剥茧,提取你需要的数据。比如,提取页面标题:
from bs4 import BeautifulSoup
soup=BeautifulSoup(html_content, 'html.parser')
page_title=soup.find('title').text
print("页面标题:", page_title)
随着实战的深入,你会遇到更多挑战。接下来 ,我们探讨如何处理更复杂的网页结构。
现代网页常使用Ajax等技术动态加载数据 ,直接请求原始HTML可能看不到完整内容。这时,可以使用Selenium这样的工具模拟浏览器行为,执行JavaScript代码后再抓取。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options=Options()
chrome_options.add_argument('--headless') # 无界面模式
driver=webdriver.Chrome(options=chrome_options)
driver.get(url)
# 等待动态加载完成
driver.implicitly_wait(10) # 等待10秒,可根据实际情况调整
dynamic_html=driver.page_source
driver.quit()
soup=BeautifulSoup(dynamic_html, 'html.parser')
# 继续使用BeautifulSoup解析动态加载后的HTML
对于完全由JavaScript生成的页面,Selenium是好帮手,但它较重。若只想获取特定数据,可以分析Ajax请求,直接请求数据接口。
# 假设发现了一个Ajax请求URL
data_url='https://api.example.com/data'
response=requests.get(data_url)
json_data=response.json() # 假设返回的是JSON格式数据
print(json_data['key']) # 提取所需数据
掌握了这些技能,无论是静态还是动态网页,都能游刃有余地进行数据抓取与解析。实战中 ,记得遵守网站的robots.txt规则 ,尊重数据来源 ,合理合法地进行数据采集。继续探索,你会发现更多有趣且实用的技巧,让你在网络数据的海洋中更加自如。
构建一个完整的爬虫项目,我们需要规划一套有序的步骤。首先,定义目标网站和要抓取的数据点;其次,设计请求策略 ,包括模拟用户行为、处理cookies和session;然后,利用requests发起请求,获取HTML;接着 ,使用BeautifulSoup解析HTML结构 ,抽取所需数据;最后 ,组织和存储数据。下面是一个简化版的爬虫流程示例:
import requests
from bs4 import BeautifulSoup
import json
import time
# 目标网址列表
urls_to_crawl=['https://example1.com', 'https://example2.com']
# 请求函数封装
def fetch_and_parse(url):
response=requests.get(url)
if response.status_code==200:
soup=BeautifulSoup(response.text, 'html.parser')
# 解析数据逻辑
data=extract_data(soup)
return data
else:
raise Exception(f"请求失败,状态码:{response.status_code}")
# 数据抽取函数(具体逻辑依据实际网页结构编写)
def extract_data(soup):
# 示例:抽取所有的新闻标题
titles=[title.text for title in soup.find_all('h2', class_='news-title')]
return titles
# 主程序循环
results=[]
for url in urls_to_crawl:
try:
data=fetch_and_parse(url)
results.append(data)
time.sleep(2) # 遵循robots.txt规则,添加适当延时
except Exception as e:
print(f"处理{url}时出错:{e}")
# 存储结果至本地文件(这里仅作演示,实际可能存储到数据库或写入CSV文件)
with open('output.json', 'w') as f:
json.dump(results, f, indent=2)
面对大量网页或者有时间限制的任务时,异步请求或多线程技术能显著提升爬虫效率。Python中有多种异步库可供选择,如asyncio和aiohttp。下面是一个使用asyncio和aiohttp实现异步抓取的例子:
import asyncio
import aiohttp
from bs4 import BeautifulSoup
async def fetch(session, url):
async with session.get(url) as response:
if response.status==200:
text=await response.text()
soup=BeautifulSoup(text, 'html.parser')
data=extract_data(soup)
return data
else:
print(f"{url} 请求失败,状态码:{response.status}")
async def main(urls):
async with aiohttp.ClientSession() as session:
tasks=[fetch(session, url) for url in urls]
results=await asyncio.gather(*tasks)
return results
# 启动异步任务
loop=asyncio.get_event_loop()
results=loop.run_until_complete(main(urls_to_crawl))
# 后续处理与存储
# ...
爬虫过程中 ,正确保存和管理抓取的数据至关重要。常见的持久化方式包括数据库(如SQLite、MySQL、MongoDB等)和文件(如JSON、CSV、XML等)。此外,充分的异常处理能确保爬虫在遇到网络问题、数据格式异常等情况时仍能稳健运行。
# 数据持久化至SQLite数据库
import sqlite3
conn=sqlite3.connect('data.db')
c=conn.cursor()
c.execute('''CREATE TABLE IF NOT EXISTS articles
(title TEXT, link TEXT)''')
for result in results:
for title in result:
c.execute("INSERT INTO articles VALUES (?, ?)", (title, f"https://example.com/{title.replace(' ', '-')}) # 示例插入链接 ,实际需根据数据结构修改
conn.commit()
conn.close()
# 异常处理范例
try:
# 执行爬虫主程序
except requests.exceptions.RequestException as req_e:
print(f"网络请求异常:{req_e}")
except Exception as e:
print(f"未知异常:{e}")
通过整合requests和BeautifulSoup,我们可以构建出高效、稳定的爬虫程序 ,有效处理各种复杂情况,实现数据的精准抓取和妥善存储。在实践中不断优化爬虫策略,使其更加符合法律法规和道德规范 ,才能使我们的数据采集更具价值和意义。
在享受数据自由的同时,务必紧握法律的准绳。网络爬虫可能触碰的法律雷区主要包括侵犯版权、违反服务条款、侵犯个人隐私等。例如,未经允许抓取受版权保护的内容,或大规模爬取用户个人信息,都可能招致法律诉讼。因此,在启动爬虫之前 ,了解相关法律法规,如《计算机软件保护条例》、GDPR(欧盟通用数据保护条例)等,是每位数据采集者的必修课。
robots.txt是网站管理者告知爬虫哪些页面可以抓取、哪些禁止抓取的友好协议。遵循此协议 ,是体现爬虫行为合法性和尊重网站意愿的重要步骤。在Python中,使用requests库获取robots.txt文件,然后利用robotexclusionrulesparser库解析规则,可轻松实现合规访问:
from robotexclusionrulesparser import RobotExclusionRulesParser
import requests
url='https://example.com/robots.txt'
rsp=requests.get(url)
robots_txt=rsp.text
rules_parser=RobotExclusionRulesParser()
rules_parser.parse(robots_txt)
url_to_check='/path/to/check'
if rules_parser.is_allowed('*', url_to_check):
print("访问允许")
else:
print("访问禁止")
尊重隐私,是网络时代的黄金法则。在抓取数据时 ,应仔细阅读并遵守目标网站的隐私政策,避免触及个人敏感信息。特别是处理用户生成内容(UGC)时 ,确保不违反数据保护法,如匿名化处理数据、限制数据保留期限、提供数据主体权利(如删除权)。在存储和分享数据时,实施加密措施 ,确保信息安全无虞。
综上所述,合法合规的网络爬虫活动,要求我们在技术实践的同时,也要成为法律法规的忠实守护者。在数据的海洋里航行,既要乘风破浪,更要明辨航向,确保每一次数据之旅都是一次既富有成效又尊重规则的探索。
本文围绕Python解析HTML的核心技术展开,首先阐述了Python爬虫基础概念,涵盖HTTP/HTTPS请求原理与合法性考量,以及requests库实现网页获取和BeautifulSoup进行HTML解析的基本操作。随后,通过实战案例展示了如何从简单到复杂网页进行数据抓取与解析 ,强调了动态加载内容处理和JavaScript渲染页面解析的高级技巧。在第四章,我们构建了完整的爬虫工作流程 ,涉及异步请求与多线程加速以提高效率 ,并重点讨论了数据持久化与异常处理的重要性。
针对法律法规与道德规范,文章突出了遵循robots.txt协议和尊重隐私政策在数据抓取中的必要性。在总结与进阶部分,我们回顾了Python解析HTML过程中可能遇到的常见问题 ,并展望了诸如lxml、PyQuery等更强大解析工具的应用前景 ,以及进一步学习网络爬虫框架Scrapy等进阶方向。
总而言之,本文旨在帮助读者从入门到精通,通过Python解析HTML并搭建高效、合法且具有伦理意识的网络爬虫系统 ,为读者在海量网络数据的探索与挖掘道路上奠定坚实基础,提供了清晰的进阶路径。
关注不灵兔,Python学习不迷路,私信可进交流群~~~
*请认真填写需求信息,我们会在24小时内与您取得联系。