微指数爬虫

做微指数的爬虫时,遇到点难题,去网上查些资料,发现有点错误;

特此经过研究,有了正确的采集方法。

 

1、采集界面,搜索关键字后页面跳转到指数界面,显示搜索的指数。

2、fiddler抓包定位采集数据源,加载方式为json

 

3、获取json数据;

        分析数据的加载方式,发现数据是在定位请求头中的referer地址进行返回数据的,

        将重定向的地址解析后知道wid和wname是我们需要首先获得的,其实就是我们请求的地址。

 

4、代码验证,这些步骤也是网上可以搜索到的步骤

    a、获取wid和对应的搜索关键字

    b、拼接json数据的url

    c、请求数据

 

5、用此方法验证的代码,结果无论搜索什么只显示欢乐颂的指数,说明该方法是不能实现的

 

#coding=utf-8  
import sys  
reload(sys)  
sys.setdefaultencoding( "utf-8" )  
import requests  
import urllib  
  
class xl():  
    def pc(self,name):  
        url_name=urllib.quote(name)  
        headers={  
'Host': 'data.weibo.com',  
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:46.0) Gecko/20100101 Firefox/46.0',  
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',  
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',  
'Accept-Encoding': 'gzip, deflate',  
'Content-Type': 'application/x-www-form-urlencoded',  
'X-Requested-With': 'XMLHttpRequest',  
'Referer': 'http://data.weibo.com/index/hotword?wname='+url_name,  
'Cookie': 'UOR=www.baidu.com,data.weibo.com,www.baidu.com; SINAGLOBAL=1213237876483.9214.1464074185942; ULV=1464183246396:2:2:2:3463179069239.6826.1464183246393:1464074185944; DATA=usrmdinst_12; _s_tentry=www.baidu.com; Apache=3463179069239.6826.1464183246393; WBStore=8ca40a3ef06ad7b2|undefined; PHPSESSID=3mn5oie7g3cm954prqan14hbg5',  
'Connection': 'keep-alive'  
}  
        r=requests.get("http://data.weibo.com/index/ajax/getchartdata?month=default&__rnd=1464188164238",headers=headers)  
        return r.text  
  
x=xl()  
print x.pc("欢乐颂") 

 

6、纠正方法,重新进入搜索页;在红方框中重新搜索关键字进行刷新

 

 

7、实际的数据加载过程为下面的四个步骤,“欢乐颂”的实际的请求url为

http://data.weibo.com/index/ajax/getchartdata?wid=1091324230349&sdate=2017-05-23&edate=2017-06-22&__rnd=1498202175662

 

8、获取url中的日期和wid即可以拿到数据,不需要cookie

 

#coding=utf-8

import requests
import urllib
import cProfile

def search_name(name):
    url_format = "http://data.weibo.com/index/ajax/hotword?word={}&flag=nolike&_t=0"
    cookie_header = {
                     "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36",
                     "Referer":"http://data.weibo.com/index?sudaref=www.google.com"
                   }

    urlname = urllib.quote(name)
    first_requests = url_format.format(urlname)
    codes = requests.get(first_requests,headers=cookie_header).json()
    ids = codes["data"]["id"]

    header = {
        "Connection":"keep-alive",
        "Accept-Encoding": "gzip, deflate, sdch",
        "Accept": "*/*",
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36",
        "Accept-Language": "zh-CN,zh;q=0.8",
        "Referer": "http://data.weibo.com/index/hotword?wid={}&wname={}".format(ids,urlname),
        "Content-Type": "application/x-www-form-urlencoded",
        "Host":"data.weibo.com"
    }

    #获取日期
    date_url = "http://data.weibo.com/index/ajax/getdate?month=1&__rnd=1498190033389"
    dc = requests.get(date_url,headers=header).json()
    edate,sdate = dc["edate"],dc["sdate"]

    #数据返回
    codes = requests.get("http://data.weibo.com/index/ajax/getchartdata?wid={}&sdate={}&edate={}"\
                         .format(ids,sdate,edate),headers=header).json()
    return codes


if __name__ == "__main__":
    cProfile.run('search_name("天津")')
    #print search_name("天涯")

9、如有错误还请指正

 

posted @ 2017-06-23 15:28  小步快跑&  阅读(1753)  评论(0编辑  收藏  举报