今天转转悠悠,突然不知道该学些什么,偶然的一瞬间脑子里想到了爬虫,这个我很早就了解的技术,我却没有亲自实践过,于是这次想好好地去了解下,学习下简单的使用方法,毕竟自以后的深度学习中也是有用处的,爬取图片来做数据源。

一:简单入手
网络的上的图片都有所在服务器URL。
我们首先得获得一个可以发起HTTP请求的办法,我们使用requests包的方法。
做个简单的实验,把www.baidu.com的首页HTML请求下来。

import requests   #导入模块def run():        #声明一个run方法response = requests.get("http://www.baidu.com")print(response.text)if __name__ == "__main__":   #主程序入口run()    #调用上面的run方法

发现是可以的。

然后我们去一个图片网站上去爬取一些图片下来,刚刚我们是爬取HTML,现在我们尝试爬取图片

import requests   #导入模块def run2():response = requests.get("http://wx3.sinaimg.cn/large/0076BSS5ly1gliowcgks1j30u0112wjn.jpg")with open("D:/estimages/mn.jpg", "wb") as f :f.write(response.content)f.closeif __name__ == "__main__":   #主程序入口run2()    #调用上面的run方法

图片也是顺利下载了,我们看一看

二:实战操作
我们今天要爬取的是网站http://jandan.net/ooxx,这里有很多评论内容,每个评论下都是有一张图片的,而且评论内容很多,都有分页了,有分页也不怕,因为分页的内容都是一样的,我们来细看。

网页内容有分页

检查源码如下:

也就是如果我们想跳到下一页面,只需要把这个“下一页”的< a>的herf链接值得到,重新使用request请求一下这个链接值就能调到下一页面,循环执行的话,就能不断根据连接进行爬取。

经过观察,每个下一页的< a>标签都属于一个previous-comment-page的calss,这个很重要,能方便BeautifulSoup直接能获取该元素。

每个页面分页栏下面接着就是一个大的评论区,每个评论都是有一张图片,很规律。

检查源码如下:

可以看出来这是一个comment列表,每一个comment都有一个ID。
我们需要进去每一个ID去看看图片的位置和内容,如下:

经过观察,每个图片的src url值和【查看原图】的herf url值是一样的,【查看原图】的< a>值都是属于一个view-img-link的calss,这个很重要,能方便BeautifulSoup直接能获取该元素。

BeautifulSoup是一个方便能直接访问HTML元素的包。
配合上requests就能实现一个简单的图片爬取功能了。

完整源码如下:
直接上代码学习BeautifulSoup和request的用法吧。

import os
import requests
from bs4 import BeautifulSoupclass Config:page_num = 3save_dir = 'D:\estimages'opt = Config()if not os.path.exists(opt.save_dir):os.mkdir(opt.save_dir)# 设置URL的请求头
headers = {'referer': 'http://jandan.net/','user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0'}# 这是一个集合,不能重复,也就是不能重复设置
image_cache = set()
index = len(image_cache)# 保存图片
def save_all_images(html, idx):global indexfor link in html.find_all('a', {'class': 'view_img_link'}):href = link.get('href')if href not in image_cache:print("image: http:" + href)with open('{}/{}'.format(opt.save_dir, href.split("/")[-1]), 'wb') as jpg:  # 请求图片并写进去到本地文件jpg.write(requests.get("http:" + href).content)image_cache.add(href)print("正在抓取第%s条数据" % index)index += 1def findAnotherPage(html):ahref = html.find('a', {'class': 'previous-comment-page'})  # 找到导航条的位置,获得下一个连接网页的位置if ahref is None:print('no more page')exit(0)else:url = "http:" + ahref.get('href')print("next page: " + url)return urlif __name__ == '__main__':url = 'http://jandan.net/ooxx'for i in range(0, opt.page_num):html = BeautifulSoup(requests.get(url, headers=headers).text, features="html.parser")save_all_images(html, i)url = findAnotherPage(html)

代码步骤如下:
1:设置必要的参数,比如我们需要爬取几个页面,图片在本地的存储位置。
2:设置一个set集合,图片不能重复,因此每下载一张图片就记录这个图片的url。
3:真正下载的时候,每调到一个页面就把该页面的comment区域的所有图片请求下;来。
4:根据分页栏的下一页面地址,调到新的页面,重复执行第三步骤。

下载的时候我们把原始文件名完整保存了下来,并且把url记录在set,避免重复下载。

效果如下:

