requests库是python爬虫中最常见的库,与内置的urllib库相比,它更加简洁高效,是每一个接触爬虫者都务必要掌握的基础;但它也是有缺点的,就是不支持异步操作,虽然可以通过多线程来解决,但当需要发送大量请求时,创建大量的线程会浪费过多的资源;此时出现了一个新的库aiohttp,它是支持异步操作的,可以在一个线程中,通过异步多任务来实现快速发送请求,提高效率。这次,我基于这两个库,做一个高效的微博关键词爬虫,源码在文章的末尾。
首先,我是从微博的移动端地址入手,发现它是ajsx请求,请求参数中,除页码外,其他都是常量,所以要实现多页请求,直接将页码当作参数发送即可。但是页面返回的json数据并没有直接标明总页数,所以需要自己计算。进一步分析,发现数据中包含了微博的总条数和每一页的条数,这就是突破口,对它进行简单的运算就可以拿到总页码。此处只需要发送一次请求,就可以获取到信息,所以这里采用的是requests。
def get_page(): """ 先用requests构造请求,解析出关键词搜索出来的微博总页数 :return: 返回每次请求需要的data参数 """ data_list = [] data = { 'containerid': '100103type=1&q={}'.format(kw), 'page_type': 'searchall'} resp = requests.get(url=url, headers=headers, params=data) total_page = resp.json()['data']['cardlistInfo']['total'] # 微博总数 # 一页有10条微博,用总数对10整除,余数为0则页码为总数/10,余数不为0则页码为(总数/10)+1 if total_page % 10 == 0: page_num = int(total_page / 10) else: page_num = int(total_page / 10) + 1 # 页码为1,data为当前data,页码不为1,通过for循环构建每一页的data参数 if page_num == 1: data_list.append(data) return data_list else: for i in range(1, page_num + 1): data['page'] = i data_list.append(copy.deepcopy(data)) return data_list
页码解析
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微博关键词爬虫——基于requests和aiohttp - Python技术站