鱼C论坛

 找回密码
 立即注册
查看: 881|回复: 5

56讲 OOXX 煎蛋网反爬问题,程序写完了才在最后一步触发反爬程序,绝望!!

[复制链接]
发表于 2020-8-14 21:38:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
煎蛋网对图片有保护,只能爬到一个防伪码,请教这是哪种反爬措施,有破解方法吗?没有完美结束这一课的学习,让我强迫症很不爽,代码,运行结果如下:
from urllib import request
from bs4 import BeautifulSoup
import re
import base64
import os

def main():
    #新建文件夹
    os.mkdir('OOXX')
    os.chdir('OOXX')
    
    url='http://jandan.net/ooxx'
    #爬取页面
    headers={}
    headers['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'
    req=request.Request(url,headers=headers)
    response=request.urlopen(req).read().decode('utf-8')
    #调用soup处理页面
    soup=BeautifulSoup(response,'html.parser')
    links_list=soup.find(attrs={'class':'cp-pagenavi'})
    #调用函数寻找初始页码链接,links为字典{page:'',link:''}
    pages_list=findlinks(links_list)
    page=int(pages_list['page'])
    page_link='http:'+pages_list['link']
    stop_page=page-5
    #爬取当前页的图片
    comment_list=soup.find(attrs={'id':'comments'})
    print(comment_list)
    img_list=comment_list.find_all('img')
    print(img_list)
    #下载指定图片
    for item in img_list:
        img_url='http:'+item['src']
        print(img_url)
        filename=item['src'].split('/')[-1]
        headers2={}
        headers2['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'
        req2=request.Request(img_url,headers=headers)
        response2=request.urlopen(req2).read()
        with open(filename,'wb') as f:
            f.write(response2)
    
    
    while True:
        #爬取图片
        find_img(page_link)
        #处理链接(返回下一个页面对应的链接)
        page_link=handle_link(page_link)
        
        page-=1
        if page==stop_page:
            break

def findlinks(links_list):
    target=links_list.find('a')
    page=target.text
    link=target['href']
    res={'page':page,'link':link}
    return res

def handle_link(page_link):
    page_num=re.search('jandan.net/ooxx/(.+?)#',page_link).group(1)
    page_num=str(base64.b64decode(page_num),'utf-8')
    num=page_num.split('-')[1]
    date=page_num.split('-')[0]
    num=str(int(num)-1)
    page_num='-'.join((date,num))
    page_num=str(base64.b64encode(page_num.encode('utf-8')),'utf-8')
    link='http://jandan.net/ooxx/'+page_num+'#comments'
    return link

def find_img(page_link):
    #爬取对应页面内容
    headers={}
    headers['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'
    req=request.Request(page_link,headers=headers)
    response=request.urlopen(req).read().decode('utf-8')
    #使用BeautifulSoup获取指定图片
    soup=BeautifulSoup(response,'html.parser')
    comment_list=soup.find(attrs={'class':'commentlist'})
    img_list=comment_list.find_all('img')
    #下载指定图片
    for item in img_list:
        img_url='http:'+item['src']
        filename=item['src'].split('/')[-1]
        headers2={}
        headers2['User-Agent']='Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'
        req2=request.Request(img_url,headers=headers)
        response2=request.urlopen(req2).read()
        with open(filename,'wb') as f:
            f.write(response2)
    



if __name__=='__main__':
    main()
运行结果:
微信图片_20200814213745.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-3 11:12:15 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-16 17:47:35 | 显示全部楼层

回帖奖励 +3 鱼币

对此我也很焦灼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-22 12:20:31 | 显示全部楼层

回帖奖励 +3 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-14 14:03:43 | 显示全部楼层
网页好像只是加了一个base64的数字加密,2021.2.14亲测可运行
import urllib.request
import os
import base64

def url_open(url):
    req = urllib.request.Request(url)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36')
    response = urllib.request.urlopen(req)
    html = response.read()

    return html


def get_page(url):
    html = url_open(url).decode('utf-8')

    a = html.find('current-comment-page')+23
    b = html.find(']',a)

    return html[a:b]


def find_imgs(url):
    html = url_open(url).decode('utf-8')
    img_addrs = []

    a = html.find('img src=') 

    while a != -1:
        b = html.find('.jpg',a,a+255)
        if b != -1: 
            img_addrs.append(html[a+9:b+4])
        else:
            b = a + 9

        a = html.find('img src=',b)

    return img_addrs

    
def save_imgs(folder,img_addrs):
     for each in img_addrs:
         filename = each.split('/')[-1]
         with open(filename,'wb') as f:
             each = 'http:' + each
             img = url_open(each)
             f.write(img)
            
def download_mm(folder='ooxx1',pages=10):
    os.mkdir(folder)
    os.chdir(folder)

    url = 'http://jandan.net/ooxx'
    page_num = int(get_page(url))

    for i in range(pages):
        page_num -= 1

        #日期+base64转码(下方改日期)
        targt_num = '20210114-' + str(page_num)
        targt_num = base64.b64encode(targt_num.encode('utf-8'))
        
        page_url = url +'/' + str(targt_num,'utf-8')+'#comments'#网页链接
        img_addrs = find_imgs(page_url)#图片地址
        save_imgs(folder, img_addrs)#图片地址保存

if __name__ == "__main__":
    download_mm()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-10 09:27:25 | 显示全部楼层
qqw 发表于 2021-2-14 14:03
网页好像只是加了一个base64的数字加密,2021.2.14亲测可运行

请教怎么分析出是base64加密的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 08:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表