漫画抓取:python网络爬虫与html对应结合抓取讲解


文章目录

  • 漫画抓取:python网络爬虫与html对应结合抓取讲解
  • 前言
  • 一、实现目的
  • 二、开始旅程
    • 1.明确思路
    • 2.下载网页
    • 3.寻找下载漫画
    • 4.完整代码附上
    • 5.运行结果附上
  • 三、总结


前言

本次以漫画抓取为例,来一步一步结合浏览器后台与爬虫编程讲解,也可以延伸到应对其他不同的网页抓取


一、实现目的

首先说明一下本次抓取的网站:XKCD, 是一个流行的极客漫画网站。
首页url:http://xkcd.com/
但是其中的重点在于:它有一个“Prev”按钮,让用户导航到前面的漫画。
这就很关键了,直接影响到我们抓取漫画的连贯性,换句话说,我们下载完一个漫画之后,下面一个漫画的链接在同一个页面已经存在(整个系统沟通的重点所在)
实现:下载这些XKCD网上的漫画。

二、开始旅程

1.明确思路

  • 得到起始的URL。
  • 利用 requests 模块下载页面。
  • 利用 Beautiful Soup 找到页面中漫画图像的 URL。
  • 一起逐步分析html的结构
  • 利用 iter_content()下载漫画图像,并保存到硬盘。
  • 找到前一张漫画的链接 URL,然后可以重复操作。

2.下载网页

#下载漫画
#! python3
import requests,os,bs4
os.chdir(r'C:\Users\LX\Desktop')
url='http://xkcd.com/'+input('enter number')+'/'
#url='http://xkcd.com/'
os.makedirs('xkcd',exist_ok=True)
while not url.endswith('#'):print('DownLoading page |%s...' %url)res=requests.get(url)res.raise_for_status()soup=bs4.BeautifulSoup(res.text,features='html.parser')

不急,我们一步一步来看
第三行开始
3. 导入相应的库requests,os,bs4(应该没有问题哈)
4. 确定我的目录(我用的是桌面哈)
5. 确定url,为什么后面有input()?请看下图分析:
可以看到,目前这一幅漫画的url是 https://xkcd.com/1/,意味着我们输入的input(),会直接决定我们下载下来的漫画是哪一个,甚至还决定我们下载下来的漫画数量。
比如我输入1,那就定位了这个页面,以此类推

6. 如果用这个,会下载所有漫画,因为没有指定嘛,很好理解的哈(如果觉得有问题可以提出来,我们再细讲哈)
7. 创建文件夹,exist_ok=True,即便存在,也不会报错
8. 当我点击了最后一幅漫画,我们的浏览器右侧的href属性会成为这样:(直接上图,每个网页都共通性,会这个,其他的也大差不差(不过也具体情况具体分析))


这是最后一张漫画的next按钮的href="#",这就是我们结束的关键,对比一下其他href,大家可能会更加明白html的布局和结构
这是第一张next按钮的href图片:href="/2/"


直接输入https://xkcd.com/#/试试。(可见就是最后一幅漫画)
当我们的https://xkcd.com/#/出现,那么意味着是最后一幅漫画
相信大家应该可以明白这个标志的重要性!
9. 第九行print(‘DownLoading page |%s…’ %url) 输出一下
10. 开始用requests库get(url),返回response对象,因为后面要用到response对象嘛,创建一个,无可厚非哈
11.调用response对象的方法,检验一下连接是否成功,会不会报错,尽早发现问题
12.调用bs4,创建一个BeatuifulSoup对象,等待后面用,features='html.parser 1'在确定我们的解释器,非常必要。(html.parser在注脚解释)【features='lxml’也可以,我用的比较多,不拘泥,这里不赘述了】
这一部分的解释结束了,也不知道我解释的是否清楚,我们继续分析。


3.寻找下载漫画

--snip--
comicElem=soup.select('#comic img')if comicElem==[]:print('Could not find comic image.')else:comicUrl='http:'+comicElem[0].get('src')print('DownLoading imgae|%s...' %(comicUrl))res=requests.get(comicUrl)res.raise_for_status()imageFile=open(os.path.join('xkcd',os.path.basename(comicUrl)),'wb')for chunk in res.iter_content(100000):imageFile.write(chunk)imageFile.close()prevLink=soup.select('a[rel="prev"]')[0]url='http://xkcd.com'+prevLink.get('href')
print('Done.')

从第二行开始分析
2. 首先明确,为什么出现#comic img?我们来看一下这张图片:

