写在前面:微博有三个网站,不同的网站爬取得难度不同,分别是
网页端: http://weibo.com;
手机端: http://m.weibo.cn;
移动端: http://weibo.cn。
本篇主要爬取微博手机端的目标用户的微博内容,所谓目标用户是指,给定的用户id,而不是通过信息搜索得到。
一、目标页面
首先确定好目标用户,这里选择知名演员李现的微博账号。爬取数据不用于非法或者违规的用途,单纯用于学习研究。
打开李现的微博主页,在链接中可以看到他的账号id是2360812967,这个是用来识别每个微博账号的id。
这是打开网页的源代码,会发现里面没有我们直接看到的如图中的内容,因为页面是通过Ajax动态渲染得到的,所以直接的网页源代码中没有内容。所以需要打开页面的开发者工具页面,找到对应的网页信息。在XHR中可以看到getIndex?这个链接中有对应的微博信息。而且往下滑会出现更多的微博和对应的getIndex?的链接。大概可以确定这个就是要爬取得目标页面。
接下来得问题,就是找到对应得页面得URL,尤其是向下滑得过程中产生得新的页面。
简单对比和分析可以发现,第二个getindex?开始是关于用户发博得内容。
header中得request URL分别是:
- https://m.weibo.cn/api/container/getIndex?type=uid&value=2360812967&containerid=1076032360812967
- https://m.weibo.cn/api/container/getIndex?type=uid&value=2360812967&containerid=1076032360812967&since_id=4537401894771336
- https://m.weibo.cn/api/container/getIndex?type=uid&value=2360812967&containerid=1076032360812967&since_id=4528777969276951
后面得URL中多了一个since_id 的参数,肉眼上并看不出有什么规律,但是在开发者工具页面中,可以找到这个since_id参数。比如第三个URL中的since_id参数就是从第二个URL中response中得到的since_id。即向下滑的过程中,新产生的页面链接中的since_id参数与当前页面中得到的since_id参数有关。根据这个逻辑,我们就可以构造函数来获得当前页面的这个参数组成下一个访问页面的URL链接。
def get_since_id(count_id,header,sin_id):
#构造一个函数得到当前页面的since_id参数
import requests,time
from urllib.parse import urlencode
base_url='https://m.weibo.cn/api/container/getIndex?'
info={
'uid':str(count_id),
'type':'uid',
'value':str(count_id),
'containerid':'107603'+str(count_id),
'since_id':sin_id
}
URL=base_url+urlencode(info)#构造当前页面的URL
print('为了获取下一个since_id的URL:\n',URL)
r=requests.get(URL,headers=header)
#print(r.json())
if r.json()['ok']==0:#如果正常访问出错
time.sleep(3)#休眠时间
r=requests.get(URL,headers=header,timeout=6)#应该属于加载错误,重新再加载一次
if r.json()['ok']==0: