鱼C论坛

 找回密码
 立即注册
查看: 3063|回复: 17

[作品展示] 煎蛋爬虫,终于搞定了,没有了 403 forbidden,基本上就是基于 小甲鱼老师 的代码

[复制链接]
发表于 2020-12-16 23:57:27 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 Daniel_Zhang 于 2021-2-9 15:00 编辑
import urllib.request as u_request
import os, re, base64, requests

header ={}
header['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

def url_open(url):

    html = requests.get(url, headers=header).text
    return html

def find_images(url):
    html = url_open(url)

    m = r'<img src="([^"]+\.jpg)"'
    match = re.findall(m, html)

    for each in range(len(match)):
        match[each] = 'http:' + match[each]
        print(match[each])

    return match

def save_images(folder, img_addrs):
    for each in img_addrs:
        try:
            req = u_request.Request(each, headers = header)
            response = u_request.urlopen(req)
            cat_image = response.read()
            filename = each.split('/')[-1]
            with open(filename,'wb') as f:
                f.write(cat_image)
            #print(each)
        except OSError as error:
            print(error)
            continue
        except ValueError as error:
            print(error)
            continue

def web_link_encode(url, folder):
    for i in range(180,200):
        string_date = '20201216-'
        string_date += str(i)
        string_date = string_date.encode('utf-8')
        str_base64 = base64.b64encode(string_date)
        page_url = url + str_base64.decode() + '=#comments'
        print(page_url)
        img_addrs = find_images(page_url)
        save_images(folder, img_addrs)

def download_the_graph(url):
    folder = 'graph'
    os.mkdir(folder)
    os.chdir(folder)
    web_link_encode(url, folder)

if __name__ == '__main__':
    url = 'http://jandan.net/pic/'
    download_the_graph(url)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-26 16:42:39 | 显示全部楼层
Daniel_Zhang 发表于 2020-12-16 23:59
第9行那里是 req

另外,现在的煎蛋进行了反爬虫设置,图片的标号进行了 base64 加密。图片的 image_addr ...

这里是2021年3月26日运行成功的最新代码,是楼主代码的更新
import urllib.request as u_request
import os, re, base64
import requests
import time

header ={}
header['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'

def url_open(url):

    html = requests.get(url, headers=header).text
    return html


def find_images(url):
    html = url_open(url)

    m = r'<img src="([^"]+\.jpg)"'
    match = re.findall(m, html)

    for each in range(len(match)):
        match[each] = 'http:' + match[each]
        print(match[each])

    return match

def save_images(folder, img_addrs):
    for each in img_addrs:
        try:
            req = u_request.Request(each, headers = header)
            response = u_request.urlopen(req)
            cat_image = response.read()
            filename = each.split('/')[-1]
            with open(filename,'wb') as f:
                f.write(cat_image)
            #print(each)
        except OSError as error:
            print(error)
            continue
        except ValueError as error:
            print(error)
            continue

def web_link_encode(url, folder):
    for i in range(1,105):
        string_date = '20210325-'
        string_date += str(i)
        string_date = string_date.encode('utf-8')
        str_base64 = base64.b64encode(string_date)
        page_url = url + str_base64.decode() + '=#comments'
        print(page_url)
        img_addrs = find_images(page_url)
        save_images(folder, img_addrs)
        time.sleep(2)

def download_the_graph(url):
    folder = 'graph'
    os.mkdir(folder)
    os.chdir(folder)
    web_link_encode(url, folder)

if __name__ == '__main__':
    url = 'http://jandan.net/girl/'
    download_the_graph(url)

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
Daniel_Zhang + 5 + 5 + 3 不错

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-12-16 23:59:30 | 显示全部楼层
第9行那里是 req

另外,现在的煎蛋进行了反爬虫设置,图片的标号进行了 base64 加密。图片的 image_addr 也被去掉了 'http:' 的开头
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 18:10:04 | 显示全部楼层
学习了,终于找到了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-12 09:49:01 | 显示全部楼层
感谢,昨天找了一整天没解决唉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-12 15:20:10 | 显示全部楼层
空白的天 发表于 2021-1-12 09:49
感谢,昨天找了一整天没解决唉

注意最后几行的那个string_date,煎蛋那个好像是按照日期加数字的形式进行图片编号的。所以我此处的还不是很完善,理论上是只能获取20201216的图片的,但是这个问题应该是不难调整的,给一个 int 类型的日期作为起始值,for循环每次加一,然后按照月份去计算30 还是 31 天一个月,最后转换日期成 string 类型,别忘了在日期末尾加上横杠
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-12 19:55:31 | 显示全部楼层
Daniel_Zhang 发表于 2021-1-12 15:20
注意最后几行的那个string_date,煎蛋那个好像是按照日期加数字的形式进行图片编号的。所以我此处的还不是 ...

谢谢,我是新人233,不过大概的能看懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-12 23:08:47 | 显示全部楼层
空白的天 发表于 2021-1-12 19:55
谢谢,我是新人233,不过大概的能看懂

嗯啊,看懂了就自己动动手呀,多练习,分享到论坛里一起交流
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-13 08:47:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-13 09:59:33 | 显示全部楼层
Daniel_Zhang 发表于 2021-1-12 23:08
嗯啊,看懂了就自己动动手呀,多练习,分享到论坛里一起交流

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

使用道具 举报

发表于 2021-1-16 02:50:35 | 显示全部楼层
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]
page_num = int(get_page(url))

好像没有用了,是不是可以删掉
我把download_the_graph(folder = 'graph', pages=10)函数里的page_num = int(get_page(url))注释掉还可以运行,并且结果一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-16 16:36:38 | 显示全部楼层
洋洋痒 发表于 2021-1-16 02:50
好像没有用了,是不是可以删掉
我把download_the_graph(folder = 'graph', pages=10)函数里的page ...

那有可能它本来就是 int 类型的,不需要转 int 吧~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-16 23:07:54 | 显示全部楼层
Daniel_Zhang 发表于 2021-1-16 16:36
那有可能它本来就是 int 类型的,不需要转 int 吧~

我的意思是说…………你整个download_the_graph(folder = 'graph', pages=10)函数里没有用到get_page(url)
所以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]