总览图
细节图
不急,我们来慢慢分析,以后的网页都可以这样分析处理。首先看这里:

当光标移动到这里,我们看控制台显示:

开始分析,这个图片,在一个< div>标签里面,表明这里是一个分区,换句话说,就是和其他部分分开了,看这个html的布局也可以看出来。
其次,重点在于,这个< div>的id=“comic”,并且图像处于标签< img>中,属性标签设置知道了,我就可以在select里面,用选择器来选择‘#comic img’,对图片,也就是我们要在这个页面抓取的信息进行非常精确的定位。(其他同理,以此类推)
3.4. 第三、四行就是在没有抓取到信息时,在程序中作出相应的回应,提高程序的健壮性。(这里就不赘述了哈)
5. else: 也就是,我们的comicElem接收到了返回值的时候,开始应对!
6. 我们来看看comicElem里面有什么?或许可以加深大家的理解:(上图)


我改了一下代码,可以看到,这个列表里面只有一个元素。那就是关于< img>的网页信息

参考一下原网页代码:(看看是不是?蓝色部分)

好,我们继续,现在对比三个(上图)


可以看到comicElem[0].get(‘src’),提取了src的字符串,用于下一步的赋值。

换句话说,这里的print(type(comicElem))显示为<class ‘bs4.element.ResultSet’>,你可以根据自己的需要,筛选你想要抓取的元素,以此应对各种复杂的网页抓取,能够这样分析,相信会解决很多难以处理的网络抓取。(print(comicElem[0].get(‘alt’)) 得到了Barrel - Part 1,确实正确,也表明思路正确)
7. 输出信息
8.9. res=requests.get(comicUrl)【特别注意一下,comicUrl需要加一个‘http’头,通过网页html代码和IDLE返回值,清晰可见,comicUrl里面没有‘http’头】
res.raise_for_status() #检查连接
10.11.12.13. imageFile=open(os.path.join(‘xkcd’,os.path.basename(comicUrl)),‘wb’)
把下载的文件开始准备写入文件夹(先打开)
for chunk in res.iter_content(100000):
imageFile.write(chunk)
imageFile.close()
关闭文件
14.因为我们下载好一个,需要去下载上一张图片,所以关键在于,我们的当前图片中,存在着上一个图片的信息:(上图分析)



我们可以看到,用选择器来说选择< a>标签中,rel属性为"prev"的部分,利用这个< a>元素的href属性去取得前一张图片的URL
15. url=‘http://xkcd.com’+prevLink.get(‘href’)中,加上页头“http:”再连接prevLink.get(‘href’),并且继续循环,直到第一张图片的prev=‘#’,结束所有操作,也就是下载结束啦!
16. 结束所有操作,print(‘Done.’)

4.完整代码附上

#下载漫画
#! python3
import requests,os,bs4
os.chdir(r'C:\Users\LX\Desktop')
url='http://xkcd.com/'+input('enter number')+'/'
#url='http://xkcd.com/'
os.makedirs('xkcd',exist_ok=True)
while not url.endswith('#'):print('DownLoading page |%s...' %url)res=requests.get(url)res.raise_for_status()soup=bs4.BeautifulSoup(res.text,features='html.parser')comicElem=soup.select('#comic img')if comicElem==[]:print('Could not find comic image.')else:comicUrl='http:'+comicElem[0].get('src')print('DownLoading imgae|%s...' %(comicUrl))res=requests.get(comicUrl)res.raise_for_status()imageFile=open(os.path.join('xkcd',os.path.basename(comicUrl)),'wb')for chunk in res.iter_content(100000):imageFile.write(chunk)imageFile.close()prevLink=soup.select('a[rel="prev"]')[0]url='http://xkcd.com'+prevLink.get('href')
print('Done.')

5.运行结果附上


三、总结

这就是整个程序的过程分析!谢谢大家!
用心写了很久,希望可以帮到大家并且可以一起交流,真心感谢大家的支持!


  1. htmlparser [1] 是一个纯的java写的html(标准通用标记语言下的一个应用)解析的库,它不依赖于其它的java库文件,主要用于改造或提取html。它能超高速解析html,而且不会出错。现在htmlparser最新版本为2.1。毫不夸张地说,htmlparser就是目前最好的html解析和分析的工具。无论你是想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。
    ↩︎

