鱼C论坛

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

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

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

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

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

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

  3. header ={}
  4. 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'

  5. def url_open(url):

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

  8. def find_images(url):
  9.     html = url_open(url)

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

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

  15.     return match

  16. def save_images(folder, img_addrs):
  17.     for each in img_addrs:
  18.         try:
  19.             req = u_request.Request(each, headers = header)
  20.             response = u_request.urlopen(req)
  21.             cat_image = response.read()
  22.             filename = each.split('/')[-1]
  23.             with open(filename,'wb') as f:
  24.                 f.write(cat_image)
  25.             #print(each)
  26.         except OSError as error:
  27.             print(error)
  28.             continue
  29.         except ValueError as error:
  30.             print(error)
  31.             continue

  32. def web_link_encode(url, folder):
  33.     for i in range(180,200):
  34.         string_date = '20201216-'
  35.         string_date += str(i)
  36.         string_date = string_date.encode('utf-8')
  37.         str_base64 = base64.b64encode(string_date)
  38.         page_url = url + str_base64.decode() + '=#comments'
  39.         print(page_url)
  40.         img_addrs = find_images(page_url)
  41.         save_images(folder, img_addrs)

  42. def download_the_graph(url):
  43.     folder = 'graph'
  44.     os.mkdir(folder)
  45.     os.chdir(folder)
  46.     web_link_encode(url, folder)

  47. if __name__ == '__main__':
  48.     url = 'http://jandan.net/pic/'
  49.     download_the_graph(url)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

  5. header ={}
  6. 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'

  7. def url_open(url):

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


  10. def find_images(url):
  11.     html = url_open(url)

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

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

  17.     return match

  18. def save_images(folder, img_addrs):
  19.     for each in img_addrs:
  20.         try:
  21.             req = u_request.Request(each, headers = header)
  22.             response = u_request.urlopen(req)
  23.             cat_image = response.read()
  24.             filename = each.split('/')[-1]
  25.             with open(filename,'wb') as f:
  26.                 f.write(cat_image)
  27.             #print(each)
  28.         except OSError as error:
  29.             print(error)
  30.             continue
  31.         except ValueError as error:
  32.             print(error)
  33.             continue

  34. def web_link_encode(url, folder):
  35.     for i in range(1,105):
  36.         string_date = '20210325-'
  37.         string_date += str(i)
  38.         string_date = string_date.encode('utf-8')
  39.         str_base64 = base64.b64encode(string_date)
  40.         page_url = url + str_base64.decode() + '=#comments'
  41.         print(page_url)
  42.         img_addrs = find_images(page_url)
  43.         save_images(folder, img_addrs)
  44.         time.sleep(2)

  45. def download_the_graph(url):
  46.     folder = 'graph'
  47.     os.mkdir(folder)
  48.     os.chdir(folder)
  49.     web_link_encode(url, folder)

  50. if __name__ == '__main__':
  51.     url = 'http://jandan.net/girl/'
  52.     download_the_graph(url)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

另外,现在的煎蛋进行了反爬虫设置,图片的标号进行了 base64 加密。图片的 image_addr 也被去掉了 'http:' 的开头
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-17 18:10:04 | 显示全部楼层
学习了,终于找到了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-12 09:49:01 | 显示全部楼层
感谢,昨天找了一整天没解决唉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

谢谢,我是新人233,不过大概的能看懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯啊,看懂了就自己动动手呀,多练习,分享到论坛里一起交流
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-13 08:47:52 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-16 02:50:35 | 显示全部楼层
  1. def get_page(url):
  2.     html = url_open(url).decode('utf-8')
  3.     a = html.find('current-comment-page') + 23
  4.     b = html.find(']',a)
  5.     return html[a:b]
复制代码

  1. page_num = int(get_page(url))
复制代码


好像没有用了,是不是可以删掉
我把download_the_graph(folder = 'graph', pages=10)函数里的page_num = int(get_page(url))注释掉还可以运行,并且结果一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

那有可能它本来就是 int 类型的,不需要转 int 吧~
小甲鱼最新课程 -> https://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))可以删掉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

仔细看了一下,确实可以去除,谢谢指正啦~
小甲鱼最新课程 -> https://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)
什么意思
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

应该是一个翻页用的数字,页码什么的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

NULL

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

嘿嘿删掉,重复了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这里的180-200指的是要爬取的页面范围
煎蛋网定期会对图片进行封存,所以页面范围也会有所变化
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-25 22:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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