最近需要一些拍照的指导,想爬取微博里的相册,m站比pc站好爬,先看看pc的network。
顺利找到网址,不过pc的分页方式让我分方,感觉像是开始以为是时间戳,可能是图片的数据库自生成id,这样一来就只能一页24个图像来爬,很慢。
还是看看m站,要访问m站,需要的工具,chrome。
还是先在pc端用chrome开要下载的页面,比如这次的 黄二疑的相册
https://weibo.com/p/1005052298961991/photos?from=page_100505&mod=TAB#place
然后F12,左上角防移动端图标
页面就会变成这样
刷新就可以了。
在XHR发现了数据网址。
https://m.weibo.cn/api/container/getSecond?containerid=1078032298961991_-_photoall&page=2&count=24&title=%25E5%259B%25BE%25E7%2589%2587%25E5%25A2%2599&luicode=10000011&lfid=1078032298961991
看了看网址的参数,page=2&count=24,应该是一次返回多少数据的参数,其他的containerid应该是博主的id,假如我想爬其他博主的,只要有了id就能构造url来访问了。
试试先爬100个图。
https://m.weibo.cn/api/container/getSecond?containerid=1078032298961991_-_photoall&page=1&count=100&title=%25E5%259B%25BE%25E7%2589%2587%25E5%25A2%2599&luicode=10000011&lfid=1078032298961991
看看结果:果然回传100个图的数据。
接下来的就很简单了
import requests
import json
import re
import shutil
def mweibo():
url ='https://m.weibo.cn/api/container/getSecond'
headers ={
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
params ={
'containerid': '1078031353112775_-_photolike',
'page': 1,
'count': 100,
'title': '%E8%B5%9E%E8%BF%87%E7%9A%84%E5%9B%BE%E7%89%87',
'luicode': 10000011,
'lfid': 1078031353112775,
'type': 'uid',
'value': 1353112775}
res = requests.get(url,headers =headers,params=params)
iurl = re.findall('"pic_middle":"(.*?)","pic_', res.text)
for imgurl in iurl:
name = imgurl.split('\\/')[-1]
imgeurl = 'http://wx4.sinaimg.cn/mw1024/' + name
res2 = requests.get(imgeurl, stream=True, headers=headers)
f = open(name, 'wb')
shutil.copyfileobj(res2.raw,f)
f.close()
del res2
回传的是标准json,为啥没有用json来解析,因为微博弄得json及其复杂,dict先套了一层list又套一层dict再来一层list才到url。这个小伙伴用的json解析
直接用re正则比较快。
m站的另一个问题是经常刷不出数据,原以为是headers没构造好,但是我用手机上m站也是不行,搞不清楚为啥,好像带着登陆之后的cookies要好点,就直接导致数据时有时无,有点忧伤。
网友评论