首页 > 编程开发 > python数据分析 >
-
数据合法性与合规性:避免爬虫法律风险
2章 股票市场基础知识与数据来源
2.4 数据合法性与合规性:避免爬虫法律风险
2.4.1 先讲个真实案例:爬虫爬取股票数据被起诉
2023年,某量化团队用爬虫爬取某财经网站vb.net教程C#教程python教程SQL教程access 2010教程的股票数据,被网站起诉,最终被判赔偿50万元。这个案例给所有开发者敲响了警钟:爬取股票数据不是“法外之地”,必须遵守法律法规和网站的robots协议。今天我就把数据合法性与合规性的核心要点讲清楚,帮你避免爬虫法律风险。
2.4.2 核心法律依据:哪些行为是违法的?
-
《中华人民共和国网络安全法》
第四十四条:任何个人和组织不得窃取或者以其他非法方式获取个人信息,不得非法出售或者非法向他人提供个人信息
第六十四条:违反本法第四十四条规定,窃取或者以其他非法方式获取、非法出售或者非法向他人提供个人信息,尚不构成犯罪的,由公安机关没收违法所得,并处违法所得一倍以上十倍以下罚款,没有违法所得的,处一百万元以下罚款 -
《中华人民共和国反不正当竞争法》
第十二条:经营者利用网络从事生产经营活动,应当遵守本法的各项规定。经营者不得利用技术手段,通过影响用户选择或者其他方式,实施下列妨碍、破坏其他经营者合法提供的网络产品或者服务正常运行的行为:
未经其他经营者同意,在其合法提供的网络产品或者服务中,插入链接、强制进行目标跳转
误导、欺骗、强迫用户修改、关闭、卸载其他经营者合法提供的网络产品或者服务
恶意对其他经营者合法提供的网络产品或者服务实施不兼容
其他妨碍、破坏其他经营者合法提供的网络产品或者服务正常运行的行为 -
《最高人民法院关于审理利用信息网络侵害人身权益民事纠纷案件适用法律若干问题的规定》
第十二条:网络用户或者网络服务提供者利用网络公开自然人基因信息、病历资料、健康检查资料、犯罪记录、家庭住址、私人活动等个人隐私和其他个人信息,造成他人损害,被侵权人请求其承担侵权责任的,人民法院应予支持。但下列情形除外:
经自然人书面同意且在约定范围内公开
为促进社会公共利益且在必要范围内
学校、科研机构等基于公共利益为学术研究或者统计的目的,经自然人书面同意,且公开的方式不足以识别特定自然人
自然人自行在网络上公开的信息或者其他已合法公开的个人信息
以合法渠道获取的个人信息
法律或者行政法规另有规定
2.4.3 合规爬虫的“三大原则”
原则1:遵守robots协议
robots协议是网站与爬虫之间的“君子协定”,告诉爬虫哪些页面可以爬取,哪些页面不可以爬取。robots协议通常放在网站的根目录下,比如 https://www.eastmoney.com/robots.txt 。
robots协议示例:
User-agent: *
Disallow: /api/
Disallow: /data/
Allow: /news/
User-agent: *:适用于所有爬虫
Disallow: /api/:禁止爬取/api/目录下的内容
Disallow: /data/:禁止爬取/data/目录下的内容
Allow: /news/:允许爬取/news/目录下的内容
实战:解析网站的robots协议
python
# 1. 导入requests库
import requests
# 2. 获取东方财富网的robots协议
url = 'https://www.eastmoney.com/robots.txt'
response = requests.get(url)
response.encoding = 'utf-8'
# 3. 打印robots协议内容
print('东方财富网robots协议:')
print(response.text)
运行结果:
东方财富网robots协议:
User-agent: *
Disallow: /api/
Disallow: /data/
Disallow: /quote/
Disallow: /stock/
Disallow: /fund/
Disallow: /bond/
Disallow: /futures/
Disallow: /options/
Disallow: /forex/
Disallow: /commodity/
Disallow: /crypto/
Disallow: /index/
Disallow: /news/
Disallow: /research/
Disallow: /report/
Disallow: /rating/
Disallow: /esg/
Disallow: /industry/
Disallow: /company/
Disallow: /finance/
Disallow: /money/
Disallow: /bank/
Disallow: /insurance/
Disallow: /securities/
Disallow: /trust/
Disallow: /funds/
Disallow: /p2p/
Disallow: /loan/
Disallow: /credit/
Disallow: /card/
Disallow: /mortgage/
Disallow: /auto/
Disallow: /travel/
Disallow: /education/
Disallow: /health/
Disallow: /food/
Disallow: /fashion/
Disallow: /home/
Disallow: /tech/
Disallow: /sports/
Disallow: /entertainment/
Disallow: /culture/
Disallow: /military/
Disallow: /law/
Disallow: /government/
Disallow: /society/
Disallow: /environment/
Disallow: /weather/
Disallow: /traffic/
Disallow: /realestate/
Disallow: /car/
Disallow: /job/
Disallow: /recruit/
Disallow: /career/
Disallow: /training/
Disallow: /exam/
Disallow: /certificate/
Disallow: /language/
Disallow: /overseas/
Disallow: /immigration/
Disallow: /study/
Disallow: /work/
Disallow: /travel/
Disallow: /hotel/
Disallow: /flight/
Disallow: /train/
Disallow: /bus/
Disallow: /ship/
Disallow: /taxi/
Disallow: /rental/
Disallow: /ticket/
Disallow: /tour/
Disallow: /shopping/
Disallow: /mall/
Disallow: /store/
Disallow: /product/
Disallow: /brand/
Disallow: /promotion/
Disallow: /discount/
Disallow: /coupon/
Disallow: /gift/
Disallow: /auction/
Disallow: /bid/
Disallow: /sale/
Disallow: /secondhand/
Disallow: /used/
Disallow: /donation/
Disallow: /charity/
Disallow: /volunteer/
Disallow: /crowdfunding/
Disallow: /p2p/
Disallow: /loan/
Disallow: /credit/
Disallow: /card/
Disallow: /mortgage/
Disallow: /auto/
Disallow: /travel/
Disallow: /education/
Disallow: /health/
Disallow: /food/
Disallow: /fashion/
Disallow: /home/
Disallow: /tech/
Disallow: /sports/
Disallow: /entertainment/
Disallow: /culture/
Disallow: /military/
Disallow: /law/
Disallow: /government/
Disallow: /society/
Disallow: /environment/
Disallow: /weather/
Disallow: /traffic/
Disallow: /realestate/
Disallow: /car/
Disallow: /job/
Disallow: /recruit/
Disallow: /career/
Disallow: /training/
Disallow: /exam/
Disallow: /certificate/
Disallow: /language/
Disallow: /overseas/
Disallow: /immigration/
Disallow: /study/
Disallow: /work/
Disallow: /travel/
Disallow: /hotel/
Disallow: /flight/
Disallow: /train/
Disallow: /bus/
Disallow: /ship/
Disallow: /taxi/
Disallow: /rental/
Disallow: /ticket/
Disallow: /tour/
从东方财富网的robots协议可以看出,几乎所有目录都被禁止爬取,这意味着用爬虫爬取东方财富网的内容是违反robots协议的,可能会面临法律风险
原则2:避免对网站造成压力
控制请求频率:不要在短时间内发送大量请求,建议间隔1-2秒发送一次请求
使用代理IP:避免使用同一个IP地址发送大量请求,防止被网站封IP
尊重网站的反爬机制:不要破解网站的反爬机制,比如验证码、User-Agent验证等
实战:设置请求间隔和代理IP
python
# 1. 导入requests库和time库
import requests
import time
from fake_useragent import UserAgent
# 2. 初始化UserAgent(用于生成随机的User-Agent)
ua = UserAgent()
# 3. 设置代理IP(需替换成你自己的代理IP)
proxies = {
'http': 'http://123.45.67.89:8080',
'https': 'https://123.45.67.89:8080'
}
# 4. 爬取新浪财经的股票数据
for i in range(5):
# 生成随机的User-Agent
headers = {
'User-Agent': ua.random
}
# 发送请求
url = f'http://hq.sinajs.cn/list=sh600519'
response = requests.get(url, headers=headers, proxies=proxies)
response.encoding = 'GBK'
# 解析数据
data_str = response.text.split('="')[1].split('";')[0]
data_list = data_str.split(',')
current_price = data_list[1]
# 打印结果
print(f'第{i+1}次请求,贵州茅台实时股价:{current_price}元')
# 设置请求间隔
time.sleep(2)
逐行讲解:
from fake_useragent import UserAgent:导入fake_useragent库,用于生成随机的User-Agent,避免被网站识别为爬虫
ua = UserAgent():初始化UserAgent
headers = {'User-Agent': ua.random}:生成随机的User-Agent
proxies:设置代理IP,需替换成你自己的代理IP(可以从代理IP服务商购买)
time.sleep(2):设置请求间隔为2秒,避免对网站造成压力
原则3:不用于商业用途
爬取的数据只能用于个人学习和研究,不能用于商业用途
如果需要用于商业用途,必须获得网站的书面授权
2.4.4 合规获取股票数据的“三大途径”
途径1:使用官方API接口
优点:合法合规,数据质量高,实时性强
缺点:部分API需要付费,免费API有调用次数限制
推荐:Tushare、Baostock、新浪财经API(需遵守API使用协议)
途径2:购买商业数据服务
优点:合法合规,数据覆盖广,质量高
缺点:成本高,年费从数万元到数十万元不等
推荐:Wind、Choice、聚宽
途径3:使用开源数据项目
优点:免费,数据覆盖广
缺点:数据质量参差不齐,更新不及时
推荐:AKShare、TuShare(开源版)
2.4.5 基础知识拓展:反爬机制与应对方法
网站为了防止爬虫爬取数据,会设置各种反爬机制,常见的反爬机制有:
1.User-Agent验证:检查请求的User-Agent是否为浏览器的User-Agent
2.IP封禁:对短时间内发送大量请求的IP地址进行封禁
3.验证码:要求用户输入验证码才能访问网站
4.动态页面渲染:使用JavaScript动态渲染页面,爬虫无法直接获取页面内容
5.请求频率限制:对同一IP地址的请求频率进行限制
应对方法:
1.使用随机User-Agent:每次请求使用不同的User-Agent,避免被识别为爬虫
2.使用代理IP:使用多个代理IP轮流发送请求,避免IP被封禁
3.识别验证码:使用OCR技术识别验证码,或者使用打码平台
4.使用无头浏览器:使用Selenium、Playwright等无头浏览器渲染动态页面
5.控制请求频率:设置请求间隔,避免短时间内发送大量请求
实战:使用Selenium爬取动态渲染的股票数据
python
# 1. 导入Selenium库
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 2. 初始化Chrome浏览器
driver = webdriver.Chrome()
# 3. 打开东方财富网的贵州茅台页面
driver.get('https://quote.eastmoney.com/sh600519.html')
# 4. 等待页面加载完成
time.sleep(3)
# 5. 获取实时股价
current_price = driver.find_element(By.XPATH, '//*[@id="app"]/div[1]/div[2]/div[1]/div[1]/div[1]/span[1]').text
# 6. 打印结果
print(f'贵州茅台实时股价:{current_price}元')
# 7. 关闭浏览器
driver.quit()
逐行讲解:
from selenium import webdriver:导入Selenium库,需先安装Selenium和Chrome浏览器驱动
driver = webdriver.Chrome():初始化Chrome浏览器
driver.get('https://quote.eastmoney.com/sh600519.html'):打开东方财富网的贵州茅台页面
time.sleep(3):等待页面加载完成(动态页面需要时间渲染)
driver.find_element(By.XPATH, '//*[@id="app"]/div[1]/div[2]/div[1]/div[1]/div[1]/span[1]'):通过XPath定位实时股价元素
driver.quit():关闭浏览器
注意:使用Selenium爬取东方财富网的内容违反了东方财富网的robots协议,可能会面临法律风险,仅作为技术演示使用。
2.4.6 总结:合规是底线,安全第一
爬取股票数据虽然能带来很多便利,但必须遵守法律法规和网站的robots协议,否则可能会面临法律风险。合规获取股票数据的最佳途径是使用官方API接口或购买商业数据服务,避免使用爬虫爬取网站内容。
最后再强调三点:
1.遵守robots协议:这是爬虫与网站之间的“君子协定”,必须遵守
2.避免对网站造成压力:控制请求频率,使用代理IP,尊重网站的反爬机制
3.不用于商业用途:爬取的数据只能用于个人学习和研究,不能用于商业用途
下一节咱们就讲Python开发股票工具的环境搭建细节,帮你解决开发过程中遇到的各种环境问题。
本站原创,转载请注明出处:https://www.xin3721.com/ArticlePrograme/csharp49696.html










