专栏名称: 爱数据LoveData
中国统计网(www.itongji.cn),国内最大的数据分析门户网站。提供数据分析行业资讯,统计百科知识、数据分析、商业智能(BI)、数据挖掘技术,Excel、SPSS、SAS、R等数据分析软件等在线学习平台。
目录
相关文章推荐
51好读  ›  专栏  ›  爱数据LoveData

春天到了,基金绿了,于是我用python...

爱数据LoveData  · 公众号  · BI  · 2021-03-05 16:30

正文

请到「今天看啥」查看全文



我们先不爬取,再分析这个基金持仓的详情页,这个url也是有规律的,它是用 http://fundf10.eastmoney.com/ccmx_ 和该基金的基金代码组合成的
比如:
005660 ,嘉实资源精选股票A 的持仓详情页面url:嘉实资源精选股票A(005660)基金持仓 _ 基金档案 _ 天天基金网
006921,南方智诚混合 的持仓详情页面url:南方智诚混合(006921)基金持仓 _ 基金档案 _ 天天基金网

因为这些数据是用js动态加载的,如果使用requests爬取的话难度很大,这种情况下一般会使用selenium模拟浏览器行为进行爬取。但是selenium爬取的效率确实比较低

其实我们依旧是可以使用requests进行爬取的,js动态加载是html页面中的js代码执行了一段操作,从服务端自动加载了数据,所以数据在一开始爬取的页面上是看不到的,除非一些特别难爬的数据才需要selenium,因为selenium号称: 只要是你看得到的数据就都可以获取。 毕竟selenium是模仿人操作浏览器的行为的。 这里我们分析js动态加载,然后利用requests来爬取,后面进行二次爬取的时候再用selenium

在首页按F12打开开发者工具,然后再刷新一下
可以看到右边蓝色框里的数据了吧,这是js动态加载之后返回的数据,然后经过加工后呈现在页面上的,其实只要获取这些数据就可以了,不用去爬取首页了

我们再点击 Headers ,这个 Request URL 就是js请求的url了,你可以试试把这个url直接用浏览器回车下,会给你返回一堆的数据;上面分析了基金持仓股票页面url的组成,所以只要需要这些数据里的六位基金代码就可以了

本篇代码中是用python正则进行了六位数字的提取,然后组成的基金持仓股票页面的url;然后再在基金持仓股票页面对该基金持有的股票进行爬取、存储

03

爬取流程

1、首先从首页中请求js动态加载数据时请求的那个url,从中获取六位数字的基金代码

然后 http://fundf10.eastmoney.com/ccmx_ + 基金代码 + .html 组成的基金持仓股票的详情页url

2、针对 基金持仓股票的详情页url 进行爬取,因为也是js动态加载的(加载速度较快),并且需要判断该基金是否有持仓的股票(有的基金没有买股票,也不知道他们干啥了),所以使用selenium来爬取,同时也使用了显式等待的方式来等待数据加载完成;

3、将数据整理,存储到mongodb中

04

代码讲解——数据爬取

这次我们将代码分段放上来,分段说明

需要的库:
import re
from lxml import etree
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import pymongo

准备一些常用的方法:
def is_contain_chinese(check_str):
"""
判断字符串中是否包含中文
:param check_str: {str} 需要检测的字符串
:return: {bool} 包含返回True, 不包含返回False
"""
for ch in check_str:
if u'\u4e00' <= ch <= u'\u9fff':
return True
return False
#selenium通过class name判断元素是否存在,用于判断基金持仓股票详情页中该基金是否有持仓股票;
def is_element(driver,element_class):
try:
WebDriverWait(driver,2).until(EC.presence_of_element_located((By.CLASS_NAME,element_class)))
except:
return False
else:
return True
#requests请求url的方法,处理后返回text文本






请到「今天看啥」查看全文