- 基本指标
# url
http://nufm.dfcfw.com/EM_Finance2014NumericApplication/JS.aspx
# 参数
?cb=jQuery112402081770324259753_1534163735689
&type=CT
&token=4f1862fc3b5e77c150a2b985b12db0fd
&sty=FCOIATC
&js=(%7Bdata%3A%5B(x)%5D%2CrecordsFiltered%3A(tot)%7D)
&cmd=C._A
&st=(ChangePercent)
&sr=-1
&p=2
&ps=20
&_=1534163735696- 主力流入
# url
http://ff.eastmoney.com//EM_CapitalFlowInterface/api/js
# 参数
?type=hff
&rtntype=2
&js={data:[(x)]}
&cb=var%20aff_data=
&check=TMLBMSPROCR
&acces_token=1942f5da9b46b069953c873404aad4b5
&id=0000632
&_=1534217118028- 财报披露
# url
http://data.eastmoney.com/bbsj/600096.html- 股东增减持
# url
http://data.eastmoney.com/DataCenter_V3/gdzjc.ashx
# 参数
?pagesize=50
&page=2
&js=var%20upbBBTdP
¶m=
&sortRule=-1
&sortType=BDJZ
&tabid=all
&code=
&name=
&rt=51130247- 股票回购
# url
http://api.dataide.eastmoney.com/data/gethglist
# 参数
?pageindex=2
&pagesize=50
&orderby=dim_date
&order=desc
&jsonp_callback=var%20klzuugWP=(x)
&market=(0,1,2,3)
&rt=51135425- 股权质押
# url
http://api.dataide.eastmoney.com/data/GDZY_GD_SUM
# 参数
?pageindex=1
&pagesize=500
&orderby=updatedate
&order=desc
&jsonp_callback=var%20GRjicuBd=(x)
&rt=51135446- 限售解禁
# url
http://dcfm.eastmoney.com/em_mutisvcexpandinterface/api/js/get
# 参数
?token=70f12f2f4f091e459a279469fe49eca5
&st=ltsj
&sr=-1
&p=1
&ps=500
&type=XSJJ_NJ_PC
&js=var%20NQkceaOS={pages:(tp),data:(x)}
&filter=(gpdm=)
&rt=51135483- 公司公告
# url
https://xueqiu.com/statuses/stock_timeline.json
# 参数
?symbol_id=SH600519 #股票类型+股票代码构成KEY,1代表SH,表示上交所,2代表SZ,表示深交所
&count=10
&source=%E5%85%AC%E5%91%8A #‘公告’的UTF-8编码,表示查询的是公告
&page=1- 公司新闻
# url
https://xueqiu.com/statuses/stock_timeline.json
# 参数
?symbol_id=SH600519
&count=10
&source=%E8%87%AA%E9%80%89%E8%82%A1%E6%96%B0%E9%97%BB
&page=1基于python的scrapy框架来开发爬虫,爬取的数据持久化至mysql数据库,再由web应用完成查询和展示。
[root@master ~]# python -V
Python 2.7.5
[root@master ~]# pip list
Package Version
---------------------------- -----------
chardet 3.0.4
demjson 2.2.4
fake-useragent 0.1.10
gevent 1.3.6
lxml 3.2.1
psutil 5.4.7
PyMySQL 0.9.2
pyOpenSSL 18.0.0
pysqlite 2.8.3
pytz 2018.5
requests 2.10.0
Scrapy 1.5.1
SQLAlchemy 1.2.11
Twisted 18.7.0
web.py 0.39- 抓包工具分析
js,ajax的请求,模拟该请求获取js加载后的数据 - Spynner + PyQt4.QtWebKit内核
- Selenium + phantomjs模拟操作
我们采用的是第一种方式,构造js请求获取数据后进行解析
网站的防火墙会对某个固定ip在某段时间内请求的次数做限制,超过了则拒绝请求或是弹出一些类似于验证码、滑动块的交互页面,后台爬取时机器和ip有限,很容易达到上线而导致请求被拒绝。目前主要的应对方案是使用代理,这样一来ip的数量就会多一些,但代理ip依然有限,对于这个问题,根本不可能彻底解决。
- Go-Agent:较成熟,但提供的IP均是透明的,雪球网反爬会屏蔽。
- IPProxyPool:爬取免费代理的开源实现,不稳定,但提供的IP有匿名和高匿的,可绕过雪球网反爬,其具体实现参见项目文档
https://github.com/GZJZD/IPProxyPool
我们采用的是基于IPProxyPool进行若干修改的方案
网站后台通常会通过此字段判断用户设备类型、系统以及浏览器的型号版本。我们可以设置为浏览器的User-Agent来避免被拒绝链接。
我们采用的是三方包fake-useragent来随机生成ua
一般在用户登录或者某些操作后,服务端会在返回包中包含Cookie信息要求浏览器设置Cookie,没有Cookie会很容易被辨别出来是伪造请求。
我们需要爬取的数据源中,雪球网有Cookie检查,不过比较简单,只需要登录一次主页获取Cookie即可
随着爬虫运行时间的推移,爬取到的数据会越来越多,云端ECS主机的存储空间有限,需要定期清理历史数据
TODO
panhongfa@DESKTOP-TH8I1NC /cygdrive/e/works/gerapy/projects/MarketCrawl
$ tree ./
./
|-- crontab.conf # crond.service配置
|-- MarketCrawl
| |-- __init__.py
| |-- __pycache__
| | |-- __init__.cpython-37.pyc
| | `-- settings.cpython-37.pyc
| |-- items.py # 采集数据项定义
| |-- logger.py
| |-- main.py # 调试启动入口
| |-- middlewares.py # UA与proxy中间件实现
| |-- pipelines.py # 数据持久化实现
| |-- settings.py # 全局配置
| `-- spiders # 爬虫实现
| |-- __init__.py
| |-- __pycache__
| | |-- __init__.cpython-37.pyc
| | `-- GridListSpider.cpython-37.pyc
| |-- CompanyAnnouncementSpider.py
| |-- CompanyNewSpider.py
| |-- FinancialNoticeSpider.py
| |-- GridListSpider.py
| |-- MainInfluxSpider.py
| |-- RestrictedSpider.py
| |-- ShareBuybackSpider.py
| |-- ShareHolderSpider.py
| `-- SharePledgeSpider.py
|-- README.md
|-- scrapy.cfg # scrapy配置
|-- start.sh # 后台服务启动脚本
`-- stop.sh # 停止后台服务脚本
5 directories, 27 files云端ECS主机
ip: 47.52.77.50
用户: root
密码: jzt@2018
Mysql数据库
ip: localhost
用户: root
密码: 1cd /home
git clone [email protected]:GZJZD/IPProxyPool.git
git clone [email protected]:GZJZD/MarketCrawl.git定时调度采用crond.service服务来实现,其配置文件内容如下
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
*/5 7-22 * * * root /home/MarketCrawl/start.sh G
*/30 7-22 * * * root /home/MarketCrawl/start.sh M
00 7-22/1 * * * root /home/MarketCrawl/start.sh F
10 7-22/1 * * * root /home/MarketCrawl/start.sh H
20 7-22/1 * * * root /home/MarketCrawl/start.sh B
30 7-22/1 * * * root /home/MarketCrawl/start.sh P
40 7-22/1 * * * root /home/MarketCrawl/start.sh R
00 */4 * * * root /home/MarketCrawl/start.sh A newest
50 */4 * * * root /home/MarketCrawl/start.sh C newest
00 8 * * 6-7 root /home/MarketCrawl/start.sh A period
00 14 * * 6-7 root /home/MarketCrawl/start.sh C period
00 00 1 * * root /home/MarketCrawl/start.sh A all
00 00 1 * * root /home/MarketCrawl/start.sh C all
#Usage: ./start.sh {G |M |F |H |B |P |R |A |C } {all| period| newest}