笨方法爬某网站20张之后的图片

查看 59|回复 2
作者:虞美人草   
发现论坛不少人都讨论过这个网站,上个月学爬虫,就想了个笨方法,可以爬取这个网站没改版前的页面超过20张的限制(就是列表页12页之后的链接,这是2月的时候,现在估计还得往后了,估计13页或者14之后的链接了),方法很笨,大神们估计有更好的办法。
ps:个人感觉这网站图也没那么好看,这一两年网上搜学爬虫都是拿这个站练手。。导致这个网站好像也在不断更迭反爬技术,这网站图一般般,主要是分辨率不大,我喜欢分辨率大点的,当然了主要是限制看20张以后的图片,这就让人很抓心,得不到的永远是最好的,然后,然后我后面就想到了个笨办法实现了后面20张图片下载
下载了几个列表页,后面没下了,限制太多,下的太慢。。。加上分辨率确实不行
原理
很简单,就是就是先判断图片地址是几位数的,这网站的图片地址总共有3种情况
10,11和超过11长度的,超过11长度的,那就没办法了下载了,可能性太多,为了下图片还不至于,10的话,最简单直接猜最后字母就行,11的话,也简单,猜最后两位的字母

我刚试了下,找到上个月的代码还能用
字母顺序可以优化下,频率高的放前面,基本上5 6个之内就能猜出来正确的地址,基本也就前面几个字母
注意:
这个方法只能下载,列表页12页之后的所有链接,12页之前的就没办法下载了(2月的时候是12页之后的,3月估计更新了那就只能是13页之后,或者14页后面的。。。)
改了下代码,有两种模式,模式一可以修改列表那的数量,模式二可以选择自己喜欢的页面下载了,多条链接可以用英文,号隔开

最后要有违规的话,麻烦删下。。。
import re
import os
import requests
headers = {
    'cache-control': 'no-cache',
    'pragma': 'no-cache',
    'referer': 'https://mmzztt.com/',
    'sec-ch-ua': '"Microsoft Edge";v="107", "Chromium";v="107", "Not=A?Brand";v="24"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'image',
    'sec-fetch-mode': 'no-cors',
    'sec-fetch-site': 'cross-site',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35',
}
path = 'D:\\down\\img\\'  # 这里是图片保存的目录
zmb = ['c', 'b', 'a', 'i', 'h', 'f', 'e', 'g', 'd', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
       'w', 'x', 'y', 'z']
lb_zz = re.compile('uk-margin-small-top uk-margin-remove-bottom">')
nry_zz = re.compile('referrerpolicy="origin" src="(.*?)"')
bt_zz = re.compile(r'(.*?)')
max_zz = re.compile('max="(.*?)">')
def tudzjx(nry):
    for turl in nry:
        tp_request = requests.get(url=turl, headers=headers)
        tpurl = nry_zz.search(tp_request.text).group(1)
        bt = bt_zz.search(tp_request.text).group(1).replace('"', '').replace('"', '')
        maxd = max_zz.search(tp_request.text).group(1)
        tpurlname = tpurl.split('/')[-1]
        if len(tpurlname) >= 11:
            print('改版后页面跳过~换。。。')
            continue
        elif len(tpurlname) == 10:
            print('分析中。。。。。。')
            print('可以下载超过15张图')
            tpxzlj = re.search('^(.*)(?=\w{3}\.)', tpurl).group(1)
            xztt_10(tpxzlj, maxd, bt, tpurlname)
        else:
            print('可以下载超过15张图')
            tpxzlj = re.search('^(.*)(?=\w{2}\.)', tpurl).group(1)
            xztt_10(tpxzlj, maxd, bt, tpurlname)
def xztt_10(tpxzlj, maxd, bt, tpurlname):
    for x in range(1, int(maxd) + 1):
        for y in zmb:
            if len(tpurlname) == 10:
                tt = f"{tpxzlj}{'0' + str(x) if x

列表, 网站

虞美人草
OP
  

这个从第一张图片开始就猜了,有动手能力的可以结合,https://www.52pojie.cn/thread-1761595-1-1.html 这个帖子优化下
gqdsc   

有时笨方法就是好方法,哈哈,感谢
您需要登录后才可以回帖 登录 | 立即注册

返回顶部