Python《爬虫初实践》相关推荐

  1. Github配置(git+vscode+python+jupyter)

    ①下载git 打开 git bash 工具的用户名和密码存储 $ git config --global user.name "Your Name" $ git config -- ...

  2. 【实验楼】python简明教程

    ①终端输入python进入 欣赏完自己的杰作后,按 Ctrl + D 输入一个 EOF 字符来退出解释器,你也可以键入 exit() 来退出解释器. ②vim键盘快捷功能分布 ③这里需要注意如果程序中 ...

  3. 【Kaggle Learn】Python 5-8

    五. Booleans and Conditionals Using booleans for branching logic x = True print(x) print(type(x))''' ...

  4. 【Kaggle Learn】Python 1-4

    [Kaggle Learn]Python https://www.kaggle.com/learn/python 一. Hello, Python A quick introduction to Py ...

  5. 使用python愉快地做高数线代题目~

    今天接触到了python,发现真是极易上手啊!对比c语言是什么鬼东西= = 诶,等下,看完教学文章发现TA在下面写了这句话 如果做了前面的内容你可能已被吸引了,觉得c语言真的是废材! 不...不是的. ...

  6. python 位运算与等号_Python 运算符

    和大多数语言一样,Python也有很多运算符,并且运算符跟其他语言的运算符大同小异接下来一一介绍: 算术运算符: 运算符描述实例 +加 - 两个对象相加a+b的输出结果是30 -减 - 得到复数或者一 ...

  7. python减小内存占用_如何将Python内存占用缩小20倍?

    当程序执行过程中RAM中有大量对象处于活动状态时,可能会出现内存问题,特别是在对可用内存总量有限制的情况下. 下面概述了一些减小对象大小的方法,这些方法可以显著减少纯Python程序所需的RAM数量. ...

  8. python中排序英文单词怎么写_Python实现对文件进行单词划分并去重排序操作示例...

    本文实例讲述了Python实现对文件进行单词划分并去重排序操作.,具体如下: 文件名:test1.txt 文件内容: But soft what light through yonder window ...

  9. python程序如何执行死刑图片_如何判断对象已死

    已死的对象就是不可能被任何途径使用的对象,有以下几种方法判断一个对象是否已经死了: 引用计数 给对象添加一个引用计数器,每当有一个地方引用他,计算器就加 1:当引用失效时,计数器减 1:任何时刻计数器 ...

  10. Python gRPC 安装

    1. 安装依赖库 sudo pip3 install grpcio sudo pip3 install protobuf sudo pip3 install grpcio_tools 2. 生成对应文 ...

最新文章

  1. My97DatePicker日历控件日报、每周和每月的选择
  2. Windows上安装AD域控制器注意事项及常见问题处理办法
  3. 一个简单的生产消费者示例
  4. Android OkHttp框架解析
  5. 就是这么简单(续)!使用 RestAssuredMockMvc 测试 Spring MVC Controllers(转)
  6. 前端优化-vue-cli4安装webpack-bundle-analyzer分析包文件
  7. 经济学原理 下载 曼昆_2021南开经济学考研全年规划
  8. 因政府禁令 微软 Windows 9 将作出重大调整
  9. 2017-10-7Linux基础知识(5)基本命令
  10. 分布式数据库的最新发展情况
  11. 通过JS改变框架的src
  12. python listbox排序_Python3.3.2 tkinter ttk TreeView percolumn排序只按最后一列排序?
  13. python float转int_Python 常见内置数据类型及其转换方法
  14. 小知识--局域网内的文件共享
  15. Ubuntu 18.04 安装 NVIDIA 显卡驱动超详细步骤
  16. 【路由器】OpenWrt 手动编译 ipk
  17. CentOS6.7 i686上安装JDK7
  18. Druid实战--摄入数据规范Ingestion Spec
  19. easyui 设置css样式,Easyui 条件设置行背景颜色_EasyUI 教程
  20. python字符串处理编程实例_Python字符串处理实例详解

热门文章

  1. [Cacti] cacti监控mongodb性能实战
  2. dojo 加载自定义module的路径问题
  3. 一款JS+CSS实现的无缝平滑图片滚动代码
  4. 面试精讲之面试考点及大厂真题 - 分布式专栏 18 谈谈怎么理解幂等,接口如何保证幂等
  5. 如何在Ubuntu 14.04上使用Percona XtraBackup创建MySQL数据库的热备份
  6. Java 8 新特性 Optional 类学习,理解并应用。NullPointerException空值检测
  7. 【Pyhton爬虫】中国大学排名爬虫
  8. C语言编译和链接详解(通俗易懂,深入本质)
  9. Upload-Labs(17-20)
  10. C#LeetCode刷题之#705-设计哈希集合​​​​​​​(Design HashSet)