鱼C论坛

 找回密码
 立即注册
查看: 2313|回复: 4

[已解决]刚学完爬虫妹子图,想爬其他网站的图,结果失败了

[复制链接]
发表于 2017-4-16 13:18:50 | 显示全部楼层 |阅读模式

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

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

x
  1. import urllib.request
  2. import os

  3. # 把打开网页的过程封装成函数(伪装用浏览器)
  4. def url_open(url):
  5.     req = urllib.request.Request(url)
  6.     req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0')
  7.     response = urllib.request.urlopen(url)
  8.     html = response.read()
  9.     return html


  10. # 将每个图片的地址封装到img_addrs列表
  11. def find_img(url):
  12.     html = url_open(url).decode('utf-8')
  13.     img_addrs = []

  14.     a = html.find('data-imgurl=')
  15.     while a != -1:
  16.         b = html.find('.jpg', a, a + 255)
  17.         if b != -1:
  18.             img_addrs.append(html[a + 13:b + 4])
  19.         else:
  20.             b = a + 13
  21.         a = html.find('data-imgurl=', b)
  22.         print(html[a + 13:b + 4])

  23.     return img_addrs

  24. #将图片保存到文件中
  25. def save_imgs(folder, img_addrs):
  26.     for each in img_addrs:
  27.         filename = each.split('/')[-1]
  28.         with open(filename, 'wb') as f:
  29.             img = url_open(each)
  30.             f.write(img)

  31. #主函数,保存图片
  32. def download_mm(folder='hawaii'):
  33.     os.mkdir(folder)
  34.     os.chdir(folder)

  35.     url = 'http://image.baidu.com/search/index?ct=201326592&cl=2&lm=-1&tn=baiduimage&ie=utf-8&word=%E5%A4%8F%E5%A8%81%E5%A4%B7'
  36.     img_addrs = find_img(url)
  37.     save_imgs(folder,img_addrs)

  38. if __name__ == '__main__':
  39.     download_mm()
复制代码



运行后文件夹创建,但里面不导出图片。在find_img函数下面用print(img_addrs)测试了下结果没有打印也没有报错。问题应该就出在这个函数这里,但是不知道哪里错了,求助各位大佬。
最佳答案
2017-4-16 14:29:58
本帖最后由 gopythoner 于 2017-4-16 14:37 编辑

我帮你改了2个地方,试过了可以得到图片
看代码
  1. import urllib.request
  2. import os
  3. import re     #引入正则表达式--------------------改动1

  4. # 把打开网页的过程封装成函数(伪装用浏览器)
  5. def url_open(url):
  6.     req = urllib.request.Request(url)
  7.     req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0')
  8.     response = urllib.request.urlopen(url)
  9.     html = response.read()
  10.     return html


  11. # 将每个图片的地址封装到img_addrs列表
  12. def find_img(url):
  13.     html = url_open(url).decode('utf-8')
  14.     img_addrs = []
  15.     # 选择图片并把链接放入列表中--------------改动2
  16.     img = re.findall("(http:.*?\.jpg)", html)
  17.     for i in img:
  18.         if "baidu.com" in i:
  19.             img_addrs.append(i)
  20.     return img_addrs

  21. #将图片保存到文件中
  22. def save_imgs(folder, img_addrs):
  23.     for each in img_addrs:
  24.         filename = each.split('/')[-1]
  25.         with open(filename, 'wb') as f:
  26.             img = url_open(each)
  27.             f.write(img)

  28. #主函数,保存图片
  29. def download_mm(folder='hawaii'):
  30.     os.mkdir(folder)
  31.     os.chdir(folder)

  32.     url = 'http://image.baidu.com/search/index?ct=201326592&cl=2&lm=-1&tn=baiduimage&ie=utf-8&word=%E5%A4%8F%E5%A8%81%E5%A4%B7'
  33.     img_addrs = find_img(url)
  34.     save_imgs(folder,img_addrs)

  35. if __name__ == '__main__':
  36.     download_mm()
复制代码



由于网页是动态生成的,所以下载到的图片与你实际能看到的图片数量是有差异的,关于动态网页的信息爬取的话有点复杂,你这个实现不了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-4-16 14:02:55 | 显示全部楼层
你直接抄煎蛋那个代码的吧,这个代码不一定适用所有网站,你要自己审查元素进行修改
还有另外原因是因为这个是一个动态网站,你这种方法是无法下载到图片的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-16 14:23:12 | 显示全部楼层
本帖最后由 gopythoner 于 2017-4-16 14:25 编辑

你应该先打印一下你请求的这个html.
看看能不能找到'data-imgurl='
目测打印出来的应该找不到这个,所以你只能得到一个空列表,当然就没有图片
建议你用正则表达式去提取图片链接
比如我这个就可以提取到一些图片
只要来源是baidu.com的图片,其他广告图片都不要
  1. img = re.findall("(http:.*?\.jpg)",html)
  2. for i in img:
  3.     if "baidu.com" in i:
  4.         print(i)
复制代码

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

使用道具 举报

发表于 2017-4-16 14:29:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 gopythoner 于 2017-4-16 14:37 编辑

我帮你改了2个地方,试过了可以得到图片
看代码
  1. import urllib.request
  2. import os
  3. import re     #引入正则表达式--------------------改动1

  4. # 把打开网页的过程封装成函数(伪装用浏览器)
  5. def url_open(url):
  6.     req = urllib.request.Request(url)
  7.     req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0')
  8.     response = urllib.request.urlopen(url)
  9.     html = response.read()
  10.     return html


  11. # 将每个图片的地址封装到img_addrs列表
  12. def find_img(url):
  13.     html = url_open(url).decode('utf-8')
  14.     img_addrs = []
  15.     # 选择图片并把链接放入列表中--------------改动2
  16.     img = re.findall("(http:.*?\.jpg)", html)
  17.     for i in img:
  18.         if "baidu.com" in i:
  19.             img_addrs.append(i)
  20.     return img_addrs

  21. #将图片保存到文件中
  22. def save_imgs(folder, img_addrs):
  23.     for each in img_addrs:
  24.         filename = each.split('/')[-1]
  25.         with open(filename, 'wb') as f:
  26.             img = url_open(each)
  27.             f.write(img)

  28. #主函数,保存图片
  29. def download_mm(folder='hawaii'):
  30.     os.mkdir(folder)
  31.     os.chdir(folder)

  32.     url = 'http://image.baidu.com/search/index?ct=201326592&cl=2&lm=-1&tn=baiduimage&ie=utf-8&word=%E5%A4%8F%E5%A8%81%E5%A4%B7'
  33.     img_addrs = find_img(url)
  34.     save_imgs(folder,img_addrs)

  35. if __name__ == '__main__':
  36.     download_mm()
复制代码



由于网页是动态生成的,所以下载到的图片与你实际能看到的图片数量是有差异的,关于动态网页的信息爬取的话有点复杂,你这个实现不了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-17 10:30:53 | 显示全部楼层
gopythoner 发表于 2017-4-16 14:29
我帮你改了2个地方,试过了可以得到图片
看代码

谢谢你啊,可是我还没学到正则表达式。等我再过几节课再来看一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-27 00:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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