page参数已改成since_id,有些ajax技术上的问题
Closed this issue · 4 comments
gantrol commented
如题,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)
ziyou8 commented
json = get_page(url)后面加一句print(json),发现里面并没有since_id的值,可能要换一个方法了。
ziyou8 commented
在headers中加入cookie信息,能获取到since_id,但是weibo的内容就不能爬下来,我在想是不是需要两个爬虫,一个加入cookie信息专门获取since_id,另一个不含cookie信息,通过获取的since_id来爬取weibo内容
gantrol commented
我看了看,现在关注页面的ajax的关键换成了max_id
,而人物页面的换成了containerid=<containerid>_-_WEIBO_SECOND_PROFILE_WEIBO&page_type=03&page=2
。
总之,爬人物页会好爬很多。
NH333 commented
同样的问题,楼主解决了吗?