分析AJAX请求获取数据(抓取新浪微博王诺诺所发微博的所有文本数据)

首先要做的是抓包分析:

  • 由于微博采用ajax请求,所以网页以动态呈现。第一步要做的就是点开Network,选中Preserve log和XHR,然后往下拉动网页,就会有异步网页加载出来。选中新刷新出来的网页,其URL才是真正存放数据的地方。

  • 向网页发送请求的时候要带上Cookies,以便服务器认识你(提前登陆)

接下来上代码:

  • 分析URL的组成:这是抓包获取到的url
 url='http://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=100505&is_search=0&visible=0&is_all=1&is_tag=0&profile_ftype=1&page={}&pagebar=0&pl_name=Pl_Official_MyProfileFeed__21&id=1005052007695831&script_uri=/u/2007695831&feed_type=0&pre_page=3&domain_op=100505&__rnd=1505635243908'.format(page)

观察URL,发现page参数的变化即对应着每一个URL,于是让page={},后面再.format(page)为其赋值。
至此就很明显了,一个for 循环就可以搞定所以的URL。

  • 接下来上代码,关键的地方我都会注释。
import requests
import json
import time
from bs4 import BeautifulSoup   #导入库

for page in range(9):       #因为王诺诺的微博一共8页,所以取9(9取不到)
    url='http://weibo.com/p/aj/v6/mblog/mbloglist?ajwvr=6&domain=100505&is_search=0&visible=0&is_all=1&is_tag=0&profile_ftype=1&page={}&pagebar=0&pl_name=Pl_Official_MyProfileFeed__21&id=1005052007695831&script_uri=/u/2007695831&feed_type=0&pre_page=3&domain_op=100505&__rnd=1505635243908'.format(page)
    cookie={'Cookie':'SINAGLOBAL=4968120555929.902.1504320931714; UOR=,,cuiqingcai.com; login_sid_t=d791dd6d205b82f7857b75e978d6d878; YF-Ugrow-G0=9642b0b34b4c0d569ed7a372f8823a8e; YF-V5-G0=5468b83cd1a503b6427769425908497c; _s_tentry=-; Apache=9448777226306.256.1505632959578; ULV=1505632959582:5:5:1:9448777226306.256.1505632959578:1504930422260; SSOLoginState=1505633004; SCF=Ai3dwKq7TX1KC7KsEdPv1-n3na0suMaxSjvSMgJKs0ixPAAi4hRp6PJOWnB0m5fTtqWlWwoxvFaXDu1FIs382uk.; SUB=_2A250ulK9DeRhGeBO61AZ8SfFwjqIHXVXzsN1rDV8PUNbmtBeLW7GkW8KMtv6jmMBg1n1-HE4soO8mZePVQ..; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WW.BhLjxDKRM6NTEMCCLXvc5JpX5K2hUgL.Foq7ehzReK.41Kq2dJLoI0YLxKqL1hnL1KnLxK-L1-eLB.2LxKnL1K5L1-BLxKnL12-L1h.LxK-LB-BLBKeLxKqL1h.LB.qLxKML1K5L1-zt; SUHB=0gHiMLVFWOkGUt; ALF=1537169004; un=15052967703; wvr=6; YF-Page-G0=e44a6a701dd9c412116754ca0e3c82c3; wb_cusLike_6002819996=N'}

    r=requests.get(url,cookies=cookie)
    Data=json.loads(r.text)   #直接r.text得到的是str数据类型,即字符串类型,用json转成dict类型,即字典类型。

    htmlstr=Data['data']      #分析网页,data为键,Data['data']取出其值,使HTML代码正常输出

    soup=BeautifulSoup(htmlstr,'lxml')
    divs=soup.find_all('div','WB_text W_f14')   #解析
    for div1 in divs:
        content=div1.get_text().replace(' ','')
        with open(r'C:\Users\Williams_Z\Desktop\movie4.txt', 'a+', encoding='utf-8') as f:
            f.write(content)      #存储
    time.sleep(1)                 #每解析一页,休息1秒,防止被封。
print('Good Job')               #全部储存好后,返回Good Job,结束爬虫。

放上效果图:

分析AJAX请求获取数据(抓取新浪微博王诺诺所发微博的所有文本数据)_第1张图片

对比王诺诺微博:

分析AJAX请求获取数据(抓取新浪微博王诺诺所发微博的所有文本数据)_第2张图片
分析AJAX请求获取数据(抓取新浪微博王诺诺所发微博的所有文本数据)_第3张图片
分析AJAX请求获取数据(抓取新浪微博王诺诺所发微博的所有文本数据)_第4张图片

你可能感兴趣的:(分析AJAX请求获取数据(抓取新浪微博王诺诺所发微博的所有文本数据))