前情提要
本次爬取有未解决的问题
1.用urlencode合成的url解析出错
2.微博爬取个人微博页面不知道如何翻页
但是操作和代码可以实现在m.weibo.cn输入关键字后出现的页面的 爬取
一、具体操作及注意事项
1.获取解析json文件
微博有
weibo.com和m.weibo.cn两种页面
从weibo.com打开要爬的页面 XHR中全是视频分流数据 找不到需要的文件
所以要注意换为m.weibo.cn这个网址
如果分析某个人的个人微博暂时还未找到url翻页的规律
本次通过搜索关键字爬取整个关键字下面的内容
以这种方式输入url 输出后url正常但是解析json数据异常
因为本次只改变page后面的数 所以去掉params传入的方式 直接传入
发现可以输出解析的json文件
代码:
def getjson(p):
url = 'https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E5%A4%A7%E6%95%B0%E6%8D%AE&page_type=searchall&page='+str(p)
'''params = {
'containerid':'100103',
'type':'1',
'q':'大数据',
'page_type':'searchall',
'page':p
}
url = base_url + urlencode(params)'''
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
}
cookies={
'_T_WM':'45882317882',
'XSRF-TOKEN':'ee8062',
'WEIBOCN_FROM':'1110006030',
'MLOGIN':'0',
'M_WEIBOCN_PARAMS':'luicode%3D10000011%26lfid%3D1076032286908003%26fid%3D100103type%253D1%2526q%253D%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE%26uicode%3D10000011'
}#这里的headers和cookies需要自己从网站中复制
try:
res = requests.get(url,headers=headers,cookies=cookies)
if res.status_code == 200:
return res.json()
except requests.ConnectionError as e:
print('抓取错误', e.args)
2.获取微博内容
将下图的url复制到火狐浏览器中 出现json格式的文件(别的浏览器无法出现 可以复制到json在线解析 进行解析 或者直接从preview中看)
def wb_bigdata(json):
items = json.get('data').get('cards')#先定位到cards 因为cards下是列表 此时items返回的也是列表
#print(items)
for item in items:
item2 = item.get('mblog')#定位到mblog
#print(item2)
if item2:
data = {
'id': item2.get('id'),
'text': pq(item2.get("text")).text(), # 仅提取内容中的文本(pq为前面调用的pyquery包 用于网页解析 因为直接item2.get(“text”)得到的是所有的文本加视频图片链接 比较混乱 所以这里获取text比较特殊)
'attitudes': item2.get('attitudes_count'),
'comments': item2.get('comments_count'),
'reposts': item2.get('reposts_count')
}
yield data #生成器 相当于return 但是把数据暂时保存起来 最终输出 如果直接用return输出的是最后的一段数据
3.存入MongoDB数据库
首先在cmd下打开mongodb
打开mongodb-compass可视化界面
代码如下:
def w_mongodb(results):
myclient = pymongo.MongoClient('mongodb://127.0.0.1:27017')#链接到MongoDB
mydb = myclient["wb_bigdata"]#链接到数据库
mycol = mydb["bigdata"]#连接到表
for result in results:
myset = [result]
mycol.insert_many(myset)#输入
print("成功")
总代码及结果展示
import requests
from pyquery import PyQuery as pq
import pymongo
from pymongo import MongoClient
def getjson(p):
url = 'https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E5%A4%A7%E6%95%B0%E6%8D%AE&page_type=searchall&page='+str(p)
'''params = {
'containerid':'100103',
'type':'1',
'q':'大数据',
'page_type':'searchall',
'page':p
}
url = base_url + urlencode(params)'''
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
}
cookies={
'_T_WM':'45882317882',
'XSRF-TOKEN':'ee8062',
'WEIBOCN_FROM':'1110006030',
'MLOGIN':'0',
'M_WEIBOCN_PARAMS':'luicode%3D10000011%26lfid%3D1076032286908003%26fid%3D100103type%253D1%2526q%253D%25E5%25A4%25A7%25E6%2595%25B0%25E6%258D%25AE%26uicode%3D10000011'
}
try:
res = requests.get(url,headers=headers,cookies=cookies)
if res.status_code == 200:
return res.json()
except requests.ConnectionError as e:
print('抓取错误', e.args)
def wb_bigdata(json):
items = json.get('data').get('cards')
#print(items)
for item in items:
item2 = item.get('mblog')
#print(item2)
if item2:
data = {
'id': item2.get('id'),
'text': pq(item2.get("text")).text(), # 仅提取内容中的文本(pq为前面调用的pyquery包 用于网页解析 因为直接item2.get(“text”)得到的是所有的文本加视频图片链接 比较混乱 所以这里获取text比较特殊)
'attitudes': item2.get('attitudes_count'),
'comments': item2.get('comments_count'),
'reposts': item2.get('reposts_count')
}
yield data #生成器 相当于return 但是把数据暂时保存起来 最终输出 如果直接用return输出的是最后的一段数据
def w_mongodb(results):
myclient = pymongo.MongoClient('mongodb://127.0.0.1:27017')
mydb = myclient["wb_bigdata"]
mycol = mydb["bigdata"]
for result in results:
myset = [result]
mycol.insert_many(myset)
print("成功")
if __name__=='__main__':
for page in range(1,10):
json=getjson(page)
results=wb_bigdata(json)
#print(result)
w_mongodb(results)
输出结果:
数据库结果