python网络爬虫最细致讲解之漫画抓取【细!!!】相关推荐

  1. python网络爬虫网易云音乐_一篇文章带你用Python网络爬虫实现网易云音乐歌词抓取...

    标签下,如下图所示: 接下来我们利用美丽的汤来获取目标信息,直接上代码,如下图: 此处要注意获取ID的时候需要对link进行切片处理,得到的数字便是歌曲的ID:另外,歌曲名是通过get_text()方 ...

  2. Python网络爬虫数据采集实战:Scrapy框架爬取QQ音乐存入MongoDB

    ​    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本 ...

  3. [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  4. c#使用正则表达式获取TR中的多个TD_[Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例...

    首先祝大家中秋节和国庆节快乐,欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都 ...

  5. Python网络爬虫实践(1):爬取网易云音乐播放量大于1000万的歌单

    Python网络爬虫实践(1) 一.需求分析 爬取网易云音乐播放量大于1000万的歌单. 二.实施步骤 1.安装selenium selenium是一个用于Web应用自动化程序测试的工具,测试直接运行 ...

  6. Python网络爬虫实践(2):爬取小说网站小说

    Python网络爬虫实践(2) 一.需求分析 爬取某小说网站的一部小说 二.步骤 目标数据 网站 页面 分析数据加载流程 分析目标数据所对应的url 下载数据 清洗,处理数据 数据持久化 重点:分析目 ...

  7. python网络爬虫之解析网页的正则表达式(爬取4k动漫图片)[三]

    目录 前言 一.正则表达式的学习 1.正则表达式的匹配工具 2.正则表达式的样式 3.正则表达式的案例 二.爬取网页图片 1.分析网页 2.获取数据 爬取妹子网的案例 后记 前言 hello,大家好 ...

  8. python网络爬虫学习(六)利用Pyspider+Phantomjs爬取淘宝模特图片

    本篇博文在编写时参考了http://cuiqingcai.com/2652.html,向作者表示感谢 一.新的问题与工具 平时在淘宝上剁手的时候,总是会看到各种各样的模特.由于自己就读于一所男女比例三 ...

  9. Python网络爬虫实例——“中国最好大学排名爬取”(嵩天:北理工大学)学习笔记

    这个例子比较简单也容易理解,我将细致的解析这个例子中算法流程.写一个博客算是给自己一个激励吧.一起加油.(_ZHJ三月和九月) 完整版代码 import requests from bs4 impor ...

  10. 20行python代码入门网络爬虫全流程:使用BeautifulSoup抓取当日人民银行外汇数据

    网路爬虫是python最重要的应用之一,甚至有很多地方认为python就是用来做网抓的.这里将用大约20行代码展示一个从人民银行官网抓取当日人民币美元汇率的示例来入门这项技术. 和我们平时手动上网寻找 ...

最新文章

  1. lvs后端realserver的vip管理脚本lvs-realsvr.sh
  2. with语句和上下文管理器
  3. 【错误记录】Android 模拟器安装应用报错 ( INSTALL_FAILED_INSUFFICIENT_STORAGE )
  4. SAP CRM Business transaction save mode
  5. 计算机安全基础:加密技术知识笔记
  6. 如何将EDM营销与多渠道推广方式相结合
  7. mysql 14.12_MySQL必知必会12-14 汇总 分组 子查询
  8. 宇宙总统(洛谷-P1781)
  9. CentOS 6.0 xdmcp 配置
  10. 字节跳动面试:java编程思想电子版非pdf
  11. 整数数组的最大子数组
  12. windows 读写锁 python_用Python实现读写锁的示例代码
  13. 12位黄金技术大佬发出警告:一大波必读好书向你袭来
  14. ubuntu搭建nfs网络文件系统
  15. 《敏捷迭代开发:管理者指南》—第2章2.3节时间箱迭代开发
  16. cad巧用插件自定义填充图形
  17. 点云库PCL学习笔记 -- 输入输出IO -- 6.PCL中记录时间长度TicToc 类和系统Time 类
  18. 查看硬盘序列号的方法 和查看设备序列号的方法
  19. android手机文件管理器,4 款 Android 文件管理器,总有一款适合你
  20. 【bzoj3653】谈笑风生

热门文章

  1. 学习编程必备常用英语单词
  2. cefsharp修改html,C#使用 CefSharp采集网页源代码
  3. android 直播推流sdk,大牛直播Android推流端SDK说明
  4. 微信公众号推送模板消息(二):Access_token的获取
  5. c语言题库及详解答案 免费下载,C语言题库(带详解答案).pdf
  6. Guice 依赖注入
  7. 饥荒联机版服务器启动慢_饥荒联机版大型攻略——简介与目录
  8. 基于SSM高校教师教务信息管理系统
  9. 高斯分布4——联合概率分布
  10. linux asio 读取串口,ASIO 串口编程