用python3爬取微博的数据和图片
如何用python爬取微博的数据
这又是我正在学习崔庆才大佬的爬虫文章学习和体会到的啦,,,
正文
当我们浏览微博时,会发现微博网页下面都有下拉下载更多的选项,初始的页面只有几个微博的内容,当我们到最后再向下滑动时此时会出现一个加载的标志,然后会出现新的微博内容,根据Ajax网页的特性可发现这是一个用Ajax方式渲染的网页。整个页面并没有刷新,所以可以明白这是页面在原有的基础上发送Ajax请求数据更新网页的过程。所以我们可以得到一点爬取的思路啦
- 知道请求是发向哪里的
- 请求包含哪些参数
- 请求是怎么发送的
知道了这些,我们就可以得到包含我们数据的网页啦。然后再解析这些网页数据那一部分是我们想要的,然后直接用.json的解析和正则解析来提取我们想要的数据,话不多直接开整。
这里以作者崔庆才的微博为例(对不住了,我没有微博–)首先进入作者的微博首页,进入XHR选项卡过滤请求,并且选中一个看起来像是加载数据的请求点击去看看。
然后看一下这个请求的url:https://m.weibo.cn/api/container/getIndex?type=uid&value=2830678474&containerid=1005052830678474 根据一点点的英语水平可以发现这就是数据请求的url啊,然后继续下话加载更多的数据,再用一个刚刚刷新出来的请求url比较一下Request URL: https://m.weibo.cn/api/container/getIndex?type=uid&value=2830678474&containerid=1076032830678474&page=2 经过简单的对比可以发现,这个网址请求就是向下加载请求数据的地址,然后发现里面请求的参数有四个 type, value, containerid, page,然后变化的就只有page再根据小学英语分析可得这是一个控制分页的参数,也就是说,我们只要改变这个参数就可以得到新的数据啦。
然后我们分析一下这个请求的响应内容以便得到我们想要的数据,点进去浏览器的 preview 选项,由于Ajax请求到的是json格式的,我们的浏览器为我们做了解析,其中点开data选项,有两个分节点 cardlistinfo饱含着一些当前card内容的标识信息,和一些微博用户的总体信息,然后重要的是 card 里面包含着很多的信息,这里面就有我们要的信息,他是一个列表,包含着十个元素,点开一个观察可以发现里面就是微博的内容,其中比较重要的字段是 mblog 字段,我们要的信息都在这里面。
所以经过上面的分析可得我们只要做一个简单的循环改变requet的 page 的值就可以得到所有的微博数据啦。下面附上代码
from pyquery import PyQuery as pq
from urllib.parse import urlencode
import requests
import json
base_url = 'https://m.weibo.cn/api/container/getIndex?'
headers = {
'Host': 'm.weibo.cn',
'Referer': 'https://m.weibo.cn/u/2830678474',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
def get_page(page):
params = {
'type': 'uid',
'value': '2830678474',
'containerid': '1076032830678474',
'page': page
}
url = base_url + urlencode(params)
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): ###########为什么要加上 index??????????? index是索引,items是一个字典,取出来的时候要用索引一起
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
if __name__ == '__main__':
for page in range(1, 10):
json = get_page(page)
results = parse_page(json)
for result in results:
print(result)
这里没有包括下载图片的板块,需要的可以在评论下告诉我。
上一篇: appium(java)——环境搭建
下一篇: 用python3爬取百度首页