首页 > 编程知识 正文

如何用爬虫这查找漫画,python3爬虫数据清洗与可视化实战

时间:2023-05-06 08:25:37 阅读:160228 作者:3322

捕捉:支持python网络爬虫和html的捕捉说明文章目录漫画捕捉:支持python网络爬虫和html的捕捉说明前言1、实现目的2、旅程开始1、创意澄清2、网页下载3、下载漫画检查

前言这次以漫画捕捉为例,通过一步一步地将浏览器后台和爬虫编程讲义结合起来,也可以应对其他不同的网络捕捉。

一、为了达到目的,首先说明这次获得的网站。 XKCD是很受欢迎的极客漫画网站。

首页url: http://xkcd.com/

但是,重要的是有“Prev”按钮,以便用户可以导航到上一幅漫画。

这很重要,直接影响到抓住漫画的连贯性。 这意味着下载漫画后,同一页面上已经存在指向下一个漫画的链接。 是整个系统交流的关键。

实现:下载这些XKCD网上漫画。

二、开始旅程1 .明确思路启动的网址。 使用requests模块下载页面。 使用Beautiful Soup找到页面中漫画图像的URL。 一起逐步分析html的结构利用iter_content ()下载漫画图片并保存到硬盘。 可以找到前面漫画的链接URL,重复操作。 2 .下载页面#下载漫画#! python3import requests,os,bs4OS.chdir(r'c:(users(LX ) Desktop ' ) URL=' http://xkcd.com/' input (' ententer ) exist _ ok=true (whilenoturl.endswith (' # ' ) :print ) ' downloadingpage|%s.'%URL ) RES=requests.get )

第三行开始

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 .尝试输出第9行的打印(‘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---comic elem=soup.select (' # ) comicimg ' ) ) ifcomicelem=() ) :print ) ) couldnotfindcomicimage.)的else : comic URL=' http 3360 ' comic elem

(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.完整代码附上 #下载漫画#! python3import requests,os,bs4os.chdir(r'C:UsersLXDesktop')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.运行结果附上


三、总结

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


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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。