我爱l两条柴 发表于 2021-8-4 16:59:07

顺着小甲鱼爬虫入门教程仿写的 但是运行报错,请各位指正以下。代码如下


import urllib.request
import os

img_addrs = []
def url_open(url):
    req = urllib.request.Request(url)# 请求网页 并 添加头部信息
    req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0')
    response = urllib.request.urlopen(url)# 伪装并打开网页
    html = response.read()

def find_imgs(url):

    html = url_open(url).decode('utf-8')# 得到2进制解码为字符串存入列表进行查找图片的相关位置

    '''
    a= html.find('img src=')
    b=html.find('.jpg',a,a+255) #后面参数为 限定查找范围   find若有多个,只会返回第一个
   # 如果一页里面只有一张图那么以下两行就够了
    if b!=-1:   #若查找不到则会返回-1
      img_addrs.append(html)   # a从i起后移9位是/<img src="/uploads/allimg/210317/001935-16159115757f04.jpg" alt="猫羽雫 蓝色眼睛女子 尾巴 女孩子 猫耳 猫 可爱二次元动漫4k壁纸">
    '''
    # 多图查找
    a= html.find('img src=')
    while a !=-1:
      b = html.find('.jpg', a, a + 255)
      if b != -1:# 若查找不到则会返回-1    这里只考虑了 jpg格式
            img_addrs.append(html)# a从i起后移9位是/<img src="/uploads/allimg/210317/001935-16159115757f04.jpg" alt="猫羽雫 蓝色眼睛女子 尾巴 女孩子 猫耳 猫 可爱二次元动漫4k壁纸">
      a= html.find('img src=',b)# 以上次b结束开始查
      b = html.find('.jpg', a, a + 255)
      return img_addrs

def save_imgs(img_addrs):
   for each in img_addrs:
       filename=each.split('/')[-1]
       with open(filename,'wb') as f:
         img = url_open(each)
         f.write(img)

def download_mm(folder='4k',pages=20):#文件名爬取页数
    os.mkdir(folder) #新建文件夹
    os.chdir(folder) #更改工作目录便于保存地址

    url = 'https://pic.netbian.com/4kdongman/'#获取总的 目标网页
    print(url)
    for i in range(pages):
      pages -= i
      if i == 0:
            page_url = url
      else:
            page_url= url +'index_'+str(i)+'.html'# 生成具体页数
      img_addrs = find_imgs(page_url)    #当前页面的所有图片地址
      save_imgs(folder,img_addrs)    #保存



nahongyan1997 发表于 2021-8-5 09:50:31

我改了至少5处bug,还添加了一个函数,大改了一段代码,现在可以用了:
import urllib.request
# 导入一个新函数

from urllib.parse import urljoin
import os

# url放在外边让它是全局变量
url = 'https://pic.netbian.com/4kdongman/'#获取总的 目标网页

img_addrs = []
def url_open(url):
    req = urllib.request.Request(url)# 请求网页 并 添加头部信息
    req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0')
    response = urllib.request.urlopen(url)# 伪装并打开网页
    html = response.read()
   
    # 这里要返回的
    return html

def find_imgs(url):
    print(url)
    # 网页不完整导致的解码错误,加个参数就好了
    html = url_open(url).decode('utf-8', errors="ignore")# 得到2进制解码为字符串存入列表进行查找图片的相关位置

    '''
    a= html.find('img src=')
    b=html.find('.jpg',a,a+255) #后面参数为 限定查找范围   find若有多个,只会返回第一个
   # 如果一页里面只有一张图那么以下两行就够了
    if b!=-1:   #若查找不到则会返回-1
      img_addrs.append(html)   # a从i起后移9位是/<img src="/uploads/allimg/210317/001935-16159115757f04.jpg" alt="猫羽雫 蓝色眼睛女子 尾巴 女孩子 猫耳 猫 可爱二次元动漫4k壁纸">
    '''
    # 多图查找
    a= html.find('img src=')
    while a !=-1:
      b = html.find('.jpg', a, a + 255)
      if b != -1:# 若查找不到则会返回-1    这里只考虑了 jpg格式
            img_addrs.append(html)# a从i起后移9位是/<img src="/uploads/allimg/210317/001935-16159115757f04.jpg" alt="猫羽雫 蓝色眼睛女子 尾巴 女孩子 猫耳 猫 可爱二次元动漫4k壁纸">
      a= html.find('img src=',b)# 以上次b结束开始查
      b = html.find('.jpg', a, a + 255)
      return img_addrs


def save_imgs(img_addrs):
   for each in img_addrs:
       filename=each.split('/')[-1]
       with open(filename,'wb') as f:
         img = url_open(urljoin(url,each))
         f.write(img)

def download_mm(folder='4k',pages=20):#文件名爬取页数
   
    # 这里加个条件判断
    if not os.path.exists(folder):
      os.mkdir(folder) #新建文件夹
      
    os.chdir(folder) #更改工作目录便于保存地址

    print(url)
    # 这里大改了
    index = get_index(pages)
    for page_url in index:
      img_addrs = find_imgs(urljoin(url,page_url))    #当前页面的所有图片地址
      # 这里多给了个参数
      save_imgs(img_addrs)    #保存

# 给你加了个函数
def get_index(max_page):
    for i in range(int(max_page),0,-1):
      if i == 1:
            flag = ""
      else:
            flag = f"_{i}"
      yield f"index{flag}.html"
      
download_mm()


这要是没个最佳可不像话了。
顺便提一句你爬这么多预览图有什么意思啊,得爬原图啊。

nahongyan1997 发表于 2021-8-5 09:57:28

本帖最后由 nahongyan1997 于 2021-8-5 10:01 编辑

我发现每页只爬取了一个图片,所以还是一个失败的爬虫。

推荐使用re 模块的 findall 函数,我自己的爬虫就是这么编辑的,24小时运行。

宣传一下我的网站 : puddingcat.top:9999 python爬虫 + pyqt5 + mysql + html5 + css3 + js + flask 制作的。

想学习可以加我的 qq547840062 或者 qq群181285090(群里到现在一共六个人还都是划水的)

我爱l两条柴 发表于 2021-8-5 15:42:08

这么多处的嘛,我是才跟这他的下载妹子图教程敲的,但是他的演示网页过时了,自己随便找了个差不多的在敲,。感谢感谢
页: [1]
查看完整版本: 顺着小甲鱼爬虫入门教程仿写的 但是运行报错,请各位指正以下。代码如下