Python3WebSpider/WeiboList

page参数已改成since_id,有些ajax技术上的问题

Closed this issue · 4 comments

如题,page参数已改成since_id,已经发现下一个ajax请求的since_id在上一个since_id中。故解析json的时候,不仅要返回列表,还要返回since_id。又由于本人对yield函数不太理解,故直接再定义了一个新函数来专门负责返回since_id。(代码附后)

这看起来应当是可行的,看网页返回的ajax文件就能发现since_id = json.get('data').get('cardlistInfo').get('since_id')。但是,当我进行调试时,却发现python请求得到的json中,恰恰缺少了since_id一项,这是怎么回事呢?

import requests
from urllib.parse import urlencode
from pyquery import PyQuery as pq

base_url = 'https://m.weibo.cn/api/container/getIndex?'
headers = {
    'Host': 'm.weibo.cn',
    'Referer': 'https://m.weibo.cn/u/2492465520',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest',
}

def get_url(since_id):
    params = {
        'type': 'uid',
        'value': '2492465520',
        'containerid': '1076032492465520',
        'since_id': since_id
    }
    url = base_url + urlencode(params)
    return url

def get_page(url):
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.json()
    except requests.ConnectionError as e:
        print('Error', e.args)

def parse_page(json):
    if json:
        items = json.get('data').get('cards')
        for index, item in enumerate(items):
            # if page == 1 and index == 1:
                # continue
            # else:
            item = item.get('mblog')
            weibo = {}
            weibo['id'] = item.get('id')
            weibo['text'] = pq(item.get('text')).text()
            # weibo['attitudes'] = item.get('attitudes_count')
            # weibo['comments'] = item.get('comments_count')
            # weibo['reposts'] = item.get('reposts_count')
            yield weibo

def parse_engine(json, i):
    if i > 0:
        # results = parse_page(json)
        # for result in results:
        #     print(result)
        since_id = json.get('data').get('cardlistInfo').get('since_id')
        print(since_id)
        next_url = get_url(since_id)
        next_json = get_page(next_url)
        return parse_engine(next_json, i - 1)

if __name__ == '__main__':

    url = get_url('4293511823942483')
    i = 10
    json = get_page(url)
    parse_engine(json, i)

        

json = get_page(url)后面加一句print(json),发现里面并没有since_id的值,可能要换一个方法了。

在headers中加入cookie信息,能获取到since_id,但是weibo的内容就不能爬下来,我在想是不是需要两个爬虫,一个加入cookie信息专门获取since_id,另一个不含cookie信息,通过获取的since_id来爬取weibo内容

我看了看,现在关注页面的ajax的关键换成了max_id,而人物页面的换成了containerid=<containerid>_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page=2

总之,爬人物页会好爬很多。

NH333 commented

同样的问题,楼主解决了吗?