最近在学习爬虫,学完后想实践一下,所以现在准备爬取校花网的一部分图片

第一步,导入需要的库

  1. from urllib import request
  2. #用于处理request请求和获得响应
  3. from urllib import error
  4. #异常处理
  5. from lxml import etree
  6. #用于解析html

第二步,进行简单的身份伪装

  1. def setting_User_Agent(url):
  2. '''
  3. 有的网站会限制爬虫访问,所以可以通过
  4. 设置User-Agent来伪装成一个浏览器
  5. '''
  6. headers = {}
  7. headers['User-Agent'] = 'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3'
  8. return request.Request(url, headers=headers)

第三步,观察我们想要访问的网站,并得到前十个页面的url

这是第一页的url:http://www.xiaohuar.com/list-1-0.html

这是第二页的url:http://www.xiaohuar.com/list-1-1.html

这是第四个页面的url:http://www.xiaohuar.com/list-1-3.html

所以我们可以通过一个函数来获得前十页的url

  1. def getPageUrl():
  2. '''
  3. 获得前十页的url
  4. '''
  5. url = "http://www.xiaohuar.com/list-1-"
  6. pagrUrlList = []
  7. for i in range(10):
  8. pageUrl = url + str(i) + ".html"
  9. pagrUrlList.append(pageUrl)
  10. return pagrUrlList

第四步、假如我们已经知道了一张图片的名称和路径,那我们可以编写代码来实现自动根据路径下载图片,代码如下

  1. def getIMg(name,imgUrl):
  2. # 文件的路径和文件名称
  3. name = "D:/xiaohua/" + name + ".jpg"
  4. #发送请求并获得响应
  5. try:
  6. rsp = request.urlopen(imgUrl)
  7. #把文件写进指定路径
  8. with open(name,"wb") as f:
  9. f.write(rsp.read())
  10. except:
  11. print("发生了一个错误")

第五步、查看网页布局

当进入网页后,按F12或者Fn + F12,会看到如下界面

当你鼠标放在右边的一个div上时,左边页面颜色会发生变化,打开你想要查看的div,一直往下找,直到出现下图

第六步:

1、我们现在知道了,图片信息就在<img>标签下,alt的属性值就是名字,src的属性值就是图片的地址,所以接下来编写代码获取名字和图片地址

2、获得的名字和图片地址传入getImg()函数,代码如下

  1. def getImgUrl(url):
  2. # 1、进行User-Agent的伪装
  3. #url = setting_User_Agent(url)
  4. #2、发起请求
  5. try:
  6. rsp = request.urlopen(url)
  7. except:
  8. print("发生错误")
  9. # 3、返回的是一个Rs类型的数据,需要转化为bytes类型
  10. html = rsp.read()
  11. # 4、把bytes类型的数据放入lxml的etree中,方便用xpath解析
  12. tree = etree.HTML(html)
  13. # 5、用xpath解析html
  14. aList = tree.xpath('//div[@class = "img"]/a')
  15. '''
  16. aList = tree.xpath('//div[@class = "img"]/a')
  17. 此代码的意思是:首先找到一个有class属性,并且属性值为img
  18. div标签,再获得该标签下的a标签
  19. '''
  20. # 6 、获得a标签下的img标签的alt属性和src属性,同样用xpath
  21. for a in aList:
  22. name = str(a.xpath('./img/@alt'))
  23. imgUrl = str(a.xpath('./img/@src'))
  24. '''
  25. 此时获得的nameimgUrl并不是标准的格式,而是
  26. ['*****************']这样的,所以需要用字符串截取
  27. '''
  28. name = name[2:-2]
  29. imgUrl = imgUrl[2:-2]
  30. '''
  31. 该网站的图片标准链接是以http开头的,而获取的imgUrl有的缺失了
  32. 一部分,所以加一个判断,如果没有,就加上
  33. '''
  34. t = imgUrl[:4]
  35. if t == "http":
  36. imgUrl = imgUrl
  37. else:
  38. imgUrl = "http://www.xiaohuar.com" + imgUrl
  39. # 通过nema 和 imgUrl下载图片
  40. getIMg(name, imgUrl)
  41. return None

现在,该写的差不多已经写完了,把代码整合一下:

  1. if __name__ == '__main__':
  2. pageUrls = getPageUrl()
  3. for pageUrl in pageUrls:
  4. getImg(pageUrl)

