小白教程-——如何爬虫新浪微博用户图片,手把手教你
程序员文章站
2023-12-23 00:02:16
...
第一步 获取微博用户uid
简单版获取微博数据 不用拟登录 我们就需要用到 微博的手机版网站
链接: link.
找到想要获取的用户 获取链接里的uid
再检查网页,找到微博的api接口,接口里获取的数据包就有我们想要的内容
第二步 写代码
前期分析完后我们就可以来写代码了 欧耶
```python
import pprint
import requests
import time
from urllib.parse import urlencode
from multiprocessing import Pool
import json
import os
先引入需要的库,pprint可以让json展现更加明了
接下来 获取单页信息 我们就可以一页一页的获取信息,不建议把这个函数合在一起写
def Get_page(page,uid):
# https://m.weibo.cn/api/container/getIndex?uid=1885611142&t=0
#&luicode=10000011&lfid=100103&type=uid&value=1885611142&containerid=1076031885611142
#这个是我取到的链接 我们可以一个个分析 发现最重要的是 uid containerid 和 page
headers = {
'Host':'m.weibo.cn',
'Referer':'https://m.weibo.cn/u/1885611142?uid=1885611142&t=0&luicode=10000011&lfid=100103type%3D1%26q%3D%E5%AD%94%E9%9B%AA%E5%84%BF',
'X-Requested-With':'XMLHttpRequest',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
#这个可以从你的浏览器里检查网页里面找 目的是模拟浏览器申请页面
}
params={
'uid':uid,
't':0,
'luicode':10000011,
'lfid':100103,
'containerid':'107603'+str(uid),
'page':page
}
url='https://m.weibo.cn/api/container/getIndex?' +urlencode(params)
response=requests.get(url,headers=headers,timeout=10)
re=response.json()
try:
if response.status_code==200:
# pprint.pprint(re)
return re
except requests.ConnectionError as e:
print("error",e.args)
然后获取每个图片的url
def Get_imge(re):
picsurl=[]
items=re.get('data').get('cards')
for item in items:
try:
pics=item.get('mblog').get('pics')
if pics is not None:
for p in pics:
v=p.get('large').get('url')
print(v)
picsurl.append(v)
except:continue
return picsurl
然后就是下载照片啦 注意每个文件名不能一样 所以我们用链接后面的乱码为文件名
def DownLoadPics(picsurl,sin_id):
headers = {
'X-Requested-With':'XMLHttpRequest',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36',
'referer': 'https://m.weibo.cn',
}
wen="C:/"+sin_id
if not os.path.exists(wen):
os.makedirs(wen)
for i in picsurl:
qr=requests.get(i,headers=headers)
print(qr)
path=wen+'/'+sin_id+i.split('/')[-1]
print(path)
with open(path, 'wb')as f:
f.write(qr.content)
print('-' * 10)
最后是main函数,我们爬取多个用户也不怕 只要添加uid就可以
if __name__ == '__main__':
# try:
uid=['1885611142','5620452341','2992978081','3050737061','6047467945']
for j in uid:
a=Get_page(1,j)
sin=a.get('data').get('cards')[1].get('mblog').get('user').get('screen_name')
for i in range(1,10):
o=Get_page(i,j)
a=Get_imge(o)
DownLoadPics(a,sin)
# except:pass
这个也可以多线程做 有机会我会更新多线程怎么做