1.poiid获取
可通过微博网页搜索对应关键词获取,见下图红框(本文皆以上海体育馆为例),当然还有其他方式获取,后续介绍。
2.移动端网页接口
(1)爬取接口
ret = requests.get(f'https://m.weibo.cn/api/container/getIndex?containerid=2306570042{poiid}').json()
通过get方式访问,poiid填入前文获取值。
(2)返回结果
{
"ok": 1,
"data": {
"cardlistInfo": {
"cardlist_title": "上海体育馆",
"sub_title": "月签到1181人 上海市 综合体育馆",
"address": "漕溪北路1111号",
...
],
...
}
}
"data"下的"ok"可判断该地点存在与否, "cardlistInfo"为POI具体信息,各字段名称基本上是自解释的。如cardlist_title为名称,sub_title中包含城市与类别等,address为具体地址。
3.weibo.com网页
为POI详情页,并非json格式返回接口,而是直接解析返回的HTML内容。
(1)爬取接口
ret = requests.get("https://weibo.com/p/100101" + poiid, headers={"Cookie":cookie})
通过get方式访问,poiid填入前文获取值,并且需要传入登录后的cookie。
(2)返回结果
返回结果是HTML混杂着Javascript,结构较复杂,暂不展示,在此仅提供通过正则表达式解析逻辑:
match1 = re.findall("<h1 title=.*?username.*?>(.*?)<", ret.text, flags=re.DOTALL)
match2 = re.findall("p_txt.*?: (.*?)<", ret.text, flags=re.DOTALL)
if len(match1) == 0 and len(match2) == 0:
return None
name = typ = addr = ""
if len(match1) > 0:
name = match1[0]
if len(match2) > 0:
typ = match2[0]
if len(match2) > 1:
addr = match2[1]
若该地点已不存在,则会重定向到以下页面:
此时可通过判断返回的HTTP状态码以及Location内容来判断:
if ret.status_code == 302 and "pagenotfound" in ret.headers['Location']:
return None
微博爬虫系列:
标签:get,Python,title,ret,爬取,微博,poiid From: https://blog.csdn.net/yugnahz/article/details/145096541