100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > python3网络爬虫开发实战6.3爬取微博处理since_id

python3网络爬虫开发实战6.3爬取微博处理since_id

时间:2022-03-12 16:53:46

相关推荐

python3网络爬虫开发实战6.3爬取微博处理since_id

最近沉迷于python爬虫,学习的是崔庆才老师的python3网络爬虫开发实战这本书,书是好书,只不过因为技术更新,原书的一些代码已经不能使用,特写此篇来记录自己的一些爬坑经历。

最大的变化就是原书中URL的page变量没有了,取而代之的是since_id

大家可以去讨论区看看解法:ajax请求。

下面说说下我的解决办法:

先了解下什么是since_id:python-新浪爬取话题微博实践,简单说:在当前页面,Preview下的cardlistInfo下的since_id保存的就是下一个页面的Request URL里的since_id,注意,第一个页面里的Request URL没有since_id

如图所示:

思路:

我们可以在get_page(since_id=None)中传入since_id参数,因为第一个页面没有since_id,因此我们将since_id默认为None。

这个函数将会返回一个元组,其中包括了下一个页面的since_id当前页面的json格式页面内容。利用返回的元组索引,我们就可以获得即将访问的下一个页面的since_id。

get_page(since_id=None)函数:

def get_page(since_id=None): # 因为第一个页面没有since_id,因此我们将since_id默认为Noneparams = {'type': 'uid','value': '2830678474','containerid': '1076032830678474','since_id': since_id}url = base_url+urlencode(params)try:response = requests.get(url, headers=headers)if response.status_code == 200:json = response.json()items = json.get('data').get('cardlistInfo')next_since_id = items['since_id']# print(next_since_id)return (json, next_since_id) # 返回一个元组,其中包括了下一个页面的since_id和当前页面的json格式页面内容except requests.ConnectionError as e:print('Error', e.args)

源代码:(为了方便演示,这里只是打印了崔老师微博的标题)

from urllib.parse import urlencodefrom pyquery import PyQuery as pqimport requestsbase_url = '/api/container/getIndex?'headers = {'Host': '','Referer': '/u/2830678474','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63','X-Requested-With': 'XMXLHttpRequest',}def get_page(since_id=None): params = {'type': 'uid','value': '2830678474','containerid': '1076032830678474','since_id': since_id}url = base_url+urlencode(params)try:response = requests.get(url, headers=headers)if response.status_code == 200:json = response.json()items = json.get('data').get('cardlistInfo')next_since_id = items['since_id']return (json, next_since_id) except requests.ConnectionError as e:print('Error', e.args)def parse_page(json):if json:items = json.get('data').get('cards')for item in items:item = item.get('mblog')weibo = {}weibo['text'] = pq(item.get('text')).text() # 为了方便检测,这里只爬取了微博的标题yield weibodef main():for i in range(10):if i == 0:print("第{}页".format(i+1))tuple_since_id = get_page()results = parse_page(tuple_since_id[0])for result in results:print(result['text'])else:print("第{}页".format(i+1))tuple_since_id = get_page(tuple_since_id[1])results = parse_page(tuple_since_id[0])for result in results:print(result['text'])if __name__ == '__main__':main()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。