鱼C论坛

 找回密码
 立即注册
查看: 990|回复: 3

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

[复制链接]
发表于 2021-8-4 16:59:07 | 显示全部楼层 |阅读模式

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

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

x

  1. import urllib.request
  2. import os

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

  9. def find_imgs(url):

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

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

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

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

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



复制代码
最佳答案
2021-8-5 09:50:31
我改了至少5处bug,还添加了一个函数,大改了一段代码,现在可以用了:
  1. import urllib.request
  2. # 导入一个新函数

  3. from urllib.parse import urljoin
  4. import os

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

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

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

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


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

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

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

  56. # 给你加了个函数
  57. def get_index(max_page):
  58.     for i in range(int(max_page),0,-1):
  59.         if i == 1:
  60.             flag = ""
  61.         else:
  62.             flag = f"_{i}"
  63.         yield f"index{flag}.html"
  64.         
  65. download_mm()
复制代码


这要是没个最佳可不像话了。
顺便提一句你爬这么多预览图有什么意思啊,得爬原图啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-5 09:50:31 | 显示全部楼层    本楼为最佳答案   
我改了至少5处bug,还添加了一个函数,大改了一段代码,现在可以用了:
  1. import urllib.request
  2. # 导入一个新函数

  3. from urllib.parse import urljoin
  4. import os

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

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

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

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


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

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

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

  56. # 给你加了个函数
  57. def get_index(max_page):
  58.     for i in range(int(max_page),0,-1):
  59.         if i == 1:
  60.             flag = ""
  61.         else:
  62.             flag = f"_{i}"
  63.         yield f"index{flag}.html"
  64.         
  65. download_mm()
复制代码


这要是没个最佳可不像话了。
顺便提一句你爬这么多预览图有什么意思啊,得爬原图啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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(群里到现在一共六个人还都是划水的)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-5 15:42:08 From FishC Mobile | 显示全部楼层
这么多处的嘛,我是才跟这他的下载妹子图教程敲的,但是他的演示网页过时了,自己随便找了个差不多的在敲,。感谢感谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-20 18:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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