和page_num = int(get_page(url))可以删掉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-17 00:05:33 | 显示全部楼层
洋洋痒 发表于 2021-1-16 23:07
我的意思是说…………你整个download_the_graph(folder = 'graph', pages=10)函数里没有用到ge ...

昂,好像是这么个道理。那个是因为之前煎蛋它是有一个翻页按钮的好像?

我这个就不需要获取那个的信息了,直接在url里面修改页面?不太记得了

反正这个是用来改第几页第几页的

仔细看了一下,确实可以去除,谢谢指正啦~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-21 11:23:18 | 显示全部楼层
def web_link_encode(url, folder):
    for i in range(180,200):
        string_date = '20201216-'
        string_date += str(i)
        string_date = string_date.encode('utf-8')
        str_base64 = base64.b64encode(string_date)
        page_url = url + str_base64.decode() + '=#comments'
        print(page_url)
        img_addrs = find_images(page_url)
        save_images(folder, img_addrs)


大大 为什么这里是range(180,200)
什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-21 14:45:31 | 显示全部楼层
柒s 发表于 2021-3-21 11:23
大大 为什么这里是range(180,200)
什么意思

你可以单独研究一下 jiandan 网址的加密解密 encode decode base64

具体是什么原因做 180 - 200 我不太记得了,你可以尝试改成其他数据

应该是一个翻页用的数字,页码什么的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-29 10:14:29 | 显示全部楼层

NULL

本帖最后由 alwonwang 于 2021-3-29 16:05 编辑

嘿嘿删掉,重复了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-29 10:15:15 | 显示全部楼层
柒s 发表于 2021-3-21 11:23
大大 为什么这里是range(180,200)
什么意思

这里的180-200指的是要爬取的页面范围
煎蛋网定期会对图片进行封存,所以页面范围也会有所变化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-15 23:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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