python代码苍穹平台数据抓取

问题描述

python代码苍穹平台数据抓取

原文地址:https://github.com/yiyuezhuo/cangqiong-scratch
http://v.kuaidadi.com/
在上面这个网站平台抓取数据,为什么只有10个城市的数据可以抓取数据,其他的就不行呢?原文说10个城市可以抓取,但是我觉得应该通用的,知道区号不就可以获取相应的数据了吗?
代码如下:

 # -*- coding: utf-8 -*-
"""
Created on Thu Mar 17 12:15:08 2016

@author: yiyuezhuo
"""

'''
cityId:510100
scope:city
date:3
dimension:satisfy
num:300
'''

import requests
import json
import pandas as pd
import os

def get(cityId='510100',scope='city',date='3',dimension='satisfy',num=1000):
    url='http://v.kuaidadi.com/point'
    params={'cityId':cityId,'scope':scope,'date':date,'dimension':dimension,'num':num}
    res=requests.get(url,params=params)
    print (res.content)
    return json.loads(res.content.decode())

class Downloader(object):
    def __init__(self,cityId_list='441300'):
        self.cityId_list=cityId_list if cityId_list!=None else ['510100']
        self.scope_list=['city']
        self.date_list=[str(i) for i in range(7)]
        self.dimension_list=['distribute','satisfy','demand','response','money']
        # money好像get字段不太一样,不过暂且用一样的方法请求
        self.num_list=[1000]

        self.pkey=('cityId','scope','date','dimension','num')

        self.data={}
    def keys(self):
        for cityId in self.cityId_list:
            for scope in self.scope_list:
                for date in self.date_list:
                    for dimension in self.dimension_list:
                        for num in self.num_list:
                            yield (cityId,scope,date,dimension,num)
    def download(self,verbose=True):
        for key in self.keys():
            pkey=self.pkey
            params=dict(zip(pkey,key))
            self.data[key]=get(**params)
            if verbose:
                print('clear',key)

def to_csv(key,json_d,prefix='data/'):
    data=json_d['result']['data']
    city_id=json_d['result']['cityID']
    date=json_d['result']['date']
    dimension=key[3]
    fname='_'.join([dimension,date,city_id,'.csv'])
    fname=fname.replace('/','.')
    fname=prefix+fname
    cdata=[]
    for hour,section in enumerate(data):
        for record in section:
            cdata.append([hour]+record[1:])
    df=pd.DataFrame(cdata,columns=['hour','longitude','latitude','value'])
    df.to_csv(fname)

def to_csv_all(datas,path='data/'):
    for key,json_d in datas.items():
        to_csv(key,json_d,prefix=path)

def run(city,path='data'):
    if not os.path.isdir(path):
        print('create dir path',path)
        os.mkdir(path)
    downloader=Downloader([city])
    downloader.download()
    to_csv_all(downloader.data,path=path+'/')

def CLI():
    import argparse
    parser = argparse.ArgumentParser(usage=u'python main.py 510100',
                                     description=u"苍穹平台数据抓取器")
    parser.add_argument('city',help=u'城市序号,成都是510100,其他ID参见cityId.json文件')
    parser.add_argument('--dir',default='data',help=u'保存路径,默认为data')
    args=parser.parse_args()
    run(args.city,args.dir)

if __name__=='__main__':
    import sys
    if len(sys.argv)>1:
        CLI()

'''
downloader=Downloader()
downloader.download()
to_csv_all(downloader.data)
'''

解决方案

http://www.oschina.net/question/1780360_156785

解决方案二:

你可以看看过了,十个城市以后。抓取的数据返回的是什么信息。一般是不让你继续抓取数据了。这不是程序问题而是服务器控制的

时间: 2024-08-01 12:30:17

python代码苍穹平台数据抓取的相关文章

07-爬虫的多线程调度 | 01.数据抓取 | Python

07-爬虫的多线程调度 郑昀 201005 隶属于<01.数据抓取>小节 一般让爬虫在一个进程内多线程并发,有几种方法: Stackless :Stackless Python是Python的一个增强版本.Stackless Python修改了Python的代码,提供了对微线程的支持.微线程是轻量级的线程,与前边所讲的线程相比,微线程在多个线程间切换所需的时间更多,占用资源也更少. Twisted :主要利用 Twisted 中的异步编程能力.如 addCallback , callLater

10-穿墙代理的设置 | 01.数据抓取 | Python

