楼主: wqf_cufe
8342 10

[有偿编程] 100银子求助抓取同花顺网页股票数据 [推广有奖]

  • 4关注
  • 16粉丝

已卖:4079份资源

教授

89%

还不是VIP/贵宾

-

威望
0
论坛币
4283 个
通用积分
6.5000
学术水平
10 点
热心指数
17 点
信用等级
13 点
经验
565 点
帖子
730
精华
0
在线时间
2236 小时
注册时间
2009-5-26
最后登录
2021-12-29

楼主
wqf_cufe 发表于 2015-2-22 23:05:54 |AI写论文
100论坛币
最近想研究一下活跃营业部的历史数据,希望从同花顺网页上抓取一下过去一年也就是2014年前十大活跃营业部总共买了哪些股票。希望抓取的10个营业部名称和网页如下:

由于只是网址最后面的代码不同,这里这给了两个营业部的网址,其余可以从同花顺上面搜到。
360桌面截图20150222095415.jpg

网址1:http://data.10jqka.com.cn/market/yybzjsl/CTZQGFYXGSWLDHBLZQYYB
[size=13.63636302948px]网址2:http://data.10jqka.com.cn/market/yybzjsl/HTZQGFYXGSCDSJLZQYYB

需要抓取的数据为

上榜日期,

股票简称,

成交性质,

营业部


成交额占比,

所属板块

360桌面截图20150222095826.jpg

希望能够抓取全部的数据,比如网址1和网址2中的数据共有43页和86页。用R或者PYTHON都可以。请附上全部代码。谢谢!!!

360桌面截图20150222095826.jpg (689.29 KB)

360桌面截图20150222095826.jpg

最佳答案

harpbreeze 查看完整内容

分析了一下楼主给的两个页面,发现其实页面是通过其他链接再加上页码参数,进行Get请求 之后返回json数据再显示在页面上的。 代码以楼主给的两个链接为例,可以用下面的python代码进行数据拉取。 几个参数: pre是各营业部获取数据的连接,page_num是对应营业部数据的页数。 最后保存为csv文件,我自己保存在D盘,楼主可以自己调整。 # -*- coding: utf-8 -*- import urllib2 from bs4 import BeautifulSoup, So ...
关键词:股票数据 同花顺 market python marke 同花顺 网页

沙发
harpbreeze 发表于 2015-2-22 23:05:55
分析了一下楼主给的两个页面,发现其实页面是通过其他链接再加上页码参数,进行Get请求
之后返回json数据再显示在页面上的。

代码以楼主给的两个链接为例,可以用下面的python代码进行数据拉取。

几个参数:
pre是各营业部获取数据的连接,page_num是对应营业部数据的页数。
最后保存为csv文件,我自己保存在D盘,楼主可以自己调整。


# -*- coding: utf-8 -*-

import urllib2
from bs4 import BeautifulSoup, SoupStrainer
import json
import csv

pre="http://data.10jqka.com.cn/interface/market/yybzjsl/CTZQGFYXGSWLDHBLZQYYB/"
#pre="http://data.10jqka.com.cn/interface/market/yybzjsl/HTZQGFYXGSCDSJLZQYYB/"

data_all=[]
page_num=43
#page_num=86

getonly = SoupStrainer('table')

for id_url in range(1,page_num+1):
    print "Start to get url:"+str(id_url)
    url=pre+str(id_url)
    content = urllib2.urlopen(url).read()  
    obj=json.loads(content)
    datapart = obj["data"]  
    table = BeautifulSoup(datapart, parse_only=getonly)

    for id,row in enumerate(table("tr")):
      if((id_url!=1 and id==0)or(id==1)):continue  
      text = ''.join(row.findAll(text=True))
      data = text.strip()
      data_split = data.split('\n')
      data_all.append(data_split)

cvsfile=open('D:\\eggs.csv', 'wb')
recordwriter=csv.writer(cvsfile,delimiter=',')
for line in data_all:
    temp_list=[]
    for field in line:
        temp_list.append(field.encode('gbk'))   
    recordwriter.writerow(temp_list)

cvsfile.flush()
cvsfile.close()

print "file has been created!"

已有 1 人评分热心指数 收起 理由
求证1加1 + 1 热心帮助其他会员

总评分: 热心指数 + 1   查看全部评分

藤椅
yishi20000 学生认证  发表于 2015-2-23 00:56:46
require(XML)
require(RCurl)

第二步:抓取网页的源代码。
  webpage<-getURL(link)
  webpage <- readLines(tc <- textConnection(webpage)); close(tc)
  pagetree <- htmlTreeParse(webpage, error=function(...){}, useInternalNodes = TRUE)

