首先当然是成果镇楼
流程图
1.打开网页
2.得到个人微博数量并计算微博页数
3.爬取某一页
4.解析某一个
5.重复3-4直至全部完成
准备工作
打开https://m.weibo.cn,然后随便搜一个名人,爬取名人的微博比较好,因为他们微博数量多嘛.粉丝也多.然后如下
你一直往下拉是不是会发现有很多新的蹦出来,别怕那不是怪兽,那是Ajax.这就是传说的动态网页.随便点开一个,你能发现url的构造方式,如下
然后再点preview,如下.数据是以json形式传输的,那么就在下图里面啦.
是不是很清晰明了啊.好了.从cards里面你就可以发现所有你想要的啦.接下来我们就开始爬啦.
需要的库
import requests
from fake_useragent import *
from urllib.parse import urlencode
from pyquery import PyQuery as pq
from pymongo import MongoClient
from requests.exceptions import ConnectionError
得到最大页
def getPageNumber(html):
if html.get('data').get('cardlistInfo'):
data = html.get('data').get('cardlistInfo')
number = int(data.get('total'))
pageNumber = number // 10 + 1
return pageNumber
最大页数在页码传回来的字典里面.而每一页包含十条微博内容,那么页码就是总微博条数除以10,在加上1.
爬取某一页
def openPage(page):
base_url = 'https://m.weibo.cn/api/container/getIndex?'
ua = UserAgent()
headers = {
'User-Agent': ua.random
}
params = {
'type': 'uid',
'value': '1826792401',
'containerid': '1076031826792401',
'page': page
}
url = base_url + urlencode(params)
try:
response = requests.get(url,headers)
if response.status_code == 200:
return response.json()
except ConnectionError:
return None
首先是传入基础url,这里的基础url是指url里面不会变化的那部分,然后构造请求头.这里我用了fake_useragent库来随机得到一个headers.params是构造网页的参数.上面的Ajax里面都是网页,网页有四个参数,我们将page传入函数构造url.然后就是用requests请求爬取页码,然后传回json数据.
解析某一页
def parsePage(html):
data = html.get('data').get('cards')
for item in data:
if item.get('card_type') == 9:
message = {}
message['rawText'] = item.get('mblog').get('raw_text')
message['text'] = pq(item.get('mblog').get('text')).text()
message['commentsCount'] = item.get('mblog').get('comments_count')
message['attitudesCount'] = item.get('mblog').get('attitudes_count')
message['repostsCount'] = item.get('mblog').get('reposts_count')
message['source'] = item.get('mblog').get('source')
yield message
parsePage()函数只有一个参数,这个参数就是页面代码.这里是字典形式返回的.然后存入一个字典.然后循环提取.
保存
def saveToMongo(item):
if collection.insert(item):
print('Save Successful')
def saveToFile(item):
with open('weibo.txt', 'a', encoding='utf-8') as f:
f.write('='*50 + '\n')
if item.get('rawText') == None:
item['rawText'] = ''
f.write(item.get('text') + item.get('rawText')+ '\n')
f.write('评论:' + str(item.get('commentsCount')) + '\n')
f.write('转发:' + str(item.get('repostsCount')) + '\n')
f.write('点赞:' + str(item.get('attitudesCount')) + '\n')
第一个函数是存入数据库,第二个是存入txt文档.存入txt文档的时候处理了一下,如最开始的镇楼图.rawText保存的是转发的内容.text里面保存的才是作者发的内容.
总结
接下来就是用一个for循环,循环爬取所有的微博信息.想要源代码的记得留言.
向上的Lennox是我的微信公众号,想要学爬虫的大佬们,我们可以一起.