代码执行前

执行后

整个爬取过程90秒,爬取了几百张图片,比下载快多了

总结:

  我的代码能力和逻辑思维还不够,代码不够简洁,写文件那块做的不好,非常耗费资源,

  可改进的地方:

  1、相同功能的代码可以提取出来单独写一个函数

  2、异常处理没写好,可以处理的更加完善

  3、频繁的打开和关闭文件很耗资源,可以在程序开始时打开文件,程序结束时关闭文件

完整的代码如下:

  1. from urllib import request
  2. #用于处理request请求和获得响应
  3. from urllib import error
  4. #异常处理
  5. from lxml import etree
  6. #用于解析html
  7. def setting_User_Agent(url):
  8. '''
  9. 有的网站会限制爬虫访问,所以可以通过
  10. 设置User-Agent来伪装成一个浏览器
  11. '''
  12. headers = {}
  13. headers['User-Agent'] = 'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3'
  14. return request.Request(url, headers=headers)
  15.  
  16. def getPageUrl():
  17. '''
  18. 获得前十页的url
  19. '''
  20. url = "http://www.xiaohuar.com/list-1-"
  21. pagrUrlList = []
  22. for i in range(10):
  23. pageUrl = url + str(i) + ".html"
  24. pagrUrlList.append(pageUrl)
  25. return pagrUrlList
  26.  
  27. def getIMg(name,imgUrl):# 根据名字和图片链接下载图片
  28. # 文件的路径和文件名称
  29. name = "D:/xiaohua/" + name + ".jpg"
  30. #发送请求并获得响应
  31. try:
  32. rsp = request.urlopen(imgUrl)
  33. #把文件写进指定路径
  34. with open(name,"wb") as f:
  35. f.write(rsp.read())
  36. except:
  37. print("发生了一个错误")
  38. return None
  39.  
  40. def getImg(url):
  41. # 1、进行User-Agent的伪装
  42. url = setting_User_Agent(url)
  43. #2、发起请求
  44. try:
  45. rsp = request.urlopen(url)
  46. except:
  47. print("发生错误")
  48. # 3、返回的是一个Response类型的数据,需要转化为bytes类型
  49. html = rsp.read()
  50. # 4、把bytes类型的数据放入lxml的etree中,方便用xpath解析
  51. tree = etree.HTML(html)
  52. # 5、用xpath解析html
  53. aList = tree.xpath('//div[@class = "img"]/a')
  54. '''
  55. aList = tree.xpath('//div[@class = "img"]/a')
  56. 此代码的意思是:首先找到一个有class属性,并且属性值为img
  57. div标签,再获得该标签下的a标签
  58. '''
  59. # 6 、获得a标签下的img标签的alt属性和src属性,同样用xpath
  60. for a in aList:
  61. name = str(a.xpath('./img/@alt'))
  62. imgUrl = str(a.xpath('./img/@src'))
  63. '''
  64. 此时获得的nameimgUrl并不是标准的格式,而是
  65. ['*****************']这样的,所以需要用字符串截取
  66. '''
  67. name = name[2:-2]
  68. imgUrl = imgUrl[2:-2]
  69. '''
  70. 该网站的图片标准链接是以http开头的,而获取的imgUrl有的缺失了
  71. 一部分,所以加一个判断,如果没有,就加上
  72. '''
  73. t = imgUrl[:4]
  74. if t == "http":
  75. imgUrl = imgUrl
  76. else:
  77. imgUrl = "http://www.xiaohuar.com" + imgUrl
  78. # 通过nema 和 imgUrl下载图片
  79. getIMg(name, imgUrl)
  80. return None
  81.  
  82. if __name__ == '__main__':
  83. pageUrls = getPageUrl()
  84. for pageUrl in pageUrls:
  85. getImg(pageUrl)