第三步:选表格。
用html语言@限定
  tablehead <- xpathSApply(pagetree, "//table//th", xmlValue) #这里是抓表格的标题
  result<-xpathSApply(pagetree,"//table//td",xmlValue) #这里是表格内容
已有 1 人评分学术水平 收起 理由
nuomin + 1 精彩帖子

总评分: 学术水平 + 1   查看全部评分

板凳
wqf_cufe 发表于 2015-2-23 02:22:35
yishi20000 发表于 2015-2-23 00:56
require(XML)
require(RCurl)
谢谢!能否给出完整的代码呢?

报纸
wqf_cufe 发表于 2015-2-26 09:48:04
import urllib
from bs4 import BeautifulSoup, SoupStrainer

baseurl="http://data.10jqka.com.cn/market/yybzjsl/HTZQGFYXGSCDSJLZQYYB"
page = urllib.urlopen(baseurl)
getonly = SoupStrainer('table')
table = BeautifulSoup(page, parse_only=getonly)

for row in table("tr"):
  text = ''.join(row.findAll(text=True))
  data = text.strip()
  print data

自己给自己回答一部分吧,但是这里的DATA怎么整成data frame的形式?还有就是这里只能取一页,我想取所有页的数据,请高手指教!谢谢

地板
weibazyy 发表于 2015-2-26 10:44:32
用rvest也可以很容易拿到一页的数据,不过没有1楼那个选表格,之后处理方便。
同样有问题的是如何才能拿到整几页的数据。研究了网页代码,没看到页码切换部分,貌似用JS还是啥的切换的
同求有心人研究一下下面是尝试拿的一部分代码,包括名字,date,还有原因。用遨游的元素审查看的。
library(rvest)
url<-"http://data.10jqka.com.cn/market/yybzjsl/"
raw<-html(url,encoding="UTF-8")
#get stock
stock_list<-raw %>% html_nodes("tr")
date<-stock_list %>% html_nodes("td.first.tc")
reason<-stock_list %>% html_nodes("td.tl")
stock<-sapply(stock_list,function(n) n[3]$td)
stock


----------
补充:
用以下可以快速得到table (html_table())
d<-raw%>%html_nodes("table.m_table") %>% html_table(fill=TRUE)
d

7
harpbreeze 发表于 2015-2-27 14:48:16
其他营业部的数据,楼可以根据连接自己改一下,
比如楼主给到的
http://data.10jqka.com.cn/market/yybzjsl/CTZQGFYXGSWLDHBLZQYYB
对应取数据的就是
http://data.10jqka.com.cn/interface/market/yybzjsl/CTZQGFYXGSWLDHBLZQYYB/[/url]

第二个连接
http://data.10jqka.com.cn/market/yybzjsl/CTZQGFYXGSWLDHBLZQYYB
对应
[url]http://data.10jqka.com.cn/interface/market/yybzjsl/CTZQGFYXGSWLDHBLZQYYB/
可见只要修改数据最后一部分,使之与原链接最后一部分相同就可以了。

此外,楼主别忘了还要改一下每个营业部数据的页数。
这些都好了,相信楼主应该能很顺利地将数据全部拉取下来了。

8
wqf_cufe 发表于 2015-2-27 23:28:45
harpbreeze 发表于 2015-2-27 14:48
其他营业部的数据,楼可以根据连接自己改一下,
比如楼主给到的
http://data.10jqka.com.cn/market/yybzj ...
大神你好,你的代码可以运行,但是有个问题,存到csv里面后,即便用了逗号分隔,数据还都是在一行的字符串之中。

9
harpbreeze 发表于 2015-2-28 20:14:04
wqf_cufe 发表于 2015-2-27 23:28
大神你好,你的代码可以运行,但是有个问题,存到csv里面后,即便用了逗号分隔,数据还都是在一行的字符串 ...
额?不是很懂你的意思。。以逗号相隔就可以将每一个字段的内容取出来了呀。。

10
harpbreeze 发表于 2015-2-28 20:19:48
wqf_cufe 发表于 2015-2-27 23:28
大神你好,你的代码可以运行,但是有个问题,存到csv里面后,即便用了逗号分隔,数据还都是在一行的字符串 ...
比如:
str="a,b,c,d"
list=str.split(",")

list 就是["a","b","c","d"]
楼主迭代着取出来就好了


也可以用R读CVS文件:
data <-read.table("eggs.cvs",header=TRUE,sep=",")
data就是一个数据框了。
已有 1 人评分论坛币 收起 理由
admin_kefu + 100 热心帮助其他会员

总评分: 论坛币 + 100   查看全部评分

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 05:34