10-穿墙代理的设置 郑昀 201005 隶属于<01.数据抓取>小节   我们访问 Twitter 等被封掉的网站时,需要设置 Proxy . 1.使用HTTP Proxy 下面是普通HTTP Proxy的设置方式: 1.1.pycurl 的设置 _proxy_connect = "http://127.0.0.1:1984" c = pycurl.Curl() - c.setopt(pycurl.PROXY, _proxy_connect)   1.2.urllib2

05-访问超时设置 | 01.数据抓取 | Python

05-访问超时设置 郑昀 201005 隶属于<01.数据抓取>小节 设置 HTTP 或 Socket 访问超时,来防止爬虫抓取某个页面时间过长.   pycurl 库的调用中,可以设置超时时间: c.setopt(pycurl.CONNECTTIMEOUT, 60)   在 Python 2.6 版本下,httplib 库由于有如下构造函数: class HTTPConnection:     def __init__(self, host, port=None, strict=None, 

《用Python写网络爬虫》——第2章 数据抓取 2.1 分析网页

第2章 数据抓取 在上一章中,我们构建了一个爬虫,可以通过跟踪链接的方式下载我们所需的网页.虽然这个例子很有意思,却不够实用,因为爬虫在下载网页之后又将结果丢弃掉了.现在,我们需要让这个爬虫从每个网页中抽取一些数据,然后实现某些事情,这种做法也被称为抓取(scraping). 首先,我们会介绍一个叫做Firebug Lite的浏览器扩展,用于检查网页内容,如果你有一些网络开发背景的话,可能已经对该扩展十分熟悉了.然后,我们会介绍三种抽取网页数据的方法,分别是正则表达式.Beautiful Sou

数据抓取的艺术(一):Selenium+Phantomjs数据抓取环境配置

数据抓取是一门艺术,和其他软件不同,世界上不存在完美的.一致的.通用的抓取工具.为了不同的目的,需要定制不同的代码.不过,我们不必Start from Scratch,已经有许多的基本工具.基本方法和基础框架可供使用.不同的工具.不同的方法.不同的框架的特点也不同.了解这些工具.方法和框架是首要任务,接下来就需要明白它们的差异都在哪里.什么情境该用什么东东,最后才是析出规则.编写代码.运行程序来抓取数据.所以说,其实数据抓取的学习路线,不但很长而且很杂.     为了一个特定的目的,我需要爬取G

在Python3中使用asyncio库进行快速数据抓取的教程_python

web数据抓取是一个经常在python的讨论中出现的主题.有很多方法可以用来进行web数据抓取,然而其中好像并没有一个最好的办法.有一些如scrapy这样十分成熟的框架,更多的则是像mechanize这样的轻量级库.DIY自己的解决方案同样十分流行:你可以使用requests.beautifulsoup或者pyquery来实现. 方法如此多样的原因在于,数据"抓取"实际上包括很多问题:你不需要使用相同的工具从成千上万的页面中抓取数据,同时使一些Web工作流自动化(例如填一些表单然后取回

百万级别知乎用户数据抓取与分析之PHP开发_php实例

这次抓取了110万的用户数据,数据分析结果如下: 开发前的准备 安装Linux系统(Ubuntu14.04),在VMWare虚拟机下安装一个Ubuntu: 安装PHP5.6或以上版本: 安装curl.pcntl扩展. 使用PHP的curl扩展抓取页面数据 PHP的curl扩展是PHP支持的允许你与各种服务器使用各种类型的协议进行连接和通信的库. 本程序是抓取知乎的用户数据,要能访问用户个人页面,需要用户登录后的才能访问.当我们在浏览器的页面中点击一个用户头像链接进入用户个人中心页面的时候,之所以

关于数据抓取时网页编码各不相同的问题

问题描述 关于数据抓取时网页编码各不相同的问题 最近在学习数据抓取的一些技能,抓取指定数据,网页编码都是不一样的, 有没有方法写个公用的类或者对象来处理,求代码 解决方案 python 判断网页编码的方法: import urllib f = urllib.urlopen('http://outofmemory.cn/').info() print f.getparam('charset') 2 import chardet 你需要安装一下chardet第3方模块判断编码 data = urll

用javascript解决外部数据抓取中的乱码问题_应用技巧

我们一般会在两个地方用到外部数据抓取,一个是在asp中,一个是在hta中.如果外部数据是gb2312编码的,就涉及到转码的问题,但是传统的用vbs函数进行处理的方法,运算量比较大,有些特殊字符还会出错.    如果用adodb.stream控件来进行转码,就简单多了,不需要借助vbs的二进制处理函数了,同时速度快了很多. 复制代码 代码如下: <script>  function loadData(sUrl){      var xh      xh=new ActiveXObject(&qu