前一段时间看了崔庆才老师的书,爬取微博信息,于是想写一个爬取微博信息的爬虫,这里爬一个我比较喜欢的女明星的微博,谭松韵。
首先说明一点,微博真的是坑,
和
差距是真的大
崔庆才老师是按下面的微博讲的,而我被上面一个微博盘了一下午,心态爆炸。
好了,先上代码,因为崔庆才老师的书虽然不算旧,但网站一直在变化,所以我在这里只是借鉴,代码差距还是很大的
import requests
import re
from pymongo import MongoClient
client = MongoClient()
db = client['weibo']
collection = db['weibo_t2']
headers = {
'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36',
'Referer' : 'https://m.weibo.cn/u/1307418975?uid=1307418975&luicode='
'10000011&lfid=100103type%3D1%26q%3D%E8%B0%AD%E6%9D%BE%E9'
'%9F%B5&sudaref=m.weibo.cn&display=0&retcode=6102',
}
def parse_page(url):
resp = requests.get(url , headers=headers)
# print(resp.json())
text = resp.json()
items = text.get('data').get('cards')
# print(items)
# print(type(items))
for itme in items:
result = itme.get("card_style")
if not result:
itme = itme.get('mblog')
# print(itme)
weibo_t = {}
weibo_t['id'] = itme.get('id')
# print(itme.get('id'))
text = itme.get('text')
text = re.sub(r'<.*?>' , '' , text).strip()
# print(text)
weibo_t['text'] = text
weibo_t['attitudes'] = itme.get('attitudes_count')
# print(itme.get('attitudes_count'))
weibo_t['comments'] = itme.get('comments_count')
# print(itme.get('comments_count'))
weibo_t['reposts'] = itme.get('reposts_count')
# print(itme.get('reposts_count'))
save_to_mongo(weibo_t)
def main():
for x in range(1,10):
url = 'https://m.weibo.cn/api/container/getIndex?uid=1307418975&luicode' \
'=10000011&lfid=100103type%3D1%26q%3D%E8%B0%AD%E6%9D%BE%E9%9F%B5&su' \
'daref=m.weibo.cn&display=0&retcode=6102&type=uid&value=1307418975&con' \
'tainerid=1076031307418975&page={}'.format(x)
parse_page(url)
def save_to_mongo(weibo_t):
if collection.insert(weibo_t):
print("存储完成")
if __name__ == '__main__':
main()
代码不长,注释均为测试代码,这里有几点要说明。
一:请先启动数据库
二:这里爬取10页,如果按照崔庆才老师的代码爬取,在第一页就会报错,我们来看看为什么。首先我们进到谭松韵微博首页
我们注意到,春分十五是她的最新微博,然而,重点来了,下面有个她关注,就是这么个玩意,坑了我好久。我们来分析一下ajax
看0,1,2之间的区别,0,2都是微博,然而1却是类似广告的东西,它的格式也是不一样的,我们需要过滤掉。方法如下
result = itme.get("card_style")
if not result:
我们注意到,广告它虽然在我们请求的ajax页面里,但它多了一项card_style的东西,我们利用它就可以过滤掉。
三,我们还应该注意一点
第一页是微博主页,它是没有微博内容的,像这样:
那么剩下的就是很中规中矩的分析和爬取存储了,没什么好说的。
另外,大家如果不擅长分析ajax,利用json提取数据的话,还有另一种爬取方法,
我们应该注意到,在我们分析的ajax的json数据中
有这么一项,这个是微博详情页
我们也可以提取所有的scheme属性的链接,然后爬取详情页,通过xpath或者re等手段拿到我们想要的数据。
展示一下数据库
这里只是部分,可以加大页数,另外,我该安装compass了。
以上,记录我被微博盘到崩溃的两天。