python爬虫实践(一)的更多相关文章

  1. python爬虫实践教学

    i春秋作家:Mochazz 一.前言 这篇文章之前是给新人培训时用的,大家觉的挺好理解的,所以就分享出来,与大家一起学习.如果你学过一些python,想用它做些什么又没有方向,不妨试试完成下面几个案例 ...

  2. python爬虫实践

    模拟登陆与文件下载 爬取http://moodle.tipdm.com上面的视频并下载 模拟登陆 由于泰迪杯网站问题,测试之后发现无法用正常的账号密码登陆,这里会使用访客账号登陆. 我们先打开泰迪杯的 ...

  3. Python爬虫实践 -- 记录我的第二只爬虫

    1.爬虫基本原理 我们爬取中国电影最受欢迎的影片<红海行动>的相关信息.其实,爬虫获取网页信息和人工获取信息,原理基本是一致的. 人工操作步骤: 1. 获取电影信息的页面 2. 定位(找到 ...

  4. python爬虫实践(二)——爬取张艺谋导演的电影《影》的豆瓣影评并进行简单分析

    学了爬虫之后,都只是爬取一些简单的小页面,觉得没意思,所以我现在准备爬取一下豆瓣上张艺谋导演的“影”的短评,存入数据库,并进行简单的分析和数据可视化,因为用到的只是比较多,所以写一篇博客当做笔记. 第 ...

  5. Python爬虫实践 -- 记录我的第一只爬虫

    一.环境配置 1. 下载安装 python3 .(或者安装 Anaconda) 2. 安装requests和lxml 进入到 pip 目录,CMD --> C:\Python\Scripts,输 ...

  6. 《转载》python爬虫实践之模拟登录

    有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录.   浏览器访问服务器的过程   在用户访问网页时,不论是通过URL输入域名或IP ...

  7. python爬虫实践--求职Top10城市

    前言 从智联招聘爬取相关信息后,我们关心的是如何对内容进行分析,获取用用的信息.本次以上篇文章“5分钟掌握智联招聘网站爬取并保存到MongoDB数据库”中爬取的数据为基础,分析关键词为“python” ...

  8. Python爬虫实践~BeautifulSoup+urllib+Flask实现静态网页的爬取

    爬取的网站类型: 论坛类网站类型 涉及主要的第三方模块: BeautifulSoup:解析.遍历页面 urllib:处理URL请求 Flask:简易的WEB框架 介绍: 本次主要使用urllib获取网 ...

  9. python爬虫实践——爬取“梨视频”

    一.爬虫的基本过程: 1.发送请求(请求库:request,selenium) 2.获取响应数据()服务器返回 3.解析并提取数据(解析库:re,BeautifulSoup,Xpath) 4.保存数据 ...

随机推荐

  1. Java SE之[静态成员/类成员]与[非静态成员/实例成员]【static】

    定义 静态成员:又称类成员,使用static修饰符的方法和变量: 非静态成员:又称实例成员,未使用static修饰符的方法和变量. 结论 注:jdk1.8 测试源码 public class Main ...

  2. 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史(转载)

    转载 https://zhuanlan.zhihu.com/p/49271699 首发于深度学习前沿笔记 写文章   从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 张 ...

  3. c++ 常用头文件

    1.#include<iostream> iostream 的意思是输入输出流.#include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头 ...

  4. 软件测试面试-必掌握的 Linux常用命令大全--2.0更新版!

  5. [系统集成] 基于telegraf, influxdb, grafana 建立 esxi 监控

    之前在 nagios 上建立了 esxi 监控,指标少.配置麻烦.视觉效果差.最近我把 esxi 监控迁移到了 influxdb+grafana 平台上,无论是监控指标.可操作性还是视觉效果都有了很大 ...

  6. 记录一下这几天遇到的坑(.netcore 代理问题)

    1.通过图片的网络url将图片转化为base64格式 方法如下: public static async Task<string> GetImageAsBase64Url(string u ...

  7. 解决exlipse下 springboot 错误:找不到或无法加载主类

    简单描述:控制台出现了下图 废话不多说,直接上解决办法: 方法一:如果你很有自信,自己的pom 没问题,并且已经加载了所有依赖的jar.ok,这是eclipse的问题,window=>prefe ...

  8. 利用python进行数据加载和存储

    1.文本文件 (1)pd.read_csv加载分隔符为逗号的数据:pd.read_table从文件.URL.文件型对象中加载带分隔符的数据.默认为制表符.(加载为DataFrame结构) 参数name ...

  9. foot

    码云链接:https://gitee.com/zyyyyyyyyyyy/codes/rcfdzmin4a82v975pl1ko47 效果图: 原网站截图: 源代码: <!DOCTYPE html ...

  10. 4.1 ORACLE DATAGUARD SWITCHOVER 步骤

    验证主库是否能执行角色转换到备库 原主库执行 SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; SWITCHOVER_STATUS --------- ...