Daniel_Zhang 发表于 2020-12-16 23:57:27

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

本帖最后由 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 = 'http:' + match
      print(match)

    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)

alwonwang 发表于 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 = 'http:' + match
      print(match)

    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)

Daniel_Zhang 发表于 2020-12-16 23:59:30

第9行那里是 req

另外,现在的煎蛋进行了反爬虫设置,图片的标号进行了 base64 加密。图片的 image_addr 也被去掉了 'http:' 的开头

华北第一廖雪峰 发表于 2020-12-17 18:10:04

学习了,终于找到了

空白的天 发表于 2021-1-12 09:49:01

感谢,昨天找了一整天没解决唉

Daniel_Zhang 发表于 2021-1-12 15:20:10

空白的天 发表于 2021-1-12 09:49
感谢,昨天找了一整天没解决唉

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

空白的天 发表于 2021-1-12 19:55:31

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

谢谢,我是新人233,不过大概的能看懂{:10_275:}

Daniel_Zhang 发表于 2021-1-12 23:08:47

空白的天 发表于 2021-1-12 19:55
谢谢,我是新人233,不过大概的能看懂

嗯啊,看懂了就自己动动手呀,多练习,分享到论坛里一起交流{:10_242:}

sinaop 发表于 2021-1-13 08:47:52

{:5_111:}

空白的天 发表于 2021-1-13 09:59:33

Daniel_Zhang 发表于 2021-1-12 23:08
嗯啊,看懂了就自己动动手呀,多练习,分享到论坛里一起交流

1

洋洋痒 发表于 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

page_num = int(get_page(url))

好像没有用了,是不是可以删掉
我把download_the_graph(folder = 'graph', pages=10)函数里的page_num = int(get_page(url))注释掉还可以运行,并且结果一样

Daniel_Zhang 发表于 2021-1-16 16:36:38

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

那有可能它本来就是 int 类型的,不需要转 int 吧~{:10_285:}

洋洋痒 发表于 2021-1-16 23:07:54

Daniel_Zhang 发表于 2021-1-16 16:36
那有可能它本来就是 int 类型的,不需要转 int 吧~

{:10_285:}我的意思是说…………你整个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

和page_num = int(get_page(url))可以删掉

Daniel_Zhang 发表于 2021-1-17 00:05:33

洋洋痒 发表于 2021-1-16 23:07
我的意思是说…………你整个download_the_graph(folder = 'graph', pages=10)函数里没有用到ge ...

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

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

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

仔细看了一下,确实可以去除,谢谢指正啦~{:10_248:}

柒s 发表于 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)
什么意思

Daniel_Zhang 发表于 2021-3-21 14:45:31

柒s 发表于 2021-3-21 11:23
大大 为什么这里是range(180,200)
什么意思

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

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

应该是一个翻页用的数字,页码什么的

alwonwang 发表于 2021-3-29 10:14:29

NULL

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

嘿嘿删掉,重复了

alwonwang 发表于 2021-3-29 10:15:15

柒s 发表于 2021-3-21 11:23
大大 为什么这里是range(180,200)
什么意思

这里的180-200指的是要爬取的页面范围
煎蛋网定期会对图片进行封存,所以页面范围也会有所变化
页: [1]
查看完整版本: 煎蛋爬虫,终于搞定了,没有了 403 forbidden,基本上就是基于 小甲鱼老师 的代码