首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >看秦时明月引起的一次爬虫

看秦时明月引起的一次爬虫

作者头像
lonelyvaf
发布2018-06-07 14:56:14
9020
发布2018-06-07 14:56:14
举报

连续趁着快下班的时候看了三集秦时明月~

在兴致大发之下想对秦时明月吧的一些壁纸进行爬虫保存,以后写文章还是当壁纸都是不错的。于是在贴吧挑选了下,锁定了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()
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-03-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 晨星先生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档