连续趁着快下班的时候看了三集秦时明月~
在兴致大发之下想对秦时明月吧的一些壁纸进行爬虫保存,以后写文章还是当壁纸都是不错的。于是在贴吧挑选了下,锁定了https://tieba.baidu.com/p/2135253597#!/l/p1这个地址。
分析了下参数:
url:https://tieba.baidu.com
2135253597:贴吧的id
p1:page1,即第一页
本以为可以用python+正则分分钟搞定的事结果发现我太年轻了。
选择一张图片右键审核元素对这个图片链接进行分析
原本以为用正则匹配+pageNum遍历下各个页面就ok。
没想到直接报错,难道正则错了,还是匹配不到。
复制源代码进行匹配,发现无法匹配到?
贪婪模式怎么可能匹配不出?
不服气的我右键源代码,Ctrl+F查找发现还是红红的,都没有
不能忍啊,既然不是正则的问题我猜测可能是用ajax做一个一步请求获得图片或者用json。
按F12抓包分析,选择html+图像
我们只需盯紧域名为tieba.baidu.com的链接。
进行了筛选,得到如下链接可能存在图片真实的地址。
http://tieba.baidu.com/photo/g/bw/picture/list?kw=%E7%A7%A6%E6%97%B6%E6%98%8E%E6%9C%88&alt=jview&rn=200&tid=2135253597&pn=2&ps=1&pe=40&info=1&_=1490597894685&red_tag=g3483733245
https://tieba.baidu.com/p/getLikeForum?uid=856174149
https://tbmsg.baidu.com/gmessage/get?mtype=1&_=1490597894244
对比以上链接的json信息,从第一个链接的json信息里挑取第一条链接进行访问:
http://imgsrc.baidu.com/forum/w=288/sign=f1037fe7ef24b899de3c7e3056071d59/a2f05fc2d56285353ce687c696ef76c6a6ef6377.jpg
得到下图:
从json信息里挑取第二条链接进行访问:
http://imgsrc.baidu.com/forum/w%3D288/sign=f1037fe7ef24b899de3c7e3056071d59/a2f05fc2d56285353ce687c696ef76c6a6ef6377.jpg
我们可以看出这个json存着一张图片的不同分辨率的两个链接,且第二个链接分辨率比较大。
页面上小分辨率的效果:
页面上大分辨率的效果:
因此我们只要对这个链接进行爬虫,抓取每个page的json里面的链接,然后再进行图片的下载就ok了。
但是发现在第一页爬下来的区区40张图片,略表不服。难道有没有匹配到的链接?在json的源码中进行字符串查找。
发现确实只有80个jpg链接,40个略缩图,40个大的图。
第一页的图片都不止四十张…..于是猜测是不是有多次json请求?
用Firebug的筛选器筛选出含有tieba.baidu.com/photo/g/bw/ 的所有链接
发现确实请求了五次链接。
既然获取了五次json,我们可以对比下这链接有什么不同?
http://tieba.baidu.com/photo/g/bw/picture/list?kw=%E7%A7%A6%E6%97%B6%E6%98%8E%E6%9C%88&alt=jview&rn=200&tid=2135253597&pn=2&ps=1&pe=40&info=1&_=1490597894685&red_tag=q0608234756
http://tieba.baidu.com/photo/g/bw/picture/list?kw=%E7%A7%A6%E6%97%B6%E6%98%8E%E6%9C%88&alt=jview&rn=200&tid=2135253597&pn=2&ps=41&pe=80&info=1&_=1490597894685&red_tag=q0608234756
用在线文本对比工具对比
其实可以目测,但是我懒,得知ps和pe两个参数控制着json获取图片链接的范围,第一个链接是1-40,第二个链接是41-80。
它发出五次请求,那么我们构造链接:
http://tieba.baidu.com/photo/g/bw/picture/list?kw=%E7%A7%A6%E6%97%B6%E6%98%8E%E6%9C%88&alt=jview&rn=200&tid=2135253597&pn=2&ps=1&pe=200&info=1&_=1490597894685&red_tag=q0608234756
在json中获取了全部jpg链接,顺带的发现,pn参数是控制页面的。还记得我们之前误以为是如花的那个链接么?
https://tieba.baidu.com/p/2135253597#!/l/p1
这里的pn=1参数和相当与p1,这样我们就可以扒下所有的图片了。
骚年,别爬av了,拿起手里的键盘。和我一次支持国产动画吧。
附上源码:
import urllib.request
import json,os
import re
#http://tieba.baidu.com/photo/g/bw/picture/list?kw=%E7%A7%A6%E6%97%B6%E6%98%8E%E6%9C%88&alt=jview&rn=200&tid=2135253597&pn=2&ps=1&pe=200&info=1&_=1490597894685&red_tag=q0608234756
class BDTB:
def __init__(self,url):
self.url = url
def getpage(self):
os.mkdir('pictures2')
os.chdir(os.path.join(os.getcwd(), 'pictures2'))
cc= 0
try:
for pageNum in range(10):#have nine pages
url = self.url+str(pageNum)+'&ps=1&pe=200&info=1&_=1490597894685&red_tag=q0608234756'
response = urllib.request.urlopen(url).read()
response = json.loads(response.decode("gbk"))
image_url= response["data"]["pic_list"]
cc +=1
# for dd in image_url:
# purl = dd['purl']
#print image_url[1]['purl']
for i in range(len(image_url)):
picture_name =str(cc*i) + '.jpg'
#print picture_name
try:
urllib.request.urlretrieve(image_url[i]['purl'], picture_name)
print("Success to download " + image_url[i]['purl'])
except:
print("Fail to download " + image_url[i]['purl'])
except Exception as err:
print (err)
#(u"\u8fde\u63a5\u5931\u8d25")
return None
if __name__=='__main__':
URL = "http://tieba.baidu.com/photo/g/bw/picture/list?kw=%E7%A7%A6%E6%97%B6%E6%98%8E%E6%9C%88&alt=jview&rn=200&tid=2135253597&pn="
BDTB = BDTB(URL)
BDTB.getpage()